X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fauxiliary%2Fdraw%2Fdraw_context.c;h=9de40d76221b4451899becabc5b8c05fd20e2fcd;hb=dc2357070cb78497686d5d3b02418032dddac5ac;hp=16a261c14cf6ce3390c9bf81f2003ffc2c530fd1;hpb=150c289f6067cb1ba4572f9124948a94ef94c839;p=mesa.git diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c index 16a261c14cf..9de40d76221 100644 --- a/src/gallium/auxiliary/draw/draw_context.c +++ b/src/gallium/auxiliary/draw/draw_context.c @@ -206,9 +206,8 @@ void draw_destroy( struct draw_context *draw ) } } - for (i = 0; i < draw->pt.nr_vertex_buffers; i++) { - pipe_resource_reference(&draw->pt.vertex_buffer[i].buffer, NULL); - } + for (i = 0; i < draw->pt.nr_vertex_buffers; i++) + pipe_vertex_buffer_unreference(&draw->pt.vertex_buffer[i]); /* Not so fast -- we're just borrowing this at the moment. * @@ -276,7 +275,7 @@ draw_update_clip_flags(struct draw_context *draw) 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_near) && !window_space; draw->clip_user = draw->rasterizer && draw->rasterizer->clip_plane_enable != 0 && @@ -440,7 +439,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 ) @@ -465,6 +464,32 @@ draw_set_mapped_constant_buffer(struct draw_context *draw, } } +void +draw_set_mapped_shader_buffer(struct draw_context *draw, + enum pipe_shader_type shader_type, + unsigned slot, + const void *buffer, + unsigned size ) +{ + debug_assert(shader_type == PIPE_SHADER_VERTEX || + shader_type == PIPE_SHADER_GEOMETRY); + debug_assert(slot < PIPE_MAX_SHADER_BUFFERS); + + draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE); + + switch (shader_type) { + case PIPE_SHADER_VERTEX: + draw->pt.user.vs_ssbos[slot] = buffer; + draw->pt.user.vs_ssbos_size[slot] = size; + break; + case PIPE_SHADER_GEOMETRY: + draw->pt.user.gs_ssbos[slot] = buffer; + draw->pt.user.gs_ssbos_size[slot] = size; + break; + default: + assert(0 && "invalid shader type in draw_set_mapped_shader_buffer"); + } +} /** * Tells the draw module to draw points with triangles if their size @@ -556,7 +581,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; @@ -720,7 +745,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) { @@ -731,7 +756,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, @@ -744,9 +803,6 @@ void draw_set_render( struct draw_context *draw, /** * Tell the draw module where vertex indexes/elements are located, and * their size (in bytes). - * - * Note: the caller must apply the pipe_index_buffer::offset value to - * the address. The draw module doesn't do that. */ void draw_set_indexes(struct draw_context *draw, @@ -853,12 +909,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]; } @@ -870,16 +926,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) { @@ -930,6 +976,8 @@ draw_set_mapped_so_targets(struct draw_context *draw, { int i; + draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); + for (i = 0; i < num_targets; i++) draw->so.targets[i] = targets[i]; for (i = num_targets; i < PIPE_MAX_SO_BUFFERS; i++) @@ -940,7 +988,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) { @@ -953,7 +1001,7 @@ draw_set_sampler_views(struct draw_context *draw, for (i = 0; i < num; ++i) draw->sampler_views[shader_stage][i] = views[i]; - for (i = num; i < PIPE_MAX_SHADER_SAMPLER_VIEWS; ++i) + for (i = num; i < draw->num_sampler_views[shader_stage]; ++i) draw->sampler_views[shader_stage][i] = NULL; draw->num_sampler_views[shader_stage] = num; @@ -961,7 +1009,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) { @@ -985,9 +1033,30 @@ draw_set_samplers(struct draw_context *draw, #endif } +void +draw_set_images(struct draw_context *draw, + enum pipe_shader_type shader_stage, + struct pipe_image_view *views, + unsigned num) +{ + unsigned i; + + debug_assert(shader_stage < PIPE_SHADER_TYPES); + debug_assert(num <= PIPE_MAX_SHADER_IMAGES); + + draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); + + for (i = 0; i < num; ++i) + draw->images[shader_stage][i] = &views[i]; + for (i = num; i < draw->num_sampler_views[shader_stage]; ++i) + draw->images[shader_stage][i] = NULL; + + draw->num_images[shader_stage] = num; +} + 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, @@ -1007,12 +1076,33 @@ draw_set_mapped_texture(struct draw_context *draw, #endif } +void +draw_set_mapped_image(struct draw_context *draw, + enum pipe_shader_type shader_stage, + unsigned idx, + uint32_t width, uint32_t height, uint32_t depth, + const void *base_ptr, + uint32_t row_stride, + uint32_t img_stride) +{ +#ifdef HAVE_LLVM + if (draw->llvm) + draw_llvm_set_mapped_image(draw, + shader_stage, + idx, + width, height, depth, + base_ptr, + row_stride, img_stride); +#endif +} + /** * XXX: Results for PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS because there are two * 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: @@ -1030,7 +1120,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