ac/nir: Support vulkan_resource_reindex.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sun, 10 Dec 2017 22:31:45 +0000 (23:31 +0100)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Mon, 11 Dec 2017 23:16:18 +0000 (00:16 +0100)
Fixes: 93b4cb61eb2 "spirv: Allow OpPtrAccessChain for block indices"
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/amd/common/ac_nir_to_llvm.c

index 2016a5d..3d26dd3 100644 (file)
@@ -2230,6 +2230,17 @@ static LLVMValueRef visit_vulkan_resource_index(struct nir_to_llvm_context *ctx,
        return desc_ptr;
 }
 
+static LLVMValueRef visit_vulkan_resource_reindex(struct nir_to_llvm_context *ctx,
+                                                  nir_intrinsic_instr *instr)
+{
+       LLVMValueRef ptr = get_src(ctx->nir, instr->src[0]);
+       LLVMValueRef index = get_src(ctx->nir, instr->src[1]);
+
+       LLVMValueRef result = LLVMBuildGEP(ctx->builder, ptr, &index, 1, "");
+       LLVMSetMetadata(result, ctx->ac.uniform_md_kind, ctx->ac.empty_md);
+       return result;
+}
+
 static LLVMValueRef visit_load_push_constant(struct nir_to_llvm_context *ctx,
                                              nir_intrinsic_instr *instr)
 {
@@ -4123,6 +4134,9 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
        case nir_intrinsic_vulkan_resource_index:
                result = visit_vulkan_resource_index(ctx->nctx, instr);
                break;
+       case nir_intrinsic_vulkan_resource_reindex:
+               result = visit_vulkan_resource_reindex(ctx->nctx, instr);
+               break;
        case nir_intrinsic_store_ssbo:
                visit_store_ssbo(ctx, instr);
                break;