diff --git a/.pick_status.json b/.pick_status.json index 0eb40bfc08d..a4c6bec1bd4 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1318,7 +1318,7 @@ "description": "radv: fix null descriptor for dynamic buffers", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "c1ef225d18332ed4800191d686dc1527e8156544" }, diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index af68af599a3..a8fd9ab24f1 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -3619,22 +3619,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 |= diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c index 6564a2aee38..93b1f7747c5 100644 --- a/src/amd/vulkan/radv_descriptor_set.c +++ b/src/amd/vulkan/radv_descriptor_set.c @@ -928,8 +928,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;