X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fauxiliary%2Fdraw%2Fdraw_context.c;h=8f1189a6bda4834eeb66e32548f1b953b28a7462;hb=b4b1dcb2c152519648a52ce415dc702d8c0bc7a6;hp=90531d38416c90c5bb857e9ca2fa6642347d1fc7;hpb=25b00f4617973243707f14ea72bb7f501a3190c9;p=mesa.git diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c index 90531d38416..8f1189a6bda 100644 --- a/src/gallium/auxiliary/draw/draw_context.c +++ b/src/gallium/auxiliary/draw/draw_context.c @@ -72,7 +72,7 @@ draw_create_context(struct pipe_context *pipe, void *context, boolean try_llvm) { struct draw_context *draw = CALLOC_STRUCT( draw_context ); - if (draw == NULL) + if (!draw) goto err_out; /* we need correct cpu caps for disabling denorms in draw_vbo() */ @@ -182,6 +182,7 @@ boolean draw_init(struct draw_context *draw) void draw_new_instance(struct draw_context *draw) { draw_geometry_shader_new_instance(draw->gs.geometry_shader); + draw_prim_assembler_new_instance(draw->ia); } @@ -254,21 +255,48 @@ void draw_set_zs_format(struct draw_context *draw, enum pipe_format format) } -static void update_clip_flags( struct draw_context *draw ) +static bool +draw_is_vs_window_space(struct draw_context *draw) +{ + if (draw->vs.vertex_shader) { + struct tgsi_shader_info *info = &draw->vs.vertex_shader->info; + + return info->properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION] != 0; + } + return false; +} + + +void +draw_update_clip_flags(struct draw_context *draw) { - draw->clip_xy = !draw->driver.bypass_clip_xy; + bool window_space = draw_is_vs_window_space(draw); + + draw->clip_xy = !draw->driver.bypass_clip_xy && !window_space; draw->guard_band_xy = (!draw->driver.bypass_clip_xy && draw->driver.guard_band_xy); draw->clip_z = (!draw->driver.bypass_clip_z && - draw->rasterizer && draw->rasterizer->depth_clip); + draw->rasterizer && draw->rasterizer->depth_clip) && + !window_space; draw->clip_user = draw->rasterizer && - draw->rasterizer->clip_plane_enable != 0; + draw->rasterizer->clip_plane_enable != 0 && + !window_space; draw->guard_band_points_xy = draw->guard_band_xy || (draw->driver.bypass_clip_points && (draw->rasterizer && draw->rasterizer->point_tri_clip)); } + +void +draw_update_viewport_flags(struct draw_context *draw) +{ + bool window_space = draw_is_vs_window_space(draw); + + draw->bypass_viewport = window_space || draw->identity_viewport; +} + + /** * Register new primitive rasterization/rendering state. * This causes the drawing pipeline to be rebuilt. @@ -282,7 +310,7 @@ void draw_set_rasterizer_state( struct draw_context *draw, draw->rasterizer = raster; draw->rast_handle = rast_handle; - update_clip_flags(draw); + draw_update_clip_flags(draw); } } @@ -309,7 +337,7 @@ void draw_set_driver_clipping( struct draw_context *draw, draw->driver.bypass_clip_z = bypass_clip_z; draw->driver.guard_band_xy = guard_band_xy; draw->driver.bypass_clip_points = bypass_clip_points; - update_clip_flags(draw); + draw_update_clip_flags(draw); } @@ -363,6 +391,7 @@ void draw_set_viewport_states( struct draw_context *draw, viewport->translate[0] == 0.0f && viewport->translate[1] == 0.0f && viewport->translate[2] == 0.0f); + draw_update_viewport_flags(draw); } @@ -411,7 +440,7 @@ draw_set_mapped_vertex_buffer(struct draw_context *draw, void draw_set_mapped_constant_buffer(struct draw_context *draw, - unsigned shader_type, + enum pipe_shader_type shader_type, unsigned slot, const void *buffer, unsigned size ) @@ -527,7 +556,7 @@ draw_alloc_extra_vertex_attrib(struct draw_context *draw, num_outputs = draw_current_shader_outputs(draw); n = draw->extra_shader_outputs.num; - assert(n < Elements(draw->extra_shader_outputs.semantic_name)); + assert(n < ARRAY_SIZE(draw->extra_shader_outputs.semantic_name)); draw->extra_shader_outputs.semantic_name[n] = semantic_name; draw->extra_shader_outputs.semantic_index[n] = semantic_index; @@ -661,7 +690,7 @@ draw_total_vs_outputs(const struct draw_context *draw) { const struct tgsi_shader_info *info = &draw->vs.vertex_shader->info; - return info->num_outputs + draw->extra_shader_outputs.num;; + return info->num_outputs + draw->extra_shader_outputs.num; } /** @@ -691,7 +720,7 @@ draw_total_gs_outputs(const struct draw_context *draw) */ void draw_texture_sampler(struct draw_context *draw, - uint shader, + enum pipe_shader_type shader, struct tgsi_sampler *sampler) { if (shader == PIPE_SHADER_VERTEX) { @@ -702,7 +731,41 @@ draw_texture_sampler(struct draw_context *draw, } } +/** + * Provide TGSI image objects for vertex/geometry shaders that use + * texture fetches. This state only needs to be set once per context. + * This might only be used by software drivers for the time being. + */ +void +draw_image(struct draw_context *draw, + enum pipe_shader_type shader, + struct tgsi_image *image) +{ + if (shader == PIPE_SHADER_VERTEX) { + draw->vs.tgsi.image = image; + } else { + debug_assert(shader == PIPE_SHADER_GEOMETRY); + draw->gs.tgsi.image = image; + } +} +/** + * Provide TGSI buffer objects for vertex/geometry shaders that use + * load/store/atomic ops. This state only needs to be set once per context. + * This might only be used by software drivers for the time being. + */ +void +draw_buffer(struct draw_context *draw, + enum pipe_shader_type shader, + struct tgsi_buffer *buffer) +{ + if (shader == PIPE_SHADER_VERTEX) { + draw->vs.tgsi.buffer = buffer; + } else { + debug_assert(shader == PIPE_SHADER_GEOMETRY); + draw->gs.tgsi.buffer = buffer; + } +} void draw_set_render( struct draw_context *draw, @@ -824,12 +887,12 @@ draw_current_shader_clipvertex_output(const struct draw_context *draw) } uint -draw_current_shader_clipdistance_output(const struct draw_context *draw, int index) +draw_current_shader_ccdistance_output(const struct draw_context *draw, int index) { debug_assert(index < PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT); if (draw->gs.geometry_shader) - return draw->gs.geometry_shader->clipdistance_output[index]; - return draw->vs.clipdistance_output[index]; + return draw->gs.geometry_shader->ccdistance_output[index]; + return draw->vs.ccdistance_output[index]; } @@ -841,16 +904,6 @@ draw_current_shader_num_written_clipdistances(const struct draw_context *draw) return draw->vs.vertex_shader->info.num_written_clipdistance; } - -uint -draw_current_shader_culldistance_output(const struct draw_context *draw, int index) -{ - debug_assert(index < PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT); - if (draw->gs.geometry_shader) - return draw->gs.geometry_shader->culldistance_output[index]; - return draw->vs.vertex_shader->culldistance_output[index]; -} - uint draw_current_shader_num_written_culldistances(const struct draw_context *draw) { @@ -911,7 +964,7 @@ draw_set_mapped_so_targets(struct draw_context *draw, void draw_set_sampler_views(struct draw_context *draw, - unsigned shader_stage, + enum pipe_shader_type shader_stage, struct pipe_sampler_view **views, unsigned num) { @@ -932,7 +985,7 @@ draw_set_sampler_views(struct draw_context *draw, void draw_set_samplers(struct draw_context *draw, - unsigned shader_stage, + enum pipe_shader_type shader_stage, struct pipe_sampler_state **samplers, unsigned num) { @@ -958,7 +1011,7 @@ draw_set_samplers(struct draw_context *draw, void draw_set_mapped_texture(struct draw_context *draw, - unsigned shader_stage, + enum pipe_shader_type shader_stage, unsigned sview_idx, uint32_t width, uint32_t height, uint32_t depth, uint32_t first_level, uint32_t last_level, @@ -983,7 +1036,8 @@ draw_set_mapped_texture(struct draw_context *draw, * different ways of setting textures, and drivers typically only support one. */ int -draw_get_shader_param_no_llvm(unsigned shader, enum pipe_shader_cap param) +draw_get_shader_param_no_llvm(enum pipe_shader_type shader, + enum pipe_shader_cap param) { switch(shader) { case PIPE_SHADER_VERTEX: @@ -1001,7 +1055,7 @@ draw_get_shader_param_no_llvm(unsigned shader, enum pipe_shader_cap param) * draw_get_shader_param_no_llvm instead. */ int -draw_get_shader_param(unsigned shader, enum pipe_shader_cap param) +draw_get_shader_param(enum pipe_shader_type shader, enum pipe_shader_cap param) { #ifdef HAVE_LLVM