Lines Matching refs:draw

77  * Create new draw module context with gallivm state for LLVM JIT.
83 struct draw_context *draw = CALLOC_STRUCT( draw_context );
84 if (!draw)
89 draw->llvm = draw_llvm_create(draw, (LLVMContextRef)context);
93 draw->pipe = pipe;
94 draw->constant_buffer_stride = (sizeof(float) * 4);
96 if (!draw_init(draw))
99 draw->ia = draw_prim_assembler_create(draw);
100 if (!draw->ia)
103 return draw;
106 draw_destroy( draw );
113 * Create new draw module context, with LLVM JIT.
132 * Create a new draw context, without LLVM JIT.
141 boolean draw_init(struct draw_context *draw)
149 ASSIGN_4V( draw->plane[0], -1, 0, 0, 1 );
150 ASSIGN_4V( draw->plane[1], 1, 0, 0, 1 );
151 ASSIGN_4V( draw->plane[2], 0, -1, 0, 1 );
152 ASSIGN_4V( draw->plane[3], 0, 1, 0, 1 );
153 ASSIGN_4V( draw->plane[4], 0, 0, 1, 1 ); /* yes these are correct */
154 ASSIGN_4V( draw->plane[5], 0, 0, -1, 1 ); /* mesa's a bit wonky */
155 draw->clip_xy = TRUE;
156 draw->clip_z = TRUE;
158 draw->pt.user.planes = (float (*) [DRAW_TOTAL_CLIP_PLANES][4]) &(draw->plane[0]);
159 draw->pt.user.eltMax = ~0;
161 if (!draw_pipeline_init( draw ))
164 if (!draw_pt_init( draw ))
167 if (!draw_vs_init( draw ))
170 if (!draw_gs_init( draw ))
173 draw->quads_always_flatshade_last = !draw->pipe->screen->get_param(
174 draw->pipe->screen, PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION);
176 draw->floating_point_depth = false;
182 * Called whenever we're starting to draw a new instance.
189 void draw_new_instance(struct draw_context *draw)
191 draw_geometry_shader_new_instance(draw->gs.geometry_shader);
192 draw_prim_assembler_new_instance(draw->ia);
196 void draw_destroy( struct draw_context *draw )
201 if (!draw)
204 pipe = draw->pipe;
211 if (draw->rasterizer_no_cull[i][j][k]) {
212 pipe->delete_rasterizer_state(pipe, draw->rasterizer_no_cull[i][j][k]);
218 for (i = 0; i < draw->pt.nr_vertex_buffers; i++)
219 pipe_vertex_buffer_unreference(&draw->pt.vertex_buffer[i]);
223 if (draw->render)
224 draw->render->destroy( draw->render );
227 draw_prim_assembler_destroy(draw->ia);
228 draw_pipeline_destroy( draw );
229 draw_pt_destroy( draw );
230 draw_vs_destroy( draw );
231 draw_gs_destroy( draw );
233 if (draw->llvm)
234 draw_llvm_destroy( draw->llvm );
237 FREE( draw );
242 void draw_flush( struct draw_context *draw )
244 draw_do_flush( draw, DRAW_FLUSH_BACKEND );
249 * Specify the depth stencil format for the draw pipeline. This function
255 void draw_set_zs_format(struct draw_context *draw, enum pipe_format format)
259 draw->floating_point_depth =
262 draw->mrd = util_get_depth_format_mrd(desc);
267 draw_is_vs_window_space(struct draw_context *draw)
269 if (draw->vs.vertex_shader) {
270 struct tgsi_shader_info *info = &draw->vs.vertex_shader->info;
279 draw_update_clip_flags(struct draw_context *draw)
281 bool window_space = draw_is_vs_window_space(draw);
283 draw->clip_xy = !draw->driver.bypass_clip_xy && !window_space;
284 draw->guard_band_xy = (!draw->driver.bypass_clip_xy &&
285 draw->driver.guard_band_xy);
286 draw->clip_z = (!draw->driver.bypass_clip_z &&
287 draw->rasterizer && draw->rasterizer->depth_clip_near) &&
289 draw->clip_user = draw->rasterizer &&
290 draw->rasterizer->clip_plane_enable != 0 &&
292 draw->guard_band_points_xy = draw->guard_band_xy ||
293 (draw->driver.bypass_clip_points &&
294 (draw->rasterizer &&
295 draw->rasterizer->point_tri_clip));
300 draw_update_viewport_flags(struct draw_context *draw)
302 bool window_space = draw_is_vs_window_space(draw);
304 draw->bypass_viewport = window_space || draw->identity_viewport;
312 void draw_set_rasterizer_state( struct draw_context *draw,
316 if (!draw->suspend_flushing) {
317 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
319 draw->rasterizer = raster;
320 draw->rast_handle = rast_handle;
321 draw_update_clip_flags(draw);
330 * relying on the draw module for some other reason.
336 void draw_set_driver_clipping( struct draw_context *draw,
342 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
344 draw->driver.bypass_clip_xy = bypass_clip_xy;
345 draw->driver.bypass_clip_z = bypass_clip_z;
346 draw->driver.guard_band_xy = guard_band_xy;
347 draw->driver.bypass_clip_points = bypass_clip_points;
348 draw_update_clip_flags(draw);
357 void draw_set_rasterize_stage( struct draw_context *draw,
360 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
362 draw->pipeline.rasterize = stage;
367 * Set the draw module's clipping state.
369 void draw_set_clip_state( struct draw_context *draw,
372 draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
374 memcpy(&draw->plane[6], clip->ucp, sizeof(clip->ucp));
379 * Set the draw module's viewport state.
381 void draw_set_viewport_states( struct draw_context *draw,
387 draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
392 memcpy(draw->viewports + start_slot, vps,
395 draw->identity_viewport = (num_viewports == 1) &&
402 draw_update_viewport_flags(draw);
408 draw_set_vertex_buffers(struct draw_context *draw,
415 util_set_vertex_buffers_count(draw->pt.vertex_buffer,
416 &draw->pt.nr_vertex_buffers,
423 draw_set_vertex_elements(struct draw_context *draw,
431 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
433 memcpy(draw->pt.vertex_element, elements, count * sizeof(elements[0]));
434 draw->pt.nr_vertex_elements = count;
442 draw_set_mapped_vertex_buffer(struct draw_context *draw,
446 draw->pt.user.vbuffer[attr].map = buffer;
447 draw->pt.user.vbuffer[attr].size = size;
452 draw_set_mapped_constant_buffer(struct draw_context *draw,
464 draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
468 draw->pt.user.vs_constants[slot] = buffer;
469 draw->pt.user.vs_constants_size[slot] = size;
472 draw->pt.user.gs_constants[slot] = buffer;
473 draw->pt.user.gs_constants_size[slot] = size;
476 draw->pt.user.tcs_constants[slot] = buffer;
477 draw->pt.user.tcs_constants_size[slot] = size;
480 draw->pt.user.tes_constants[slot] = buffer;
481 draw->pt.user.tes_constants_size[slot] = size;
489 draw_set_mapped_shader_buffer(struct draw_context *draw,
501 draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
505 draw->pt.user.vs_ssbos[slot] = buffer;
506 draw->pt.user.vs_ssbos_size[slot] = size;
509 draw->pt.user.gs_ssbos[slot] = buffer;
510 draw->pt.user.gs_ssbos_size[slot] = size;
513 draw->pt.user.tcs_ssbos[slot] = buffer;
514 draw->pt.user.tcs_ssbos_size[slot] = size;
517 draw->pt.user.tes_ssbos[slot] = buffer;
518 draw->pt.user.tes_ssbos_size[slot] = size;
526 * Tells the draw module to draw points with triangles if their size
530 draw_wide_point_threshold(struct draw_context *draw, float threshold)
532 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
533 draw->pipeline.wide_point_threshold = threshold;
538 * Should the draw module handle point->quad conversion for drawing sprites?
541 draw_wide_point_sprites(struct draw_context *draw, boolean draw_sprite)
543 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
544 draw->pipeline.wide_point_sprites = draw_sprite;
549 * Tells the draw module to draw lines with triangles if their width
553 draw_wide_line_threshold(struct draw_context *draw, float threshold)
555 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
556 draw->pipeline.wide_line_threshold = roundf(threshold);
561 * Tells the draw module whether or not to implement line stipple.
564 draw_enable_line_stipple(struct draw_context *draw, boolean enable)
566 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
567 draw->pipeline.line_stipple = enable;
572 * Tells draw module whether to convert points to quads for sprite mode.
575 draw_enable_point_sprites(struct draw_context *draw, boolean enable)
577 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
578 draw->pipeline.point_sprite = enable;
587 * This is used by some of the optional draw module stages such
592 draw_alloc_extra_vertex_attrib(struct draw_context *draw,
599 slot = draw_find_shader_output(draw, semantic_name, semantic_index);
604 num_outputs = draw_current_shader_outputs(draw);
605 n = draw->extra_shader_outputs.num;
607 assert(n < ARRAY_SIZE(draw->extra_shader_outputs.semantic_name));
609 draw->extra_shader_outputs.semantic_name[n] = semantic_name;
610 draw->extra_shader_outputs.semantic_index[n] = semantic_index;
611 draw->extra_shader_outputs.slot[n] = num_outputs + n;
612 draw->extra_shader_outputs.num++;
614 return draw->extra_shader_outputs.slot[n];
623 draw_remove_extra_vertex_attribs(struct draw_context *draw)
625 draw->extra_shader_outputs.num = 0;
634 draw_get_shader_info(const struct draw_context *draw)
637 if (draw->gs.geometry_shader) {
638 return &draw->gs.geometry_shader->info;
639 } else if (draw->tes.tess_eval_shader) {
640 return &draw->tes.tess_eval_shader->info;
642 return &draw->vs.vertex_shader->info;
647 * Prepare outputs slots from the draw module
649 * Certain parts of the draw module can emit additional
658 draw_prepare_shader_outputs(struct draw_context *draw)
660 draw_remove_extra_vertex_attribs(draw);
661 draw_prim_assembler_prepare_outputs(draw->ia);
662 draw_unfilled_prepare_outputs(draw, draw->pipeline.unfilled);
663 if (draw->pipeline.aapoint)
664 draw_aapoint_prepare_outputs(draw, draw->pipeline.aapoint);
665 if (draw->pipeline.aaline)
666 draw_aaline_prepare_outputs(draw, draw->pipeline.aaline);
670 * Ask the draw module for the location/slot of the given vertex attribute in
673 * With this function, drivers that use the draw module should have no reason
676 * Note that the draw module may sometimes generate vertices with extra
686 draw_find_shader_output(const struct draw_context *draw,
689 const struct tgsi_shader_info *info = draw_get_shader_info(draw);
699 for (i = 0; i < draw->extra_shader_outputs.num; i++) {
700 if (draw->extra_shader_outputs.semantic_name[i] == semantic_name &&
701 draw->extra_shader_outputs.semantic_index[i] == semantic_index) {
702 return draw->extra_shader_outputs.slot[i];
713 * vertex/geometry output attributes that may be filled in by some draw
720 draw_num_shader_outputs(const struct draw_context *draw)
722 const struct tgsi_shader_info *info = draw_get_shader_info(draw);
726 count += draw->extra_shader_outputs.num;
735 * be filled in by some draw stages (such as AA point, AA line,
739 draw_total_vs_outputs(const struct draw_context *draw)
741 const struct tgsi_shader_info *info = &draw->vs.vertex_shader->info;
743 return info->num_outputs + draw->extra_shader_outputs.num;
749 * be filled in by some draw stages (such as AA point, AA line, front
753 draw_total_gs_outputs(const struct draw_context *draw)
757 if (!draw->gs.geometry_shader)
760 info = &draw->gs.geometry_shader->info;
762 return info->num_outputs + draw->extra_shader_outputs.num;
769 draw_total_tcs_outputs(const struct draw_context *draw)
773 if (!draw->tcs.tess_ctrl_shader)
776 info = &draw->tcs.tess_ctrl_shader->info;
785 draw_total_tes_outputs(const struct draw_context *draw)
789 if (!draw->tes.tess_eval_shader)
792 info = &draw->tes.tess_eval_shader->info;
794 return info->num_outputs + draw->extra_shader_outputs.num;
803 draw_texture_sampler(struct draw_context *draw,
809 draw->vs.tgsi.sampler = sampler;
812 draw->gs.tgsi.sampler = sampler;
815 draw->tcs.tgsi.sampler = sampler;
818 draw->tes.tgsi.sampler = sampler;
832 draw_image(struct draw_context *draw,
838 draw->vs.tgsi.image = image;
841 draw->gs.tgsi.image = image;
844 draw->tcs.tgsi.image = image;
847 draw->tes.tgsi.image = image;
861 draw_buffer(struct draw_context *draw,
867 draw->vs.tgsi.buffer = buffer;
870 draw->gs.tgsi.buffer = buffer;
873 draw->tcs.tgsi.buffer = buffer;
876 draw->tes.tgsi.buffer = buffer;
885 void draw_set_render( struct draw_context *draw,
888 draw->render = render;
893 * Tell the draw module where vertex indexes/elements are located, and
897 draw_set_indexes(struct draw_context *draw,
905 draw->pt.user.elts = elements;
906 draw->pt.user.eltSizeIB = elem_size;
908 draw->pt.user.eltMax = elem_buffer_space / elem_size;
910 draw->pt.user.eltMax = 0;
916 void draw_do_flush( struct draw_context *draw, unsigned flags )
918 if (!draw->suspend_flushing)
920 assert(!draw->flushing); /* catch inadvertant recursion */
922 draw->flushing = TRUE;
924 draw_pipeline_flush( draw, flags );
926 draw_pt_flush( draw, flags );
928 draw->flushing = FALSE;
940 draw_current_shader_outputs(const struct draw_context *draw)
942 if (draw->gs.geometry_shader)
943 return draw->gs.num_gs_outputs;
944 if (draw->tes.tess_eval_shader)
945 return draw->tes.num_tes_outputs;
946 return draw->vs.num_vs_outputs;
955 draw_current_shader_position_output(const struct draw_context *draw)
957 if (draw->gs.geometry_shader)
958 return draw->gs.position_output;
959 if (draw->tes.tess_eval_shader)
960 return draw->tes.position_output;
961 return draw->vs.position_output;
970 draw_current_shader_viewport_index_output(const struct draw_context *draw)
972 if (draw->gs.geometry_shader)
973 return draw->gs.geometry_shader->viewport_index_output;
974 else if (draw->tes.tess_eval_shader)
975 return draw->tes.tess_eval_shader->viewport_index_output;
976 return draw->vs.vertex_shader->viewport_index_output;
984 draw_current_shader_uses_viewport_index(const struct draw_context *draw)
986 if (draw->gs.geometry_shader)
987 return draw->gs.geometry_shader->info.writes_viewport_index;
988 else if (draw->tes.tess_eval_shader)
989 return draw->tes.tess_eval_shader->info.writes_viewport_index;
990 return draw->vs.vertex_shader->info.writes_viewport_index;
1001 draw_current_shader_clipvertex_output(const struct draw_context *draw)
1003 if (draw->gs.geometry_shader)
1004 return draw->gs.clipvertex_output;
1005 if (draw->tes.tess_eval_shader)
1006 return draw->tes.clipvertex_output;
1007 return draw->vs.clipvertex_output;
1011 draw_current_shader_ccdistance_output(const struct draw_context *draw, int index)
1014 if (draw->gs.geometry_shader)
1015 return draw->gs.geometry_shader->ccdistance_output[index];
1016 if (draw->tes.tess_eval_shader)
1017 return draw->tes.tess_eval_shader->ccdistance_output[index];
1018 return draw->vs.ccdistance_output[index];
1023 draw_current_shader_num_written_clipdistances(const struct draw_context *draw)
1025 if (draw->gs.geometry_shader)
1026 return draw->gs.geometry_shader->info.num_written_clipdistance;
1027 if (draw->tes.tess_eval_shader)
1028 return draw->tes.tess_eval_shader->info.num_written_clipdistance;
1029 return draw->vs.vertex_shader->info.num_written_clipdistance;
1033 draw_current_shader_num_written_culldistances(const struct draw_context *draw)
1035 if (draw->gs.geometry_shader)
1036 return draw->gs.geometry_shader->info.num_written_culldistance;
1037 if (draw->tes.tess_eval_shader)
1038 return draw->tes.tess_eval_shader->info.num_written_culldistance;
1039 return draw->vs.vertex_shader->info.num_written_culldistance;
1054 draw_get_rasterizer_no_cull( struct draw_context *draw,
1057 if (!draw->rasterizer_no_cull[base_rast->scissor][base_rast->flatshade][base_rast->rasterizer_discard]) {
1059 struct pipe_context *pipe = draw->pipe;
1067 rast.half_pixel_center = draw->rasterizer->half_pixel_center;
1068 rast.bottom_edge_rule = draw->rasterizer->bottom_edge_rule;
1069 rast.clip_halfz = draw->rasterizer->clip_halfz;
1071 draw->rasterizer_no_cull[base_rast->scissor][base_rast->flatshade][base_rast->rasterizer_discard] =
1074 return draw->rasterizer_no_cull[base_rast->scissor][base_rast->flatshade][base_rast->rasterizer_discard];
1078 draw_set_mapped_so_targets(struct draw_context *draw,
1084 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
1087 draw->so.targets[i] = targets[i];
1089 draw->so.targets[i] = NULL;
1091 draw->so.num_targets = num_targets;
1095 draw_set_sampler_views(struct draw_context *draw,
1105 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
1108 draw->sampler_views[shader_stage][i] = views[i];
1109 for (i = num; i < draw->num_sampler_views[shader_stage]; ++i)
1110 draw->sampler_views[shader_stage][i] = NULL;
1112 draw->num_sampler_views[shader_stage] = num;
1116 draw_set_samplers(struct draw_context *draw,
1126 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
1129 draw->samplers[shader_stage][i] = samplers[i];
1131 draw->samplers[shader_stage][i] = NULL;
1133 draw->num_samplers[shader_stage] = num;
1136 if (draw->llvm)
1137 draw_llvm_set_sampler_state(draw, shader_stage);
1142 draw_set_images(struct draw_context *draw,
1152 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
1155 draw->images[shader_stage][i] = &views[i];
1156 for (i = num; i < draw->num_sampler_views[shader_stage]; ++i)
1157 draw->images[shader_stage][i] = NULL;
1159 draw->num_images[shader_stage] = num;
1163 draw_set_mapped_texture(struct draw_context *draw,
1176 if (draw->llvm)
1177 draw_llvm_set_mapped_texture(draw,
1187 draw_set_mapped_image(struct draw_context *draw,
1198 if (draw->llvm)
1199 draw_llvm_set_mapped_image(draw,
1229 * Drivers requesting a draw context explicitly without llvm must call
1264 draw_collect_pipeline_statistics(struct draw_context *draw,
1267 draw->collect_statistics = enable;
1273 void draw_collect_primitives_generated(struct draw_context *draw,
1276 draw->collect_primgen = enable;
1287 draw_stats_clipper_primitives(struct draw_context *draw,
1290 if (draw->collect_statistics) {
1293 draw->statistics.c_invocations +=
1302 * Returns true if the draw module will inject the frontface
1306 * the function will figure out if the draw module
1312 draw_will_inject_frontface(const struct draw_context *draw)
1314 unsigned reduced_prim = u_reduced_prim(draw->pt.prim);
1315 const struct pipe_rasterizer_state *rast = draw->rasterizer;
1327 draw_set_tess_state(struct draw_context *draw,
1332 draw->default_outer_tess_level[i] = default_outer_level[i];
1334 draw->default_inner_tess_level[i] = default_inner_level[i];
1338 draw_set_disk_cache_callbacks(struct draw_context *draw,
1347 draw->disk_cache_find_shader = find_shader;
1348 draw->disk_cache_insert_shader = insert_shader;
1349 draw->disk_cache_cookie = data_cookie;
1352 void draw_set_constant_buffer_stride(struct draw_context *draw, unsigned num_bytes)
1354 draw->constant_buffer_stride = num_bytes;