radv: fix null descriptor for dynamic buffers
authorPierre-Loup A. Griffais <git@plagman.net>
Fri, 18 Sep 2020 06:27:49 +0000 (23:27 -0700)
committerMarge Bot <eric+marge@anholt.net>
Fri, 18 Sep 2020 16:30:17 +0000 (16:30 +0000)
Fixes: c1ef225d183 "radv: handle NULL descriptors"
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6772>

src/amd/vulkan/radv_cmd_buffer.c
src/amd/vulkan/radv_descriptor_set.c

index 2b99a93..f1b077e 100644 (file)
@@ -3946,22 +3946,27 @@ void radv_CmdBindDescriptorSets(
                        assert(dyn_idx < dynamicOffsetCount);
 
                        struct radv_descriptor_range *range = set->dynamic_descriptors + j;
-                       uint64_t va = range->va + pDynamicOffsets[dyn_idx];
-                       dst[0] = va;
-                       dst[1] = S_008F04_BASE_ADDRESS_HI(va >> 32);
-                       dst[2] = no_dynamic_bounds ? 0xffffffffu : range->size;
-                       dst[3] = S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) |
-                                S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) |
-                                S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) |
-                                S_008F0C_DST_SEL_W(V_008F0C_SQ_SEL_W);
 
-                       if (cmd_buffer->device->physical_device->rad_info.chip_class >= GFX10) {
-                               dst[3] |= S_008F0C_FORMAT(V_008F0C_IMG_FORMAT_32_FLOAT) |
-                                         S_008F0C_OOB_SELECT(V_008F0C_OOB_SELECT_RAW) |
-                                         S_008F0C_RESOURCE_LEVEL(1);
+                       if (!range->va) {
+                               memset(dst, 0, 4 * 4);
                        } else {
-                               dst[3] |= S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) |
-                                         S_008F0C_DATA_FORMAT(V_008F0C_BUF_DATA_FORMAT_32);
+                               uint64_t va = range->va + pDynamicOffsets[dyn_idx];
+                               dst[0] = va;
+                               dst[1] = S_008F04_BASE_ADDRESS_HI(va >> 32);
+                               dst[2] = no_dynamic_bounds ? 0xffffffffu : range->size;
+                               dst[3] = S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) |
+                                        S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) |
+                                        S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) |
+                                        S_008F0C_DST_SEL_W(V_008F0C_SQ_SEL_W);
+
+                               if (cmd_buffer->device->physical_device->rad_info.chip_class >= GFX10) {
+                                       dst[3] |= S_008F0C_FORMAT(V_008F0C_IMG_FORMAT_32_FLOAT) |
+                                                 S_008F0C_OOB_SELECT(V_008F0C_OOB_SELECT_RAW) |
+                                                 S_008F0C_RESOURCE_LEVEL(1);
+                               } else {
+                                       dst[3] |= S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) |
+                                                 S_008F0C_DATA_FORMAT(V_008F0C_BUF_DATA_FORMAT_32);
+                               }
                        }
 
                        cmd_buffer->push_constant_stages |=
index e4634ee..9ce4e06 100644 (file)
@@ -948,8 +948,10 @@ static void write_dynamic_buffer_descriptor(struct radv_device *device,
        uint64_t va;
        unsigned size;
 
-       if (!buffer)
+       if (!buffer) {
+               range->va = 0;
                return;
+       }
 
        va = radv_buffer_get_va(buffer->bo);
        size = buffer_info->range;