radeonsi: fix tess levels coming as scalar arrays from SPIR-V
authorMarek Olšák <marek.olsak@amd.com>
Tue, 25 Aug 2020 17:54:38 +0000 (13:54 -0400)
committerMarge Bot <eric+marge@anholt.net>
Tue, 25 Aug 2020 21:57:51 +0000 (21:57 +0000)
This fixes: KHR-GL45.gl_spirv.spirv_modules_positive_test

Fixes: 75ce078a0af "radeonsi: enable NIR by default and document GL 4.6 support"
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6460>

src/gallium/drivers/radeonsi/si_shader_llvm_tess.c

index 627e0ffdd5d16b5fe289697b422e4140f862fbc7..13bed5f2569757d316b15c0af904daddbde64145 100644 (file)
@@ -513,7 +513,7 @@ static void si_nir_store_output_tcs(struct ac_shader_abi *abi, const struct nir_
 {
    struct si_shader_context *ctx = si_shader_context_from_abi(abi);
    struct si_shader_info *info = &ctx->shader->selector->info;
 {
    struct si_shader_context *ctx = si_shader_context_from_abi(abi);
    struct si_shader_info *info = &ctx->shader->selector->info;
-   const unsigned component = var->data.location_frac;
+   unsigned component = var->data.location_frac;
    unsigned driver_location = var->data.driver_location;
    LLVMValueRef dw_addr, stride;
    LLVMValueRef buffer, base, addr;
    unsigned driver_location = var->data.driver_location;
    LLVMValueRef dw_addr, stride;
    LLVMValueRef buffer, base, addr;
@@ -521,6 +521,12 @@ static void si_nir_store_output_tcs(struct ac_shader_abi *abi, const struct nir_
    bool skip_lds_store;
    bool is_tess_factor = false, is_tess_inner = false;
 
    bool skip_lds_store;
    bool is_tess_factor = false, is_tess_inner = false;
 
+   if (var->data.compact) {
+      component += const_index;
+      writemask <<= const_index;
+      const_index = 0;
+   }
+
    driver_location = driver_location / 4;
    ubyte name = info->output_semantic_name[driver_location];
    ubyte index = info->output_semantic_index[driver_location];
    driver_location = driver_location / 4;
    ubyte name = info->output_semantic_name[driver_location];
    ubyte index = info->output_semantic_index[driver_location];