cell: allocate batch buffers w/ 16-byte alignment
[mesa.git] / src / gallium / drivers / cell / common.h
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 * Types and tokens which are common to the SPU and PPU code.
30 */
31
32
33 #ifndef CELL_COMMON_H
34 #define CELL_COMMON_H
35
36 #include "pipe/p_compiler.h"
37 #include "pipe/p_format.h"
38 #include "pipe/p_state.h"
39
40
41 /** The standard assert macro doesn't seem to work reliably */
42 #define ASSERT(x) \
43 if (!(x)) { \
44 ubyte *p = NULL; \
45 fprintf(stderr, "%s:%d: %s(): assertion %s failed.\n", \
46 __FILE__, __LINE__, __FUNCTION__, #x); \
47 *p = 0; \
48 exit(1); \
49 }
50
51
52
53 #define JOIN(x, y) JOIN_AGAIN(x, y)
54 #define JOIN_AGAIN(x, y) x ## y
55
56 #define STATIC_ASSERT(e) \
57 {typedef char JOIN(assertion_failed_at_line_, __LINE__) [(e) ? 1 : -1];}
58
59
60
61 /** for sanity checking */
62 #define ASSERT_ALIGN16(ptr) \
63 ASSERT((((unsigned long) (ptr)) & 0xf) == 0);
64
65
66 /** round up value to next multiple of 4 */
67 #define ROUNDUP4(k) (((k) + 0x3) & ~0x3)
68
69 /** round up value to next multiple of 8 */
70 #define ROUNDUP8(k) (((k) + 0x7) & ~0x7)
71
72 /** round up value to next multiple of 16 */
73 #define ROUNDUP16(k) (((k) + 0xf) & ~0xf)
74
75
76 #define CELL_MAX_SPUS 8
77
78 #define CELL_MAX_SAMPLERS 4
79 #define CELL_MAX_TEXTURE_LEVELS 12 /* 2k x 2k */
80 #define CELL_MAX_CONSTANTS 32 /**< number of float[4] constants */
81 #define CELL_MAX_WIDTH 1024 /**< max framebuffer width */
82 #define CELL_MAX_HEIGHT 1024 /**< max framebuffer width */
83
84 #define TILE_SIZE 32
85
86
87 /**
88 * The low byte of a mailbox word contains the command opcode.
89 * Remaining higher bytes are command specific.
90 */
91 #define CELL_CMD_OPCODE_MASK 0xff
92
93 #define CELL_CMD_EXIT 1
94 #define CELL_CMD_CLEAR_SURFACE 2
95 #define CELL_CMD_FINISH 3
96 #define CELL_CMD_RENDER 4
97 #define CELL_CMD_BATCH 5
98 #define CELL_CMD_RELEASE_VERTS 6
99 #define CELL_CMD_STATE_FRAMEBUFFER 10
100 #define CELL_CMD_STATE_FRAGMENT_OPS 11
101 #define CELL_CMD_STATE_SAMPLER 12
102 #define CELL_CMD_STATE_TEXTURE 13
103 #define CELL_CMD_STATE_VERTEX_INFO 14
104 #define CELL_CMD_STATE_VIEWPORT 15
105 #define CELL_CMD_STATE_UNIFORMS 16
106 #define CELL_CMD_STATE_VS_ARRAY_INFO 17
107 #define CELL_CMD_STATE_BIND_VS 18
108 #define CELL_CMD_STATE_FRAGMENT_PROGRAM 19
109 #define CELL_CMD_STATE_ATTRIB_FETCH 20
110 #define CELL_CMD_STATE_FS_CONSTANTS 21
111 #define CELL_CMD_STATE_RASTERIZER 22
112 #define CELL_CMD_VS_EXECUTE 23
113 #define CELL_CMD_FLUSH_BUFFER_RANGE 24
114 #define CELL_CMD_FENCE 25
115
116
117 /** Command/batch buffers */
118 #define CELL_NUM_BUFFERS 4
119 #define CELL_BUFFER_SIZE (4*1024) /**< 16KB would be the max */
120
121 #define CELL_BUFFER_STATUS_FREE 10
122 #define CELL_BUFFER_STATUS_USED 20
123
124 /** Debug flags */
125 #define CELL_DEBUG_CHECKER (1 << 0)
126 #define CELL_DEBUG_ASM (1 << 1)
127 #define CELL_DEBUG_SYNC (1 << 2)
128 #define CELL_DEBUG_FRAGMENT_OPS (1 << 3)
129 #define CELL_DEBUG_FRAGMENT_OP_FALLBACK (1 << 4)
130 #define CELL_DEBUG_CMD (1 << 5)
131 #define CELL_DEBUG_CACHE (1 << 6)
132
133 #define CELL_FENCE_IDLE 0
134 #define CELL_FENCE_EMITTED 1
135 #define CELL_FENCE_SIGNALLED 2
136
137 #define CELL_FACING_FRONT 0
138 #define CELL_FACING_BACK 1
139
140 struct cell_fence
141 {
142 /** There's a 16-byte status qword per SPU */
143 volatile uint status[CELL_MAX_SPUS][4];
144 };
145
146 #ifdef __SPU__
147 typedef vector unsigned int opcode_t;
148 #else
149 typedef unsigned int opcode_t[4];
150 #endif
151
152 /**
153 * Fence command sent to SPUs. In response, the SPUs will write
154 * CELL_FENCE_STATUS_SIGNALLED back to the fence status word in main memory.
155 */
156 struct cell_command_fence
157 {
158 opcode_t opcode; /**< CELL_CMD_FENCE */
159 struct cell_fence *fence;
160 uint32_t pad_[3];
161 };
162
163
164 /**
165 * Command to specify per-fragment operations state and generated code.
166 * Note that this is a variant-length structure, allocated with as
167 * much memory as needed to hold the generated code; the "code"
168 * field *must* be the last field in the structure. Also, the entire
169 * length of the structure (including the variant code field) must be
170 * a multiple of 8 bytes; we require that this structure itself be
171 * a multiple of 8 bytes, and that the generated code also be a multiple
172 * of 8 bytes.
173 *
174 * Also note that the dsa, blend, blend_color fields are really only needed
175 * for the fallback/C per-pixel code. They're not used when we generate
176 * dynamic SPU fragment code (which is the normal case), and will eventually
177 * be removed from this structure.
178 */
179 struct cell_command_fragment_ops
180 {
181 opcode_t opcode; /**< CELL_CMD_STATE_FRAGMENT_OPS */
182
183 /* Fields for the fallback case */
184 struct pipe_depth_stencil_alpha_state dsa;
185 struct pipe_blend_state blend;
186 struct pipe_blend_color blend_color;
187
188 /* Fields for the generated SPU code */
189 unsigned total_code_size;
190 unsigned front_code_index;
191 unsigned back_code_index;
192 /* this field has variant length, and must be the last field in
193 * the structure
194 */
195 unsigned code[0];
196 };
197
198
199 /** Max instructions for fragment programs */
200 #define SPU_MAX_FRAGMENT_PROGRAM_INSTS 512
201
202 /**
203 * Command to send a fragment program to SPUs.
204 */
205 struct cell_command_fragment_program
206 {
207 opcode_t opcode; /**< CELL_CMD_STATE_FRAGMENT_PROGRAM */
208 uint num_inst; /**< Number of instructions */
209 uint32_t pad[3];
210 unsigned code[SPU_MAX_FRAGMENT_PROGRAM_INSTS];
211 };
212
213
214 /**
215 * Tell SPUs about the framebuffer size, location
216 */
217 struct cell_command_framebuffer
218 {
219 opcode_t opcode; /**< CELL_CMD_STATE_FRAMEBUFFER */
220 int width, height;
221 void *color_start, *depth_start;
222 enum pipe_format color_format, depth_format;
223 uint32_t pad_[2];
224 };
225
226
227 /**
228 * Tell SPUs about rasterizer state.
229 */
230 struct cell_command_rasterizer
231 {
232 opcode_t opcode; /**< CELL_CMD_STATE_RASTERIZER */
233 struct pipe_rasterizer_state rasterizer;
234 };
235
236
237 /**
238 * Clear framebuffer to the given value/color.
239 */
240 struct cell_command_clear_surface
241 {
242 opcode_t opcode; /**< CELL_CMD_CLEAR_SURFACE */
243 uint surface; /**< Temporary: 0=color, 1=Z */
244 uint value;
245 uint32_t pad[2];
246 };
247
248
249 /**
250 * Array info used by the vertex shader's vertex puller.
251 */
252 struct cell_array_info
253 {
254 uint64_t base; /**< Base address of the 0th element. */
255 uint attr; /**< Attribute that this state is for. */
256 uint pitch; /**< Byte pitch from one entry to the next. */
257 uint size;
258 uint function_offset;
259 };
260
261
262 struct cell_attribute_fetch_code
263 {
264 uint64_t base;
265 uint size;
266 };
267
268
269 struct cell_buffer_range
270 {
271 uint64_t base;
272 unsigned size;
273 };
274
275
276 struct cell_shader_info
277 {
278 uint64_t declarations;
279 uint64_t instructions;
280 uint64_t immediates;
281
282 unsigned num_outputs;
283 unsigned num_declarations;
284 unsigned num_instructions;
285 unsigned num_immediates;
286 };
287
288
289 #define SPU_VERTS_PER_BATCH 64
290 struct cell_command_vs
291 {
292 opcode_t opcode; /**< CELL_CMD_VS_EXECUTE */
293 uint64_t vOut[SPU_VERTS_PER_BATCH];
294 unsigned num_elts;
295 unsigned elts[SPU_VERTS_PER_BATCH];
296 float plane[12][4];
297 unsigned nr_planes;
298 unsigned nr_attrs;
299 };
300
301
302 struct cell_command_render
303 {
304 opcode_t opcode; /**< CELL_CMD_RENDER */
305 uint prim_type; /**< PIPE_PRIM_x */
306 uint num_verts;
307 uint vertex_size; /**< bytes per vertex */
308 uint num_indexes;
309 uint vertex_buf; /**< which cell->buffer[] contains the vertex data */
310 float xmin, ymin, xmax, ymax; /* XXX another dummy field */
311 uint min_index;
312 boolean inline_verts;
313 uint32_t pad_[1];
314 };
315
316
317 struct cell_command_release_verts
318 {
319 opcode_t opcode; /**< CELL_CMD_RELEASE_VERTS */
320 uint vertex_buf; /**< in [0, CELL_NUM_BUFFERS-1] */
321 uint32_t pad_[3];
322 };
323
324
325 struct cell_command_sampler
326 {
327 opcode_t opcode; /**< CELL_CMD_STATE_SAMPLER */
328 uint unit;
329 struct pipe_sampler_state state;
330 uint32_t pad_[1];
331 };
332
333
334 struct cell_command_texture
335 {
336 opcode_t opcode; /**< CELL_CMD_STATE_TEXTURE */
337 uint target; /**< PIPE_TEXTURE_x */
338 uint unit;
339 void *start[CELL_MAX_TEXTURE_LEVELS]; /**< Address in main memory */
340 ushort width[CELL_MAX_TEXTURE_LEVELS];
341 ushort height[CELL_MAX_TEXTURE_LEVELS];
342 ushort depth[CELL_MAX_TEXTURE_LEVELS];
343 };
344
345
346 #define MAX_SPU_FUNCTIONS 12
347 /**
348 * Used to tell the PPU about the address of particular functions in the
349 * SPU's address space.
350 */
351 struct cell_spu_function_info
352 {
353 uint num;
354 char names[MAX_SPU_FUNCTIONS][16];
355 uint addrs[MAX_SPU_FUNCTIONS];
356 char pad[12]; /**< Pad struct to multiple of 16 bytes (256 currently) */
357 };
358
359
360 /** This is the object passed to spe_create_thread() */
361 struct cell_init_info
362 {
363 unsigned id;
364 unsigned num_spus;
365 unsigned debug_flags; /**< mask of CELL_DEBUG_x flags */
366 float inv_timebase; /**< 1.0/timebase, for perf measurement */
367
368 /** Buffers for command batches, vertex/index data */
369 ubyte *buffers[CELL_NUM_BUFFERS];
370 uint *buffer_status; /**< points at cell_context->buffer_status */
371
372 struct cell_spu_function_info *spu_functions;
373 } ALIGN16_ATTRIB;
374
375
376 #endif /* CELL_COMMON_H */