Lines Matching refs:draw

68  * Create new draw module context with gallivm state for LLVM JIT.
74 struct draw_context *draw = CALLOC_STRUCT( draw_context );
75 if (!draw)
83 draw->llvm = draw_llvm_create(draw, (LLVMContextRef)context);
87 draw->pipe = pipe;
89 if (!draw_init(draw))
92 draw->ia = draw_prim_assembler_create(draw);
93 if (!draw->ia)
96 return draw;
99 draw_destroy( draw );
106 * Create new draw module context, with LLVM JIT.
125 * Create a new draw context, without LLVM JIT.
134 boolean draw_init(struct draw_context *draw)
142 ASSIGN_4V( draw->plane[0], -1, 0, 0, 1 );
143 ASSIGN_4V( draw->plane[1], 1, 0, 0, 1 );
144 ASSIGN_4V( draw->plane[2], 0, -1, 0, 1 );
145 ASSIGN_4V( draw->plane[3], 0, 1, 0, 1 );
146 ASSIGN_4V( draw->plane[4], 0, 0, 1, 1 ); /* yes these are correct */
147 ASSIGN_4V( draw->plane[5], 0, 0, -1, 1 ); /* mesa's a bit wonky */
148 draw->clip_xy = TRUE;
149 draw->clip_z = TRUE;
151 draw->pt.user.planes = (float (*) [DRAW_TOTAL_CLIP_PLANES][4]) &(draw->plane[0]);
152 draw->pt.user.eltMax = ~0;
154 if (!draw_pipeline_init( draw ))
157 if (!draw_pt_init( draw ))
160 if (!draw_vs_init( draw ))
163 if (!draw_gs_init( draw ))
166 draw->quads_always_flatshade_last = !draw->pipe->screen->get_param(
167 draw->pipe->screen, PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION);
169 draw->floating_point_depth = false;
175 * Called whenever we're starting to draw a new instance.
182 void draw_new_instance(struct draw_context *draw)
184 draw_geometry_shader_new_instance(draw->gs.geometry_shader);
185 draw_prim_assembler_new_instance(draw->ia);
189 void draw_destroy( struct draw_context *draw )
194 if (!draw)
197 pipe = draw->pipe;
203 if (draw->rasterizer_no_cull[i][j]) {
204 pipe->delete_rasterizer_state(pipe, draw->rasterizer_no_cull[i][j]);
209 for (i = 0; i < draw->pt.nr_vertex_buffers; i++) {
210 pipe_resource_reference(&draw->pt.vertex_buffer[i].buffer, NULL);
215 if (draw->render)
216 draw->render->destroy( draw->render );
219 draw_prim_assembler_destroy(draw->ia);
220 draw_pipeline_destroy( draw );
221 draw_pt_destroy( draw );
222 draw_vs_destroy( draw );
223 draw_gs_destroy( draw );
225 if (draw->llvm)
226 draw_llvm_destroy( draw->llvm );
229 FREE( draw );
234 void draw_flush( struct draw_context *draw )
236 draw_do_flush( draw, DRAW_FLUSH_BACKEND );
241 * Specify the depth stencil format for the draw pipeline. This function
247 void draw_set_zs_format(struct draw_context *draw, enum pipe_format format)
251 draw->floating_point_depth =
254 draw->mrd = util_get_depth_format_mrd(desc);
259 draw_is_vs_window_space(struct draw_context *draw)
261 if (draw->vs.vertex_shader) {
262 struct tgsi_shader_info *info = &draw->vs.vertex_shader->info;
271 draw_update_clip_flags(struct draw_context *draw)
273 bool window_space = draw_is_vs_window_space(draw);
275 draw->clip_xy = !draw->driver.bypass_clip_xy && !window_space;
276 draw->guard_band_xy = (!draw->driver.bypass_clip_xy &&
277 draw->driver.guard_band_xy);
278 draw->clip_z = (!draw->driver.bypass_clip_z &&
279 draw->rasterizer && draw->rasterizer->depth_clip) &&
281 draw->clip_user = draw->rasterizer &&
282 draw->rasterizer->clip_plane_enable != 0 &&
284 draw->guard_band_points_xy = draw->guard_band_xy ||
285 (draw->driver.bypass_clip_points &&
286 (draw->rasterizer &&
287 draw->rasterizer->point_tri_clip));
292 draw_update_viewport_flags(struct draw_context *draw)
294 bool window_space = draw_is_vs_window_space(draw);
296 draw->bypass_viewport = window_space || draw->identity_viewport;
304 void draw_set_rasterizer_state( struct draw_context *draw,
308 if (!draw->suspend_flushing) {
309 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
311 draw->rasterizer = raster;
312 draw->rast_handle = rast_handle;
313 draw_update_clip_flags(draw);
322 * relying on the draw module for some other reason.
328 void draw_set_driver_clipping( struct draw_context *draw,
334 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
336 draw->driver.bypass_clip_xy = bypass_clip_xy;
337 draw->driver.bypass_clip_z = bypass_clip_z;
338 draw->driver.guard_band_xy = guard_band_xy;
339 draw->driver.bypass_clip_points = bypass_clip_points;
340 draw_update_clip_flags(draw);
349 void draw_set_rasterize_stage( struct draw_context *draw,
352 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
354 draw->pipeline.rasterize = stage;
359 * Set the draw module's clipping state.
361 void draw_set_clip_state( struct draw_context *draw,
364 draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
366 memcpy(&draw->plane[6], clip->ucp, sizeof(clip->ucp));
371 * Set the draw module's viewport state.
373 void draw_set_viewport_states( struct draw_context *draw,
379 draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
384 memcpy(draw->viewports + start_slot, vps,
387 draw->identity_viewport = (num_viewports == 1) &&
394 draw_update_viewport_flags(draw);
400 draw_set_vertex_buffers(struct draw_context *draw,
406 util_set_vertex_buffers_count(draw->pt.vertex_buffer,
407 &draw->pt.nr_vertex_buffers,
413 draw_set_vertex_elements(struct draw_context *draw,
421 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
423 memcpy(draw->pt.vertex_element, elements, count * sizeof(elements[0]));
424 draw->pt.nr_vertex_elements = count;
432 draw_set_mapped_vertex_buffer(struct draw_context *draw,
436 draw->pt.user.vbuffer[attr].map = buffer;
437 draw->pt.user.vbuffer[attr].size = size;
442 draw_set_mapped_constant_buffer(struct draw_context *draw,
452 draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
456 draw->pt.user.vs_constants[slot] = buffer;
457 draw->pt.user.vs_constants_size[slot] = size;
460 draw->pt.user.gs_constants[slot] = buffer;
461 draw->pt.user.gs_constants_size[slot] = size;
470 * Tells the draw module to draw points with triangles if their size
474 draw_wide_point_threshold(struct draw_context *draw, float threshold)
476 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
477 draw->pipeline.wide_point_threshold = threshold;
482 * Should the draw module handle point->quad conversion for drawing sprites?
485 draw_wide_point_sprites(struct draw_context *draw, boolean draw_sprite)
487 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
488 draw->pipeline.wide_point_sprites = draw_sprite;
493 * Tells the draw module to draw lines with triangles if their width
497 draw_wide_line_threshold(struct draw_context *draw, float threshold)
499 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
500 draw->pipeline.wide_line_threshold = roundf(threshold);
505 * Tells the draw module whether or not to implement line stipple.
508 draw_enable_line_stipple(struct draw_context *draw, boolean enable)
510 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
511 draw->pipeline.line_stipple = enable;
516 * Tells draw module whether to convert points to quads for sprite mode.
519 draw_enable_point_sprites(struct draw_context *draw, boolean enable)
521 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
522 draw->pipeline.point_sprite = enable;
527 draw_set_force_passthrough( struct draw_context *draw, boolean enable )
529 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
530 draw->force_passthrough = enable;
539 * This is used by some of the optional draw module stages such
544 draw_alloc_extra_vertex_attrib(struct draw_context *draw,
551 slot = draw_find_shader_output(draw, semantic_name, semantic_index);
556 num_outputs = draw_current_shader_outputs(draw);
557 n = draw->extra_shader_outputs.num;
559 assert(n < ARRAY_SIZE(draw->extra_shader_outputs.semantic_name));
561 draw->extra_shader_outputs.semantic_name[n] = semantic_name;
562 draw->extra_shader_outputs.semantic_index[n] = semantic_index;
563 draw->extra_shader_outputs.slot[n] = num_outputs + n;
564 draw->extra_shader_outputs.num++;
566 return draw->extra_shader_outputs.slot[n];
575 draw_remove_extra_vertex_attribs(struct draw_context *draw)
577 draw->extra_shader_outputs.num = 0;
586 draw_get_shader_info(const struct draw_context *draw)
589 if (draw->gs.geometry_shader) {
590 return &draw->gs.geometry_shader->info;
592 return &draw->vs.vertex_shader->info;
597 * Prepare outputs slots from the draw module
599 * Certain parts of the draw module can emit additional
608 draw_prepare_shader_outputs(struct draw_context *draw)
610 draw_remove_extra_vertex_attribs(draw);
611 draw_prim_assembler_prepare_outputs(draw->ia);
612 draw_unfilled_prepare_outputs(draw, draw->pipeline.unfilled);
613 if (draw->pipeline.aapoint)
614 draw_aapoint_prepare_outputs(draw, draw->pipeline.aapoint);
615 if (draw->pipeline.aaline)
616 draw_aaline_prepare_outputs(draw, draw->pipeline.aaline);
620 * Ask the draw module for the location/slot of the given vertex attribute in
623 * With this function, drivers that use the draw module should have no reason
626 * Note that the draw module may sometimes generate vertices with extra
636 draw_find_shader_output(const struct draw_context *draw,
639 const struct tgsi_shader_info *info = draw_get_shader_info(draw);
649 for (i = 0; i < draw->extra_shader_outputs.num; i++) {
650 if (draw->extra_shader_outputs.semantic_name[i] == semantic_name &&
651 draw->extra_shader_outputs.semantic_index[i] == semantic_index) {
652 return draw->extra_shader_outputs.slot[i];
663 * vertex/geometry output attributes that may be filled in by some draw
670 draw_num_shader_outputs(const struct draw_context *draw)
672 const struct tgsi_shader_info *info = draw_get_shader_info(draw);
676 count += draw->extra_shader_outputs.num;
685 * be filled in by some draw stages (such as AA point, AA line,
689 draw_total_vs_outputs(const struct draw_context *draw)
691 const struct tgsi_shader_info *info = &draw->vs.vertex_shader->info;
693 return info->num_outputs + draw->extra_shader_outputs.num;
699 * be filled in by some draw stages (such as AA point, AA line, front
703 draw_total_gs_outputs(const struct draw_context *draw)
707 if (!draw->gs.geometry_shader)
710 info = &draw->gs.geometry_shader->info;
712 return info->num_outputs + draw->extra_shader_outputs.num;
722 draw_texture_sampler(struct draw_context *draw,
727 draw->vs.tgsi.sampler = sampler;
730 draw->gs.tgsi.sampler = sampler;
740 draw_image(struct draw_context *draw,
745 draw->vs.tgsi.image = image;
748 draw->gs.tgsi.image = image;
758 draw_buffer(struct draw_context *draw,
763 draw->vs.tgsi.buffer = buffer;
766 draw->gs.tgsi.buffer = buffer;
771 void draw_set_render( struct draw_context *draw,
774 draw->render = render;
779 * Tell the draw module where vertex indexes/elements are located, and
783 * the address. The draw module doesn't do that.
786 draw_set_indexes(struct draw_context *draw,
794 draw->pt.user.elts = elements;
795 draw->pt.user.eltSizeIB = elem_size;
797 draw->pt.user.eltMax = elem_buffer_space / elem_size;
799 draw->pt.user.eltMax = 0;
805 void draw_do_flush( struct draw_context *draw, unsigned flags )
807 if (!draw->suspend_flushing)
809 assert(!draw->flushing); /* catch inadvertant recursion */
811 draw->flushing = TRUE;
813 draw_pipeline_flush( draw, flags );
815 draw_pt_flush( draw, flags );
817 draw->flushing = FALSE;
829 draw_current_shader_outputs(const struct draw_context *draw)
831 if (draw->gs.geometry_shader)
832 return draw->gs.num_gs_outputs;
833 return draw->vs.num_vs_outputs;
842 draw_current_shader_position_output(const struct draw_context *draw)
844 if (draw->gs.geometry_shader)
845 return draw->gs.position_output;
846 return draw->vs.position_output;
855 draw_current_shader_viewport_index_output(const struct draw_context *draw)
857 if (draw->gs.geometry_shader)
858 return draw->gs.geometry_shader->viewport_index_output;
859 return draw->vs.vertex_shader->viewport_index_output;
867 draw_current_shader_uses_viewport_index(const struct draw_context *draw)
869 if (draw->gs.geometry_shader)
870 return draw->gs.geometry_shader->info.writes_viewport_index;
871 return draw->vs.vertex_shader->info.writes_viewport_index;
882 draw_current_shader_clipvertex_output(const struct draw_context *draw)
884 if (draw->gs.geometry_shader)
885 return draw->gs.position_output;
886 return draw->vs.clipvertex_output;
890 draw_current_shader_ccdistance_output(const struct draw_context *draw, int index)
893 if (draw->gs.geometry_shader)
894 return draw->gs.geometry_shader->ccdistance_output[index];
895 return draw->vs.ccdistance_output[index];
900 draw_current_shader_num_written_clipdistances(const struct draw_context *draw)
902 if (draw->gs.geometry_shader)
903 return draw->gs.geometry_shader->info.num_written_clipdistance;
904 return draw->vs.vertex_shader->info.num_written_clipdistance;
908 draw_current_shader_num_written_culldistances(const struct draw_context *draw)
910 if (draw->gs.geometry_shader)
911 return draw->gs.geometry_shader->info.num_written_culldistance;
912 return draw->vs.vertex_shader->info.num_written_culldistance;
927 draw_get_rasterizer_no_cull( struct draw_context *draw,
931 if (!draw->rasterizer_no_cull[scissor][flatshade]) {
933 struct pipe_context *pipe = draw->pipe;
940 rast.half_pixel_center = draw->rasterizer->half_pixel_center;
941 rast.bottom_edge_rule = draw->rasterizer->bottom_edge_rule;
942 rast.clip_halfz = draw->rasterizer->clip_halfz;
944 draw->rasterizer_no_cull[scissor][flatshade] =
947 return draw->rasterizer_no_cull[scissor][flatshade];
951 draw_set_mapped_so_targets(struct draw_context *draw,
958 draw->so.targets[i] = targets[i];
960 draw->so.targets[i] = NULL;
962 draw->so.num_targets = num_targets;
966 draw_set_sampler_views(struct draw_context *draw,
976 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
979 draw->sampler_views[shader_stage][i] = views[i];
981 draw->sampler_views[shader_stage][i] = NULL;
983 draw->num_sampler_views[shader_stage] = num;
987 draw_set_samplers(struct draw_context *draw,
997 draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
1000 draw->samplers[shader_stage][i] = samplers[i];
1002 draw->samplers[shader_stage][i] = NULL;
1004 draw->num_samplers[shader_stage] = num;
1007 if (draw->llvm)
1008 draw_llvm_set_sampler_state(draw, shader_stage);
1013 draw_set_mapped_texture(struct draw_context *draw,
1024 if (draw->llvm)
1025 draw_llvm_set_mapped_texture(draw,
1053 * Drivers requesting a draw context explicitly without llvm must call
1086 draw_collect_pipeline_statistics(struct draw_context *draw,
1089 draw->collect_statistics = enable;
1100 draw_stats_clipper_primitives(struct draw_context *draw,
1103 if (draw->collect_statistics) {
1106 draw->statistics.c_invocations +=
1115 * Returns true if the draw module will inject the frontface
1119 * the function will figure out if the draw module
1125 draw_will_inject_frontface(const struct draw_context *draw)
1127 unsigned reduced_prim = u_reduced_prim(draw->pt.prim);
1128 const struct pipe_rasterizer_state *rast = draw->rasterizer;