Lines Matching refs:draw

33 #include "draw/draw_context.h"
34 #include "draw/draw_gs.h"
35 #include "draw/draw_tess.h"
36 #include "draw/draw_private.h"
37 #include "draw/draw_pt.h"
38 #include "draw/draw_vbuf.h"
39 #include "draw/draw_vs.h"
58 draw_pt_arrays(struct draw_context *draw,
69 if (draw->gs.geometry_shader)
70 out_prim = draw->gs.geometry_shader->output_primitive;
71 else if (draw->tes.tess_eval_shader)
72 out_prim = get_tes_output_prim(draw->tes.tess_eval_shader);
74 if (!draw->render) {
78 if (draw_need_pipeline(draw,
79 draw->rasterizer,
84 if ((draw->clip_xy ||
85 draw->clip_z ||
86 draw->clip_user) && !draw->pt.test_fse) {
90 if (draw->pt.middle.llvm) {
91 middle = draw->pt.middle.llvm;
93 if (opt == PT_SHADE && !draw->pt.no_fse)
94 middle = draw->pt.middle.fetch_shade_emit;
96 middle = draw->pt.middle.general;
99 frontend = draw->pt.frontend;
102 if (draw->pt.prim != prim || draw->pt.opt != opt) {
108 draw_do_flush(draw, DRAW_FLUSH_STATE_CHANGE);
110 } else if (draw->pt.eltSize != draw->pt.user.eltSize) {
111 /* Flush draw state if eltSize changed.
122 frontend = draw->pt.front.vsplit;
126 draw->pt.frontend = frontend;
127 draw->pt.eltSize = draw->pt.user.eltSize;
128 draw->pt.prim = prim;
129 draw->pt.opt = opt;
132 if (draw->pt.rebind_parameters) {
135 draw->pt.rebind_parameters = FALSE;
145 first = draw->pt.vertices_per_patch;
146 incr = draw->pt.vertices_per_patch;
150 draw->pt.user.eltBias = draw->pt.user.eltSize ?
156 if (num_draws > 1 && draw->pt.user.increment_draw_id)
157 draw->pt.user.drawid++;
165 draw_pt_flush(struct draw_context *draw, unsigned flags)
169 if (draw->pt.frontend) {
170 draw->pt.frontend->flush(draw->pt.frontend, flags);
174 draw->pt.frontend = NULL;
178 draw->pt.rebind_parameters = TRUE;
184 draw_pt_init(struct draw_context *draw)
186 draw->pt.test_fse = debug_get_option_draw_fse();
187 draw->pt.no_fse = debug_get_option_draw_no_fse();
189 draw->pt.front.vsplit = draw_pt_vsplit(draw);
190 if (!draw->pt.front.vsplit)
193 draw->pt.middle.fetch_shade_emit = draw_pt_middle_fse(draw);
194 if (!draw->pt.middle.fetch_shade_emit)
197 draw->pt.middle.general = draw_pt_fetch_pipeline_or_emit(draw);
198 if (!draw->pt.middle.general)
202 if (draw->llvm)
203 draw->pt.middle.llvm = draw_pt_fetch_pipeline_or_emit_llvm(draw);
211 draw_pt_destroy(struct draw_context *draw)
213 if (draw->pt.middle.llvm) {
214 draw->pt.middle.llvm->destroy(draw->pt.middle.llvm);
215 draw->pt.middle.llvm = NULL;
218 if (draw->pt.middle.general) {
219 draw->pt.middle.general->destroy(draw->pt.middle.general);
220 draw->pt.middle.general = NULL;
223 if (draw->pt.middle.fetch_shade_emit) {
224 draw->pt.middle.fetch_shade_emit->destroy(draw->pt.middle.fetch_shade_emit);
225 draw->pt.middle.fetch_shade_emit = NULL;
228 if (draw->pt.front.vsplit) {
229 draw->pt.front.vsplit->destroy(draw->pt.front.vsplit);
230 draw->pt.front.vsplit = NULL;
239 draw_print_arrays(struct draw_context *draw, enum pipe_prim_type prim,
248 if (draw->pt.user.eltSize) {
251 switch (draw->pt.user.eltSize) {
254 const ubyte *elem = (const ubyte *) draw->pt.user.elts;
260 const ushort *elem = (const ushort *) draw->pt.user.elts;
266 const uint *elem = (const uint *) draw->pt.user.elts;
284 for (unsigned j = 0; j < draw->pt.nr_vertex_elements; j++) {
285 uint buf = draw->pt.vertex_element[j].vertex_buffer_index;
286 ubyte *ptr = (ubyte *) draw->pt.user.vbuffer[buf].map;
288 if (draw->pt.vertex_element[j].instance_divisor) {
289 ii = draw->instance_id / draw->pt.vertex_element[j].instance_divisor;
292 ptr += draw->pt.vertex_buffer[buf].buffer_offset;
293 ptr += draw->pt.vertex_buffer[buf].stride * ii;
294 ptr += draw->pt.vertex_element[j].src_offset;
297 switch (draw->pt.vertex_element[j].src_format) {
339 util_format_name(draw->pt.vertex_element[j].src_format));
348 prim_restart_loop(struct draw_context *draw,
353 const unsigned elt_max = draw->pt.user.eltMax;
364 switch (draw->pt.user.eltSize) {
380 /* draw elts up to prev pos */
381 draw_pt_arrays(draw, info->mode, info->index_bias_varies, &cur, 1);
392 draw_pt_arrays(draw, info->mode, info->index_bias_varies, &cur, 1);
398 * Scan for restart indexes and draw the runs of elements/vertices between
402 draw_pt_arrays_restart(struct draw_context *draw,
411 if (draw->pt.user.eltSize) {
414 prim_restart_loop(draw, info, &draw_info[i], draw->pt.user.elts);
420 draw_pt_arrays(draw, prim, info->index_bias_varies, draw_info, num_draws);
436 struct pipe_draw_start_count_bias *draw,
440 memcpy(draw, raw_draw, sizeof(struct pipe_draw_start_count_bias));
445 draw->count = vertex_buffer->stride == 0 ? 0 :
448 /* Stream output draw can not be indexed */
450 info->max_index = draw->count - 1;
458 draw_instances(struct draw_context *draw,
464 draw->start_instance = info->start_instance;
468 draw->instance_id = instance;
471 instance_idx < draw->start_instance) {
473 draw->instance_id = 0xffffffff;
476 draw->pt.user.drawid = drawid_offset;
477 draw_new_instance(draw);
480 draw_pt_arrays_restart(draw, info, draws, num_draws);
483 draw_pt_arrays(draw, info->mode, info->index_bias_varies,
497 draw_vbo(struct draw_context *draw,
522 &resolved_draw, &(draw->pt.vertex_buffer[0]));
529 assert(draw->pt.user.elts);
530 draw->pt.user.min_index = use_info->index_bounds_valid ? use_info->min_index : 0;
531 draw->pt.user.max_index = use_info->index_bounds_valid ? use_info->max_index : ~0;
533 draw->pt.user.min_index = 0;
534 draw->pt.user.max_index = ~0;
536 draw->pt.user.eltSize = use_info->index_size ? draw->pt.user.eltSizeIB : 0;
537 draw->pt.user.drawid = drawid_offset;
538 draw->pt.user.increment_draw_id = use_info->increment_draw_id;
539 draw->pt.user.viewid = 0;
540 draw->pt.vertices_per_patch = patch_vertices;
549 tgsi_dump(draw->vs.vertex_shader->state.tokens, 0);
553 for (unsigned i = 0; i < draw->pt.nr_vertex_elements; i++) {
556 draw->pt.vertex_element[i].src_offset,
557 draw->pt.vertex_element[i].instance_divisor,
558 draw->pt.vertex_element[i].vertex_buffer_index,
559 util_format_name(draw->pt.vertex_element[i].src_format));
562 for (unsigned i = 0; i < draw->pt.nr_vertex_buffers; i++) {
565 draw->pt.vertex_buffer[i].stride,
566 draw->pt.vertex_buffer[i].buffer_offset,
567 (int) draw->pt.user.vbuffer[i].size,
568 draw->pt.user.vbuffer[i].map);
574 draw_print_arrays(draw, use_info->mode, use_draws[i].start,
581 index_limit = util_draw_max_index(draw->pt.vertex_buffer,
582 draw->pt.vertex_element,
583 draw->pt.nr_vertex_elements,
586 if (!draw->llvm)
591 debug_warning("draw: VBO too small to draw anything\n");
598 if (draw->collect_statistics) {
599 memset(&draw->statistics, 0, sizeof(draw->statistics));
602 draw->pt.max_index = index_limit - 1;
603 draw->start_index = use_draws[0].start;
606 * TODO: We could use draw->pt.max_index to further narrow
612 draw->pt.user.viewid = i;
613 draw_instances(draw, drawid_offset, use_info, use_draws, num_draws);
616 draw_instances(draw, drawid_offset, use_info, use_draws, num_draws);
620 if (draw->collect_statistics) {
621 draw->render->pipeline_statistics(draw->render, &draw->statistics);