radeonsi: add ability to bind images as image buffers
authorMarek Olšák <marek.olsak@amd.com>
Sat, 5 Jan 2019 00:27:27 +0000 (19:27 -0500)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 4 Apr 2019 13:53:24 +0000 (09:53 -0400)
so that we can bind DCC (texture) as an image buffer.

src/gallium/drivers/radeonsi/si_descriptors.c
src/gallium/drivers/radeonsi/si_pipe.h

index 0f22c55723c4400198948812c372c0eb5d785087..ce67bdb87c8bde65a7782822c961ea7508d12534 100644 (file)
@@ -669,7 +669,8 @@ 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,
@@ -686,7 +687,8 @@ static void si_set_shader_image_desc(struct si_context *ctx,
 
        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);
 
@@ -787,7 +789,8 @@ static void si_set_shader_image(struct si_context *ctx,
 
        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 {
index 16bd074f998abf750574fbc60e5ccbd3cc56184a..010374fde046a6f38fc781f8a5df9594189bff3b 100644 (file)
@@ -123,6 +123,8 @@ enum si_clear_code
        DCC_UNCOMPRESSED       = 0xFFFFFFFF,
 };
 
+#define SI_IMAGE_ACCESS_AS_BUFFER      (1 << 7)
+
 /* Debug flags. */
 enum {
        /* Shader logging options: */