gallium: remove flags from the flush function
[mesa.git] / src / gallium / drivers / cell / ppu / cell_flush.c
1 /**************************************************************************
2 *
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4 * All Rights Reserved.
5 *
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:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
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.
25 *
26 **************************************************************************/
27
28
29 #include "cell_context.h"
30 #include "cell_batch.h"
31 #include "cell_flush.h"
32 #include "cell_spu.h"
33 #include "cell_render.h"
34 #include "draw/draw_context.h"
35
36
37 /**
38 * Called via pipe->flush()
39 */
40 void
41 cell_flush(struct pipe_context *pipe,
42 struct pipe_fence_handle **fence)
43 {
44 struct cell_context *cell = cell_context(pipe);
45
46 if (fence) {
47 *fence = NULL;
48 }
49
50 flags |= CELL_FLUSH_WAIT;
51
52 draw_flush( cell->draw );
53 cell_flush_int(cell, flags);
54 }
55
56
57 /**
58 * Cell internal flush function. Send the current batch buffer to all SPUs.
59 * If flags & CELL_FLUSH_WAIT, do not return until the SPUs are idle.
60 * \param flags bitmask of flags CELL_FLUSH_WAIT, or zero
61 */
62 void
63 cell_flush_int(struct cell_context *cell, unsigned flags)
64 {
65 static boolean flushing = FALSE; /* recursion catcher */
66 uint i;
67
68 ASSERT(!flushing);
69 flushing = TRUE;
70
71 if (flags & CELL_FLUSH_WAIT) {
72 STATIC_ASSERT(sizeof(opcode_t) % 16 == 0);
73 opcode_t *cmd = (opcode_t*) cell_batch_alloc16(cell, sizeof(opcode_t));
74 *cmd[0] = CELL_CMD_FINISH;
75 }
76
77 cell_batch_flush(cell);
78
79 #if 0
80 /* Send CMD_FINISH to all SPUs */
81 for (i = 0; i < cell->num_spus; i++) {
82 send_mbox_message(cell_global.spe_contexts[i], CELL_CMD_FINISH);
83 }
84 #endif
85
86 if (flags & CELL_FLUSH_WAIT) {
87 /* Wait for ack */
88 for (i = 0; i < cell->num_spus; i++) {
89 uint k = wait_mbox_message(cell_global.spe_contexts[i]);
90 assert(k == CELL_CMD_FINISH);
91 }
92 }
93
94 flushing = FALSE;
95 }
96
97
98 void
99 cell_flush_buffer_range(struct cell_context *cell, void *ptr,
100 unsigned size)
101 {
102 STATIC_ASSERT((sizeof(opcode_t) + sizeof(struct cell_buffer_range)) % 16 == 0);
103 uint32_t *batch = (uint32_t*)cell_batch_alloc16(cell,
104 sizeof(opcode_t) + sizeof(struct cell_buffer_range));
105 struct cell_buffer_range *br = (struct cell_buffer_range *) &batch[4];
106 batch[0] = CELL_CMD_FLUSH_BUFFER_RANGE;
107 br->base = (uintptr_t) ptr;
108 br->size = size;
109 }