From: Marek Olšák <marek.ol...@amd.com>

so that we can bind DCC (texture) as an image buffer.
---
 src/gallium/drivers/radeonsi/si_descriptors.c | 9 ++++++---
 src/gallium/drivers/radeonsi/si_pipe.h        | 2 ++
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c 
b/src/gallium/drivers/radeonsi/si_descriptors.c
index 0f22c55723c..ce67bdb87c8 100644
--- a/src/gallium/drivers/radeonsi/si_descriptors.c
+++ b/src/gallium/drivers/radeonsi/si_descriptors.c
@@ -662,38 +662,40 @@ si_disable_shader_image(struct si_context *ctx, unsigned 
shader, unsigned slot)
                images->enabled_mask &= ~(1u << slot);
                ctx->descriptors_dirty |= 1u << 
si_sampler_and_image_descriptors_idx(shader);
        }
 }
 
 static void
 si_mark_image_range_valid(const struct pipe_image_view *view)
 {
        struct si_resource *res = si_resource(view->resource);
 
-       assert(res && res->b.b.target == PIPE_BUFFER);
+       if (res->b.b.target != PIPE_BUFFER)
+               return;
 
        util_range_add(&res->valid_buffer_range,
                       view->u.buf.offset,
                       view->u.buf.offset + view->u.buf.size);
 }
 
 static void si_set_shader_image_desc(struct si_context *ctx,
                                     const struct pipe_image_view *view,
                                     bool skip_decompress,
                                     uint32_t *desc, uint32_t *fmask_desc)
 {
        struct si_screen *screen = ctx->screen;
        struct si_resource *res;
 
        res = si_resource(view->resource);
 
-       if (res->b.b.target == PIPE_BUFFER) {
+       if (res->b.b.target == PIPE_BUFFER ||
+           view->shader_access & SI_IMAGE_ACCESS_AS_BUFFER) {
                if (view->access & PIPE_IMAGE_ACCESS_WRITE)
                        si_mark_image_range_valid(view);
 
                si_make_buffer_descriptor(screen, res,
                                          view->format,
                                          view->u.buf.offset,
                                          view->u.buf.size, desc);
                si_set_buf_desc_address(res, view->u.buf.offset, desc + 4);
        } else {
                static const unsigned char swizzle[4] = { 0, 1, 2, 3 };
@@ -780,21 +782,22 @@ static void si_set_shader_image(struct si_context *ctx,
                return;
        }
 
        res = si_resource(view->resource);
 
        if (&images->views[slot] != view)
                util_copy_image_view(&images->views[slot], view);
 
        si_set_shader_image_desc(ctx, view, skip_decompress, desc, NULL);
 
-       if (res->b.b.target == PIPE_BUFFER) {
+       if (res->b.b.target == PIPE_BUFFER ||
+           view->shader_access & SI_IMAGE_ACCESS_AS_BUFFER) {
                images->needs_color_decompress_mask &= ~(1 << slot);
                res->bind_history |= PIPE_BIND_SHADER_IMAGE;
        } else {
                struct si_texture *tex = (struct si_texture *)res;
                unsigned level = view->u.tex.level;
 
                if (color_needs_decompression(tex)) {
                        images->needs_color_decompress_mask |= 1 << slot;
                } else {
                        images->needs_color_decompress_mask &= ~(1 << slot);
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h 
b/src/gallium/drivers/radeonsi/si_pipe.h
index 39152587a99..6765dcb3275 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -116,20 +116,22 @@
 enum si_clear_code
 {
        DCC_CLEAR_COLOR_0000   = 0x00000000,
        DCC_CLEAR_COLOR_0001   = 0x40404040,
        DCC_CLEAR_COLOR_1110   = 0x80808080,
        DCC_CLEAR_COLOR_1111   = 0xC0C0C0C0,
        DCC_CLEAR_COLOR_REG    = 0x20202020,
        DCC_UNCOMPRESSED       = 0xFFFFFFFF,
 };
 
+#define SI_IMAGE_ACCESS_AS_BUFFER      (1 << 7)
+
 /* Debug flags. */
 enum {
        /* Shader logging options: */
        DBG_VS = PIPE_SHADER_VERTEX,
        DBG_PS = PIPE_SHADER_FRAGMENT,
        DBG_GS = PIPE_SHADER_GEOMETRY,
        DBG_TCS = PIPE_SHADER_TESS_CTRL,
        DBG_TES = PIPE_SHADER_TESS_EVAL,
        DBG_CS = PIPE_SHADER_COMPUTE,
        DBG_NO_IR,
-- 
2.17.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to