From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_blit.c | 16 +++++++++------- src/gallium/drivers/radeonsi/si_descriptors.c | 21 +++++++++++++++++++++ src/gallium/drivers/radeonsi/si_pipe.h | 1 + 3 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index 5b53373..da6c0cd 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -611,59 +611,61 @@ static void si_check_render_feedback(struct si_context *sctx) if (!sctx->need_check_render_feedback) return; for (int i = 0; i < SI_NUM_SHADERS; ++i) { si_check_render_feedback_images(sctx, &sctx->images[i]); si_check_render_feedback_textures(sctx, &sctx->samplers[i]); } sctx->need_check_render_feedback = false; } -static void si_decompress_textures(struct si_context *sctx, int shader_start, - int shader_end) +static void si_decompress_textures(struct si_context *sctx, unsigned shader_mask) { - unsigned compressed_colortex_counter; + unsigned compressed_colortex_counter, mask; if (sctx->blitter->running) return; /* Update the compressed_colortex_mask if necessary. */ compressed_colortex_counter = p_atomic_read(&sctx->screen->b.compressed_colortex_counter); if (compressed_colortex_counter != sctx->b.last_compressed_colortex_counter) { sctx->b.last_compressed_colortex_counter = compressed_colortex_counter; si_update_compressed_colortex_masks(sctx); } - /* Flush depth textures which need to be flushed. */ - for (int i = shader_start; i < shader_end; i++) { + /* Decompress color & depth textures if needed. */ + mask = sctx->compressed_tex_shader_mask & shader_mask; + while (mask) { + unsigned i = u_bit_scan(&mask); + if (sctx->samplers[i].depth_texture_mask) { si_flush_depth_textures(sctx, &sctx->samplers[i]); } if (sctx->samplers[i].compressed_colortex_mask) { si_decompress_sampler_color_textures(sctx, &sctx->samplers[i]); } if (sctx->images[i].compressed_colortex_mask) { si_decompress_image_color_textures(sctx, &sctx->images[i]); } } si_check_render_feedback(sctx); } void si_decompress_graphics_textures(struct si_context *sctx) { - si_decompress_textures(sctx, 0, SI_NUM_GRAPHICS_SHADERS); + si_decompress_textures(sctx, u_bit_consecutive(0, SI_NUM_GRAPHICS_SHADERS)); } void si_decompress_compute_textures(struct si_context *sctx) { - si_decompress_textures(sctx, SI_NUM_GRAPHICS_SHADERS, SI_NUM_SHADERS); + si_decompress_textures(sctx, 1 << PIPE_SHADER_COMPUTE); } static void si_clear(struct pipe_context *ctx, unsigned buffers, const union pipe_color_union *color, double depth, unsigned stencil) { struct si_context *sctx = (struct si_context *)ctx; struct pipe_framebuffer_state *fb = &sctx->framebuffer.state; struct pipe_surface *zsbuf = fb->zsbuf; struct r600_texture *zstex = diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index 0472d23..a535fa0 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -483,20 +483,34 @@ static void si_set_sampler_view(struct si_context *sctx, descs->dirty_mask |= 1u << slot; sctx->descriptors_dirty |= 1u << si_sampler_descriptors_idx(shader); } static bool is_compressed_colortex(struct r600_texture *rtex) { return rtex->cmask.size || rtex->fmask.size || (rtex->dcc_offset && rtex->dirty_level_mask); } +static void si_update_compressed_tex_shader_mask(struct si_context *sctx, + unsigned shader) +{ + struct si_textures_info *samplers = &sctx->samplers[shader]; + unsigned shader_bit = 1 << shader; + + if (samplers->depth_texture_mask || + samplers->compressed_colortex_mask || + sctx->images[shader].compressed_colortex_mask) + sctx->compressed_tex_shader_mask |= shader_bit; + else + sctx->compressed_tex_shader_mask &= ~shader_bit; +} + static void si_set_sampler_views(struct pipe_context *ctx, enum pipe_shader_type shader, unsigned start, unsigned count, struct pipe_sampler_view **views) { struct si_context *sctx = (struct si_context *)ctx; struct si_textures_info *samplers = &sctx->samplers[shader]; int i; if (!count || shader >= SI_NUM_SHADERS) @@ -532,20 +546,22 @@ static void si_set_sampler_views(struct pipe_context *ctx, } if (rtex->dcc_offset && p_atomic_read(&rtex->framebuffers_bound)) sctx->need_check_render_feedback = true; } else { samplers->depth_texture_mask &= ~(1u << slot); samplers->compressed_colortex_mask &= ~(1u << slot); } } + + si_update_compressed_tex_shader_mask(sctx, shader); } static void si_samplers_update_compressed_colortex_mask(struct si_textures_info *samplers) { unsigned mask = samplers->views.enabled_mask; while (mask) { int i = u_bit_scan(&mask); struct pipe_resource *res = samplers->views.views[i]->texture; @@ -752,20 +768,22 @@ si_set_shader_images(struct pipe_context *pipe, assert(start_slot + count <= SI_NUM_IMAGES); if (views) { for (i = 0, slot = start_slot; i < count; ++i, ++slot) si_set_shader_image(ctx, shader, slot, &views[i]); } else { for (i = 0, slot = start_slot; i < count; ++i, ++slot) si_set_shader_image(ctx, shader, slot, NULL); } + + si_update_compressed_tex_shader_mask(ctx, shader); } static void si_images_update_compressed_colortex_mask(struct si_images_info *images) { unsigned mask = images->enabled_mask; while (mask) { int i = u_bit_scan(&mask); struct pipe_resource *res = images->views[i].resource; @@ -1484,20 +1502,21 @@ static void si_set_polygon_stipple(struct pipe_context *ctx, /* CMASK can be enabled (for fast clear) and disabled (for texture export) * while the texture is bound, possibly by a different context. In that case, * call this function to update compressed_colortex_masks. */ void si_update_compressed_colortex_masks(struct si_context *sctx) { for (int i = 0; i < SI_NUM_SHADERS; ++i) { si_samplers_update_compressed_colortex_mask(&sctx->samplers[i]); si_images_update_compressed_colortex_mask(&sctx->images[i]); + si_update_compressed_tex_shader_mask(sctx, i); } } /* BUFFER DISCARD/INVALIDATION */ /** Reset descriptors of buffer resources after \p buf has been invalidated. */ static void si_reset_buffer_resources(struct si_context *sctx, struct si_buffer_resources *buffers, unsigned descriptors_idx, struct pipe_resource *buf, @@ -1699,20 +1718,22 @@ void si_update_all_texture_descriptors(struct si_context *sctx) struct pipe_sampler_view *view = samplers->views[i]; if (!view || !view->texture || view->texture->target == PIPE_BUFFER) continue; si_set_sampler_view(sctx, shader, i, samplers->views[i], true); } + + si_update_compressed_tex_shader_mask(sctx, shader); } } /* SHADER USER DATA */ static void si_mark_shader_pointers_dirty(struct si_context *sctx, unsigned shader) { struct si_descriptors *descs = &sctx->descriptors[SI_DESCS_FIRST_SHADER + shader * SI_NUM_SHADER_DESCS]; diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index c9ae27e..e7d071d 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -261,20 +261,21 @@ struct si_context { /* shader information */ struct si_vertex_element *vertex_elements; unsigned sprite_coord_enable; bool flatshade; bool do_update_shaders; /* shader descriptors */ struct si_descriptors vertex_buffers; struct si_descriptors descriptors[SI_NUM_DESCS]; unsigned descriptors_dirty; + unsigned compressed_tex_shader_mask; struct si_buffer_resources rw_buffers; struct si_buffer_resources const_buffers[SI_NUM_SHADERS]; struct si_buffer_resources shader_buffers[SI_NUM_SHADERS]; struct si_textures_info samplers[SI_NUM_SHADERS]; struct si_images_info images[SI_NUM_SHADERS]; /* other shader resources */ struct pipe_constant_buffer null_const_buf; /* used for set_constant_buffer(NULL) on CIK */ struct pipe_resource *esgs_ring; struct pipe_resource *gsvs_ring; -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev