This fixes a crash in Unigine Heaven 3.0, and probably in some
others apps.
---
 src/gallium/drivers/radeonsi/radeonsi_shader.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c 
b/src/gallium/drivers/radeonsi/radeonsi_shader.c
index 97ed4e3..89c12c3 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_shader.c
+++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c
@@ -114,8 +114,12 @@ static LLVMValueRef build_indexed_load(
 {
        struct lp_build_context * base = 
&si_shader_ctx->radeon_bld.soa.bld_base.base;
 
+       LLVMValueRef indices[2] = {
+               LLVMConstInt(LLVMInt64TypeInContext(base->gallivm->context), 0, 
false),
+               offset
+       };
        LLVMValueRef computed_ptr = LLVMBuildGEP(
-               base->gallivm->builder, base_ptr, &offset, 1, "");
+               base->gallivm->builder, base_ptr, indices, 2, "");
 
        LLVMValueRef result = LLVMBuildLoad(base->gallivm->builder, 
computed_ptr, "");
        LLVMSetMetadata(result, 1, si_shader_ctx->const_md);
@@ -1578,9 +1582,13 @@ static void create_function(struct si_shader_context 
*si_shader_ctx)
        v2i32 = LLVMVectorType(i32, 2);
        v3i32 = LLVMVectorType(i32, 3);
 
-       params[SI_PARAM_CONST] = LLVMPointerType(LLVMVectorType(i8, 16), 
CONST_ADDR_SPACE);
-       params[SI_PARAM_SAMPLER] = params[SI_PARAM_CONST];
-       params[SI_PARAM_RESOURCE] = LLVMPointerType(LLVMVectorType(i8, 32), 
CONST_ADDR_SPACE);
+       params[SI_PARAM_CONST] = 
LLVMPointerType(LLVMArrayType(LLVMVectorType(i8, 16), 64), CONST_ADDR_SPACE);
+       /* We assume at most 16 textures per program at the moment.
+        * This need probably need to be changed to support bindless textures */
+       params[SI_PARAM_SAMPLER] = LLVMPointerType(
+               LLVMArrayType(LLVMVectorType(i8, 16), 16), CONST_ADDR_SPACE);
+       params[SI_PARAM_RESOURCE] = LLVMPointerType(
+               LLVMArrayType(LLVMVectorType(i8, 32), 16), CONST_ADDR_SPACE);
 
        switch (si_shader_ctx->type) {
        case TGSI_PROCESSOR_VERTEX:
@@ -1647,6 +1655,10 @@ static void create_function(struct si_shader_context 
*si_shader_ctx)
        for (i = 0; i <= last_sgpr; ++i) {
                LLVMValueRef P = 
LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, i);
                LLVMAddAttribute(P, LLVMInRegAttribute);
+               /* We tell llvm that array inputs are passed by value to allow 
Sinking pass
+                * to move load. Inputs are constant so this is fine. */
+               if (i < 3)
+                       LLVMAddAttribute(P, LLVMByValAttribute);
        }
 
 #if HAVE_LLVM >= 0x0304
-- 
1.8.3.1

_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to