[Mesa-dev] [PATCH 04/10] radeonsi: move the buffer descriptor to the end of the image descriptor

Marek Olšák maraeo at gmail.com
Sun Feb 1 09:37:01 PST 2015


From: Marek Olšák <marek.olsak at amd.com>

This will allow supporting NULL textures.
---
 src/gallium/drivers/radeonsi/si_descriptors.c | 2 +-
 src/gallium/drivers/radeonsi/si_pipe.h        | 2 ++
 src/gallium/drivers/radeonsi/si_shader.c      | 4 ++--
 src/gallium/drivers/radeonsi/si_state.c       | 8 ++++----
 4 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
index 573787a..15b4da1 100644
--- a/src/gallium/drivers/radeonsi/si_descriptors.c
+++ b/src/gallium/drivers/radeonsi/si_descriptors.c
@@ -1063,7 +1063,7 @@ static void si_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource
 	/* Texture buffers - update virtual addresses in sampler view descriptors. */
 	LIST_FOR_EACH_ENTRY(view, &sctx->b.texture_buffers, list) {
 		if (view->base.texture == buf) {
-			si_desc_reset_buffer_offset(ctx, view->state, old_va, buf);
+			si_desc_reset_buffer_offset(ctx, &view->state[4], old_va, buf);
 		}
 	}
 	/* Texture buffers - update bindings. */
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
index b88f154..d2edcdf 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -90,6 +90,8 @@ struct si_sampler_view {
 	struct pipe_sampler_view	base;
 	struct list_head		list;
 	struct r600_resource		*resource;
+        /* [0..7] = image descriptor
+         * [4..7] = buffer descriptor */
 	uint32_t			state[8];
 	uint32_t			fmask_state[8];
 };
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index 52f1fa4..2c1dac9 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -1538,7 +1538,7 @@ static void tex_fetch_args(
 		/* Bitcast and truncate v8i32 to v16i8. */
 		LLVMValueRef res = si_shader_ctx->resources[sampler_index];
 		res = LLVMBuildBitCast(gallivm->builder, res, v2i128, "");
-		res = LLVMBuildExtractElement(gallivm->builder, res, bld_base->uint_bld.zero, "");
+		res = LLVMBuildExtractElement(gallivm->builder, res, bld_base->uint_bld.one, "");
 		res = LLVMBuildBitCast(gallivm->builder, res, v16i8, "");
 
 		emit_data->dst_type = LLVMVectorType(bld_base->base.elem_type, 4);
@@ -2016,7 +2016,7 @@ static void txq_fetch_args(
 		LLVMValueRef size = si_shader_ctx->resources[inst->Src[1].Register.Index];
 		size = LLVMBuildBitCast(gallivm->builder, size, v8i32, "");
 		size = LLVMBuildExtractElement(gallivm->builder, size,
-					      lp_build_const_int32(gallivm, 2), "");
+					      lp_build_const_int32(gallivm, 6), "");
 		emit_data->args[0] = size;
 		return;
 	}
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index 7086363..85954b7 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -2262,11 +2262,11 @@ static struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx
 		format = si_translate_buffer_dataformat(ctx->screen, desc, first_non_void);
 		num_format = si_translate_buffer_numformat(ctx->screen, desc, first_non_void);
 
-		view->state[0] = va;
-		view->state[1] = S_008F04_BASE_ADDRESS_HI(va >> 32) |
+		view->state[4] = va;
+		view->state[5] = S_008F04_BASE_ADDRESS_HI(va >> 32) |
 				 S_008F04_STRIDE(stride);
-		view->state[2] = state->u.buf.last_element + 1 - state->u.buf.first_element;
-		view->state[3] = S_008F0C_DST_SEL_X(si_map_swizzle(desc->swizzle[0])) |
+		view->state[6] = state->u.buf.last_element + 1 - state->u.buf.first_element;
+		view->state[7] = S_008F0C_DST_SEL_X(si_map_swizzle(desc->swizzle[0])) |
 				 S_008F0C_DST_SEL_Y(si_map_swizzle(desc->swizzle[1])) |
 				 S_008F0C_DST_SEL_Z(si_map_swizzle(desc->swizzle[2])) |
 				 S_008F0C_DST_SEL_W(si_map_swizzle(desc->swizzle[3])) |
-- 
2.1.0



More information about the mesa-dev mailing list