95
100
* but gl vs dx9 clip spaces.
97
102
draw_pt_post_vs_prepare( fpme->post_vs,
98
(boolean)draw->bypass_clipping,
99
(boolean)draw->identity_viewport,
106
draw->identity_viewport,
100
107
(boolean)draw->rasterizer->gl_rasterization_rules,
101
(draw->vs.edgeflag_output ? true : false) );
108
(draw->vs.edgeflag_output ? TRUE : FALSE) );
110
draw_pt_so_emit_prepare( fpme->so_emit );
103
112
if (!(opt & PT_PIPELINE)) {
104
draw_pt_emit_prepare( fpme->emit,
113
draw_pt_emit_prepare( fpme->emit,
108
*max_vertices = MAX2( *max_vertices,
109
DRAW_PIPE_MAX_VERTICES );
117
*max_vertices = MAX2( *max_vertices, 4096 );
112
*max_vertices = DRAW_PIPE_MAX_VERTICES;
120
/* limit max fetches by limiting max_vertices */
121
*max_vertices = 4096;
115
/* return even number */
116
*max_vertices = *max_vertices & ~1;
118
124
/* No need to prepare the shader.
120
126
vs->prepare(vs, draw);
130
static void fetch( struct pt_fetch *fetch,
131
const struct draw_fetch_info *fetch_info,
134
if (fetch_info->linear) {
135
draw_pt_fetch_run_linear( fetch,
141
draw_pt_fetch_run( fetch,
149
static void pipeline(struct fetch_pipeline_middle_end *fpme,
150
const struct draw_vertex_info *vert_info,
151
const struct draw_prim_info *prim_info)
153
if (prim_info->linear)
154
draw_pipeline_run_linear( fpme->draw,
158
draw_pipeline_run( fpme->draw,
163
static void emit(struct pt_emit *emit,
164
const struct draw_vertex_info *vert_info,
165
const struct draw_prim_info *prim_info)
167
if (prim_info->linear) {
168
draw_pt_emit_linear(emit, vert_info, prim_info);
171
draw_pt_emit(emit, vert_info, prim_info);
176
static void draw_vertex_shader_run(struct draw_vertex_shader *vshader,
177
const void *constants[PIPE_MAX_CONSTANT_BUFFERS],
178
unsigned const_size[PIPE_MAX_CONSTANT_BUFFERS],
179
const struct draw_vertex_info *input_verts,
180
struct draw_vertex_info *output_verts )
182
output_verts->vertex_size = input_verts->vertex_size;
183
output_verts->stride = input_verts->vertex_size;
184
output_verts->count = input_verts->count;
185
output_verts->verts =
186
(struct vertex_header *)MALLOC(output_verts->vertex_size *
187
align(output_verts->count, 4));
189
vshader->run_linear(vshader,
190
(const float (*)[4])input_verts->verts->data,
191
( float (*)[4])output_verts->verts->data,
195
input_verts->vertex_size,
196
input_verts->vertex_size);
199
static void fetch_pipeline_generic( struct draw_pt_middle_end *middle,
200
const struct draw_fetch_info *fetch_info,
201
const struct draw_prim_info *prim_info )
203
struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle;
204
struct draw_context *draw = fpme->draw;
205
struct draw_vertex_shader *vshader = draw->vs.vertex_shader;
206
struct draw_geometry_shader *gshader = draw->gs.geometry_shader;
207
struct draw_prim_info gs_prim_info;
208
struct draw_vertex_info fetched_vert_info;
209
struct draw_vertex_info vs_vert_info;
210
struct draw_vertex_info gs_vert_info;
211
struct draw_vertex_info *vert_info;
212
unsigned opt = fpme->opt;
214
fetched_vert_info.count = fetch_info->count;
215
fetched_vert_info.vertex_size = fpme->vertex_size;
216
fetched_vert_info.stride = fpme->vertex_size;
217
fetched_vert_info.verts =
218
(struct vertex_header *)MALLOC(fpme->vertex_size *
219
align(fetch_info->count, 4));
220
if (!fetched_vert_info.verts) {
225
/* Fetch into our vertex buffer.
227
fetch( fpme->fetch, fetch_info, (char *)fetched_vert_info.verts );
229
/* Finished with fetch:
232
vert_info = &fetched_vert_info;
234
/* Run the shader, note that this overwrites the data[] parts of
235
* the pipeline verts.
237
if (fpme->opt & PT_SHADE) {
238
draw_vertex_shader_run(vshader,
239
draw->pt.user.vs_constants,
240
draw->pt.user.vs_constants_size,
244
FREE(vert_info->verts);
245
vert_info = &vs_vert_info;
248
if ((fpme->opt & PT_SHADE) && gshader) {
249
draw_geometry_shader_run(gshader,
250
draw->pt.user.gs_constants,
251
draw->pt.user.gs_constants_size,
257
FREE(vert_info->verts);
258
vert_info = &gs_vert_info;
259
prim_info = &gs_prim_info;
263
/* Stream output needs to be done before clipping.
265
* XXX: Stream output surely needs to respect the prim_info->elt
268
draw_pt_so_emit( fpme->so_emit,
272
if (draw_pt_post_vs_run( fpme->post_vs,
278
/* Do we need to run the pipeline?
280
if (opt & PT_PIPELINE) {
290
FREE(vert_info->verts);
125
293
static void fetch_pipeline_run( struct draw_pt_middle_end *middle,
126
294
const unsigned *fetch_elts,
127
295
unsigned fetch_count,
128
296
const ushort *draw_elts,
129
unsigned draw_count )
298
unsigned prim_flags )
131
300
struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle;
132
struct draw_context *draw = fpme->draw;
133
struct draw_vertex_shader *vshader = draw->vs.vertex_shader;
134
struct draw_geometry_shader *gshader = draw->gs.geometry_shader;
135
unsigned opt = fpme->opt;
136
unsigned alloc_count = align( fetch_count, 4 );
138
struct vertex_header *pipeline_verts =
139
(struct vertex_header *)MALLOC(fpme->vertex_size * alloc_count);
141
if (!pipeline_verts) {
142
/* Not much we can do here - just skip the rendering.
148
/* Fetch into our vertex buffer
150
draw_pt_fetch_run( fpme->fetch,
153
(char *)pipeline_verts );
155
/* Run the shader, note that this overwrites the data[] parts of
156
* the pipeline verts.
160
vshader->run_linear(vshader,
161
(const float (*)[4])pipeline_verts->data,
162
( float (*)[4])pipeline_verts->data,
163
draw->pt.user.vs_constants,
168
draw_geometry_shader_run(gshader,
169
(const float (*)[4])pipeline_verts->data,
170
( float (*)[4])pipeline_verts->data,
171
draw->pt.user.gs_constants,
177
if (draw_pt_post_vs_run( fpme->post_vs,
185
/* Do we need to run the pipeline?
187
if (opt & PT_PIPELINE) {
188
draw_pipeline_run( fpme->draw,
197
draw_pt_emit( fpme->emit,
198
(const float (*)[4])pipeline_verts->data,
206
FREE(pipeline_verts);
301
struct draw_fetch_info fetch_info;
302
struct draw_prim_info prim_info;
304
fetch_info.linear = FALSE;
305
fetch_info.start = 0;
306
fetch_info.elts = fetch_elts;
307
fetch_info.count = fetch_count;
309
prim_info.linear = FALSE;
311
prim_info.count = draw_count;
312
prim_info.elts = draw_elts;
313
prim_info.prim = fpme->input_prim;
314
prim_info.flags = prim_flags;
315
prim_info.primitive_count = 1;
316
prim_info.primitive_lengths = &draw_count;
318
fetch_pipeline_generic( middle, &fetch_info, &prim_info );
210
322
static void fetch_pipeline_linear_run( struct draw_pt_middle_end *middle,
214
327
struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle;
215
struct draw_context *draw = fpme->draw;
216
struct draw_vertex_shader *shader = draw->vs.vertex_shader;
217
struct draw_geometry_shader *geometry_shader = draw->gs.geometry_shader;
218
unsigned opt = fpme->opt;
219
unsigned alloc_count = align( count, 4 );
221
struct vertex_header *pipeline_verts =
222
(struct vertex_header *)MALLOC(fpme->vertex_size * alloc_count);
224
if (!pipeline_verts) {
225
/* Not much we can do here - just skip the rendering.
231
/* Fetch into our vertex buffer
233
draw_pt_fetch_run_linear( fpme->fetch,
236
(char *)pipeline_verts );
238
/* Run the shader, note that this overwrites the data[] parts of
239
* the pipeline verts.
243
shader->run_linear(shader,
244
(const float (*)[4])pipeline_verts->data,
245
( float (*)[4])pipeline_verts->data,
246
draw->pt.user.vs_constants,
252
draw_geometry_shader_run(geometry_shader,
253
(const float (*)[4])pipeline_verts->data,
254
( float (*)[4])pipeline_verts->data,
255
draw->pt.user.gs_constants,
261
if (draw_pt_post_vs_run( fpme->post_vs,
269
/* Do we need to run the pipeline?
271
if (opt & PT_PIPELINE) {
272
draw_pipeline_run_linear( fpme->draw,
279
draw_pt_emit_linear( fpme->emit,
280
(const float (*)[4])pipeline_verts->data,
285
FREE(pipeline_verts);
328
struct draw_fetch_info fetch_info;
329
struct draw_prim_info prim_info;
331
fetch_info.linear = TRUE;
332
fetch_info.start = start;
333
fetch_info.count = count;
334
fetch_info.elts = NULL;
336
prim_info.linear = TRUE;
338
prim_info.count = count;
339
prim_info.elts = NULL;
340
prim_info.prim = fpme->input_prim;
341
prim_info.flags = prim_flags;
342
prim_info.primitive_count = 1;
343
prim_info.primitive_lengths = &count;
345
fetch_pipeline_generic( middle, &fetch_info, &prim_info );
290
350
static boolean fetch_pipeline_linear_run_elts( struct draw_pt_middle_end *middle,
293
const ushort *draw_elts,
294
unsigned draw_count )
353
const ushort *draw_elts,
355
unsigned prim_flags )
296
357
struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle;
297
struct draw_context *draw = fpme->draw;
298
struct draw_vertex_shader *shader = draw->vs.vertex_shader;
299
struct draw_geometry_shader *geometry_shader = draw->gs.geometry_shader;
300
unsigned opt = fpme->opt;
301
unsigned alloc_count = align( count, 4 );
303
struct vertex_header *pipeline_verts =
304
(struct vertex_header *)MALLOC(fpme->vertex_size * alloc_count);
309
/* Fetch into our vertex buffer
311
draw_pt_fetch_run_linear( fpme->fetch,
314
(char *)pipeline_verts );
316
/* Run the shader, note that this overwrites the data[] parts of
317
* the pipeline verts.
321
shader->run_linear(shader,
322
(const float (*)[4])pipeline_verts->data,
323
( float (*)[4])pipeline_verts->data,
324
draw->pt.user.vs_constants,
330
draw_geometry_shader_run(geometry_shader,
331
(const float (*)[4])pipeline_verts->data,
332
( float (*)[4])pipeline_verts->data,
333
draw->pt.user.gs_constants,
339
if (draw_pt_post_vs_run( fpme->post_vs,
347
/* Do we need to run the pipeline?
349
if (opt & PT_PIPELINE) {
350
draw_pipeline_run( fpme->draw,
359
draw_pt_emit( fpme->emit,
360
(const float (*)[4])pipeline_verts->data,
367
FREE(pipeline_verts);
358
struct draw_fetch_info fetch_info;
359
struct draw_prim_info prim_info;
361
fetch_info.linear = TRUE;
362
fetch_info.start = start;
363
fetch_info.count = count;
364
fetch_info.elts = NULL;
366
prim_info.linear = FALSE;
368
prim_info.count = draw_count;
369
prim_info.elts = draw_elts;
370
prim_info.prim = fpme->input_prim;
371
prim_info.flags = prim_flags;
372
prim_info.primitive_count = 1;
373
prim_info.primitive_lengths = &draw_count;
375
fetch_pipeline_generic( middle, &fetch_info, &prim_info );