1
/**************************************************************************
3
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the
8
* "Software"), to deal in the Software without restriction, including
9
* without limitation the rights to use, copy, modify, merge, publish,
10
* distribute, sub license, and/or sell copies of the Software, and to
11
* permit persons to whom the Software is furnished to do so, subject to
12
* the following conditions:
14
* The above copyright notice and this permission notice (including the
15
* next paragraph) shall be included in all copies or substantial portions
18
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26
**************************************************************************/
29
#include "util/u_memory.h"
30
#include "util/u_inlines.h"
31
#include "cell_context.h"
32
#include "cell_batch.h"
33
#include "cell_fence.h"
34
#include "cell_texture.h"
38
cell_fence_init(struct cell_fence *fence)
41
ASSERT_ALIGN16(fence->status);
42
for (i = 0; i < CELL_MAX_SPUS; i++) {
43
fence->status[i][0] = CELL_FENCE_IDLE;
49
cell_fence_signalled(const struct cell_context *cell,
50
const struct cell_fence *fence)
53
for (i = 0; i < cell->num_spus; i++) {
54
if (fence->status[i][0] != CELL_FENCE_SIGNALLED)
56
/*assert(fence->status[i][0] == CELL_FENCE_EMITTED);*/
63
cell_fence_finish(const struct cell_context *cell,
64
const struct cell_fence *fence,
67
while (!cell_fence_signalled(cell, fence)) {
74
for (i = 0; i < cell->num_spus; i++) {
75
assert(fence->status[i][0] == CELL_FENCE_SIGNALLED);
85
struct cell_buffer_node
87
struct pipe_resource *buffer;
88
struct cell_buffer_node *next;
94
cell_add_buffer_to_list(struct cell_context *cell,
95
struct cell_buffer_list *list,
96
struct pipe_resource *buffer)
98
struct cell_buffer_node *node = CALLOC_STRUCT(cell_buffer_node);
99
/* create new list node which references the buffer, insert at head */
101
pipe_resource_reference(&node->buffer, buffer);
102
node->next = list->head;
110
* Wait for completion of the given fence, then unreference any buffers
112
* This typically unrefs/frees texture buffers after any rendering which uses
113
* them has completed.
116
cell_free_fenced_buffers(struct cell_context *cell,
117
struct cell_buffer_list *list)
120
/*struct pipe_screen *ps = cell->pipe.screen;*/
121
struct cell_buffer_node *node;
123
cell_fence_finish(cell, &list->fence);
125
/* traverse the list, unreferencing buffers, freeing nodes */
128
struct cell_buffer_node *next = node->next;
129
assert(node->buffer);
130
/* XXX need this? pipe_buffer_unmap(ps, node->buffer);*/
132
printf("Unref buffer %p\n", node->buffer);
133
if (node->buffer->reference.count == 1)
134
printf(" Delete!\n");
136
pipe_resource_reference(&node->buffer, NULL);
146
* This should be called for each render command.
147
* Any texture buffers that are current bound will be added to a fenced
148
* list to be freed later when the fence is executed/signalled.
151
cell_add_fenced_textures(struct cell_context *cell)
153
/*struct cell_buffer_list *list = &cell->fenced_buffers[cell->cur_batch];*/
156
for (i = 0; i < cell->num_textures; i++) {
157
struct cell_resource *ct = cell->texture[i];
160
printf("Adding texture %p buffer %p to list\n",
161
ct, ct->tiled_buffer[level]);
164
/* XXX this needs to be fixed/restored!
165
* Maybe keep pointers to textures, not buffers.
168
cell_add_buffer_to_list(cell, list, ct->buffer);