Lines Matching refs:draw

33 #include "draw/draw_context.h"
34 #include "draw/draw_gs.h"
35 #include "draw/draw_private.h"
36 #include "draw/draw_pt.h"
37 #include "draw/draw_vs.h"
55 draw_pt_arrays(struct draw_context *draw,
74 if (!draw->force_passthrough) {
75 unsigned gs_out_prim = (draw->gs.geometry_shader ?
76 draw->gs.geometry_shader->output_primitive :
79 if (!draw->render) {
83 if (draw_need_pipeline(draw,
84 draw->rasterizer,
89 if ((draw->clip_xy ||
90 draw->clip_z ||
91 draw->clip_user) && !draw->pt.test_fse) {
98 if (draw->pt.middle.llvm) {
99 middle = draw->pt.middle.llvm;
102 middle = draw->pt.middle.fetch_emit;
103 else if (opt == PT_SHADE && !draw->pt.no_fse)
104 middle = draw->pt.middle.fetch_shade_emit;
106 middle = draw->pt.middle.general;
109 frontend = draw->pt.frontend;
112 if (draw->pt.prim != prim || draw->pt.opt != opt) {
118 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
120 } else if (draw->pt.eltSize != draw->pt.user.eltSize) {
121 /* Flush draw state if eltSize changed.
132 frontend = draw->pt.front.vsplit;
136 draw->pt.frontend = frontend;
137 draw->pt.eltSize = draw->pt.user.eltSize;
138 draw->pt.prim = prim;
139 draw->pt.opt = opt;
147 void draw_pt_flush( struct draw_context *draw, unsigned flags )
149 if (draw->pt.frontend) {
150 draw->pt.frontend->flush( draw->pt.frontend, flags );
154 draw->pt.frontend = NULL;
160 boolean draw_pt_init( struct draw_context *draw )
162 draw->pt.test_fse = debug_get_option_draw_fse();
163 draw->pt.no_fse = debug_get_option_draw_no_fse();
165 draw->pt.front.vsplit = draw_pt_vsplit(draw);
166 if (!draw->pt.front.vsplit)
169 draw->pt.middle.fetch_emit = draw_pt_fetch_emit( draw );
170 if (!draw->pt.middle.fetch_emit)
173 draw->pt.middle.fetch_shade_emit = draw_pt_middle_fse( draw );
174 if (!draw->pt.middle.fetch_shade_emit)
177 draw->pt.middle.general = draw_pt_fetch_pipeline_or_emit( draw );
178 if (!draw->pt.middle.general)
182 if (draw->llvm)
183 draw->pt.middle.llvm = draw_pt_fetch_pipeline_or_emit_llvm( draw );
190 void draw_pt_destroy( struct draw_context *draw )
192 if (draw->pt.middle.llvm) {
193 draw->pt.middle.llvm->destroy( draw->pt.middle.llvm );
194 draw->pt.middle.llvm = NULL;
197 if (draw->pt.middle.general) {
198 draw->pt.middle.general->destroy( draw->pt.middle.general );
199 draw->pt.middle.general = NULL;
202 if (draw->pt.middle.fetch_emit) {
203 draw->pt.middle.fetch_emit->destroy( draw->pt.middle.fetch_emit );
204 draw->pt.middle.fetch_emit = NULL;
207 if (draw->pt.middle.fetch_shade_emit) {
208 draw->pt.middle.fetch_shade_emit->destroy( draw->pt.middle.fetch_shade_emit );
209 draw->pt.middle.fetch_shade_emit = NULL;
212 if (draw->pt.front.vsplit) {
213 draw->pt.front.vsplit->destroy( draw->pt.front.vsplit );
214 draw->pt.front.vsplit = NULL;
223 draw_print_arrays(struct draw_context *draw, uint prim, int start, uint count)
234 if (draw->pt.user.eltSize) {
237 switch (draw->pt.user.eltSize) {
240 const ubyte *elem = (const ubyte *) draw->pt.user.elts;
246 const ushort *elem = (const ushort *) draw->pt.user.elts;
252 const uint *elem = (const uint *) draw->pt.user.elts;
260 ii += draw->pt.user.eltBias;
262 draw->pt.user.eltBias, ii);
270 for (j = 0; j < draw->pt.nr_vertex_elements; j++) {
271 uint buf = draw->pt.vertex_element[j].vertex_buffer_index;
272 ubyte *ptr = (ubyte *) draw->pt.user.vbuffer[buf];
274 if (draw->pt.vertex_element[j].instance_divisor) {
275 ii = draw->instance_id / draw->pt.vertex_element[j].instance_divisor;
278 ptr += draw->pt.vertex_buffer[buf].buffer_offset;
279 ptr += draw->pt.vertex_buffer[buf].stride * ii;
280 ptr += draw->pt.vertex_element[j].src_offset;
283 switch (draw->pt.vertex_element[j].src_format) {
318 util_format_name(draw->pt.vertex_element[j].src_format));
331 /* draw elts up to prev pos */ \
332 draw_pt_arrays(draw, prim, cur_start, cur_count); \
343 draw_pt_arrays(draw, prim, cur_start, cur_count); \
350 * Scan for restart indexes and draw the runs of elements/vertices between
354 draw_pt_arrays_restart(struct draw_context *draw,
365 if (draw->pt.user.eltSize) {
370 switch (draw->pt.user.eltSize) {
373 const ubyte *elt_ub = (const ubyte *) draw->pt.user.elts;
379 const ushort *elt_us = (const ushort *) draw->pt.user.elts;
385 const uint *elt_ui = (const uint *) draw->pt.user.elts;
397 draw_pt_arrays(draw, prim, start, count);
408 draw_arrays(struct draw_context *draw, unsigned prim,
411 draw_arrays_instanced(draw, prim, start, count, 0, 1);
420 draw_arrays_instanced(struct draw_context *draw,
439 draw_vbo(draw, &info);
451 draw_vbo(struct draw_context *draw,
459 assert(draw->pt.user.elts);
461 draw->pt.user.eltBias = info->index_bias;
462 draw->pt.user.min_index = info->min_index;
463 draw->pt.user.max_index = info->max_index;
464 draw->pt.user.eltSize = info->indexed ? draw->pt.user.eltSizeIB : 0;
471 tgsi_dump(draw->vs.vertex_shader->state.tokens, 0);
476 for (i = 0; i < draw->pt.nr_vertex_elements; i++) {
479 draw->pt.vertex_element[i].src_offset,
480 draw->pt.vertex_element[i].instance_divisor,
481 draw->pt.vertex_element[i].vertex_buffer_index,
482 util_format_name(draw->pt.vertex_element[i].src_format));
485 for (i = 0; i < draw->pt.nr_vertex_buffers; i++) {
488 draw->pt.vertex_buffer[i].stride,
489 draw->pt.vertex_buffer[i].buffer_offset,
490 draw->pt.user.vbuffer[i]);
495 draw_print_arrays(draw, info->mode, info->start, MIN2(info->count, 20));
497 index_limit = util_draw_max_index(draw->pt.vertex_buffer,
498 draw->pt.vertex_element,
499 draw->pt.nr_vertex_elements,
504 debug_warning("draw: VBO too small to draw anything\n");
508 draw->pt.max_index = index_limit - 1;
512 * TODO: We could use draw->pt.max_index to further narrow
517 draw->instance_id = instance + info->start_instance;
520 draw_pt_arrays_restart(draw, info);
523 draw_pt_arrays(draw, info->mode, info->start, info->count);