radv/ac: fix multiple descriptor sets with dynamic buffers
authorFredrik Höglund <fredrik@kde.org>
Tue, 7 Mar 2017 00:53:22 +0000 (01:53 +0100)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Tue, 7 Mar 2017 19:23:32 +0000 (20:23 +0100)
The dynamic_offset_offset in the descriptor set binding layout is
relative to the dynamic_offset_start for the set in the pipeline
layout.

Cc: 17.0 <mesa-stable@lists.freedesktop.org>
Signed-off-by: Fredrik Höglund <fredrik@kde.org>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/common/ac_nir_to_llvm.c

index e472408b0c3af9eaa5f3361897355c04dbd554e0..a1fe2dd133e13e2a227a63e060da9922423171a1 100644 (file)
@@ -1777,15 +1777,17 @@ static LLVMValueRef visit_vulkan_resource_index(struct nir_to_llvm_context *ctx,
        unsigned desc_set = nir_intrinsic_desc_set(instr);
        unsigned binding = nir_intrinsic_binding(instr);
        LLVMValueRef desc_ptr = ctx->descriptor_sets[desc_set];
-       struct radv_descriptor_set_layout *layout = ctx->options->layout->set[desc_set].layout;
+       struct radv_pipeline_layout *pipeline_layout = ctx->options->layout;
+       struct radv_descriptor_set_layout *layout = pipeline_layout->set[desc_set].layout;
        unsigned base_offset = layout->binding[binding].offset;
        LLVMValueRef offset, stride;
 
        if (layout->binding[binding].type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC ||
            layout->binding[binding].type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC) {
+               unsigned idx = pipeline_layout->set[desc_set].dynamic_offset_start +
+                       layout->binding[binding].dynamic_offset_offset;
                desc_ptr = ctx->push_constants;
-               base_offset = ctx->options->layout->push_constant_size;
-               base_offset +=  16 * layout->binding[binding].dynamic_offset_offset;
+               base_offset = pipeline_layout->push_constant_size + 16 * idx;
                stride = LLVMConstInt(ctx->i32, 16, false);
        } else
                stride = LLVMConstInt(ctx->i32, layout->binding[binding].size, false);