tu: Plumb CHIP thru descriptor set building

The descriptor format changes in gen8, which is mostly abstracted by
the fdl helpers.  But to utilize that we need to plumb the CHIP thru
12 layers for different ways of vk doing the same thing.

Signed-off-by: Rob Clark <rob.clark@oss.qualcomm.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39141>
This commit is contained in:
Rob Clark 2025-12-31 11:42:56 -08:00 committed by Marge Bot
parent 6f6880bcac
commit 199d5568d5
4 changed files with 97 additions and 63 deletions

View file

@ -1066,6 +1066,7 @@ r3d_clear_value(struct tu_cmd_buffer *cmd, struct tu_cs *cs, enum pipe_format fo
tu6_emit_blit_consts_load(cmd, cs, CP_LOAD_STATE6_FRAG, SB6_FS_SHADER, 0, coords, 1);
}
template <chip CHIP>
static void
r3d_src_common(struct tu_cmd_buffer *cmd,
struct tu_cs *cs,
@ -1126,6 +1127,7 @@ r3d_src_common(struct tu_cmd_buffer *cmd,
tu_cs_emit_regs(cs, A6XX_SP_PS_TSIZE(1));
}
template <chip CHIP>
static void
r3d_src(struct tu_cmd_buffer *cmd,
struct tu_cs *cs,
@ -1143,10 +1145,10 @@ r3d_src(struct tu_cmd_buffer *cmd,
fixup_src_format(&src_format, dst_format, &fmt);
desc[0] = pkt_field_set(A6XX_TEX_CONST_0_FMT, desc[0], fmt);
r3d_src_common(cmd, cs, desc,
iview->layer_size * layer,
iview->ubwc_layer_size * layer,
filter);
r3d_src_common<CHIP>(cmd, cs, desc,
iview->layer_size * layer,
iview->ubwc_layer_size * layer,
filter);
}
template <chip CHIP>
@ -1182,9 +1184,10 @@ r3d_src_buffer(struct tu_cmd_buffer *cmd,
for (uint32_t i = 6; i < FDL6_TEX_CONST_DWORDS; i++)
desc[i] = 0;
r3d_src_common(cmd, cs, desc, 0, 0, VK_FILTER_NEAREST);
r3d_src_common<CHIP>(cmd, cs, desc, 0, 0, VK_FILTER_NEAREST);
}
template <chip CHIP>
static void
r3d_src_depth(struct tu_cmd_buffer *cmd,
struct tu_cs *cs,
@ -1215,12 +1218,13 @@ r3d_src_depth(struct tu_cmd_buffer *cmd,
desc[4] = va;
desc[5] = va >> 32;
r3d_src_common(cmd, cs, desc,
iview->depth_layer_size * layer,
iview->view.ubwc_layer_size * layer,
VK_FILTER_NEAREST);
r3d_src_common<CHIP>(cmd, cs, desc,
iview->depth_layer_size * layer,
iview->view.ubwc_layer_size * layer,
VK_FILTER_NEAREST);
}
template <chip CHIP>
static void
r3d_src_stencil(struct tu_cmd_buffer *cmd,
struct tu_cs *cs,
@ -1251,10 +1255,11 @@ r3d_src_stencil(struct tu_cmd_buffer *cmd,
for (unsigned i = 6; i < FDL6_TEX_CONST_DWORDS; i++)
desc[i] = 0;
r3d_src_common(cmd, cs, desc, iview->stencil_layer_size * layer, 0,
VK_FILTER_NEAREST);
r3d_src_common<CHIP>(cmd, cs, desc, iview->stencil_layer_size * layer, 0,
VK_FILTER_NEAREST);
}
template <chip CHIP>
static void
r3d_src_load(struct tu_cmd_buffer *cmd,
struct tu_cs *cs,
@ -1293,28 +1298,30 @@ r3d_src_load(struct tu_cmd_buffer *cmd,
A6XX_TEX_CONST_0_SWIZ_Z(A6XX_TEX_Z) |
A6XX_TEX_CONST_0_SWIZ_W(A6XX_TEX_W);
r3d_src_common(cmd, cs, desc,
iview->view.layer_size * layer,
iview->view.ubwc_layer_size * layer,
VK_FILTER_NEAREST);
r3d_src_common<CHIP>(cmd, cs, desc,
iview->view.layer_size * layer,
iview->view.ubwc_layer_size * layer,
VK_FILTER_NEAREST);
}
template <chip CHIP>
static void
r3d_src_gmem_load(struct tu_cmd_buffer *cmd,
struct tu_cs *cs,
const struct tu_image_view *iview,
uint32_t layer)
{
r3d_src_load(cmd, cs, iview, layer, true);
r3d_src_load<CHIP>(cmd, cs, iview, layer, true);
}
template <chip CHIP>
static void
r3d_src_sysmem_load(struct tu_cmd_buffer *cmd,
struct tu_cs *cs,
const struct tu_image_view *iview,
uint32_t layer)
{
r3d_src_load(cmd, cs, iview, layer, false);
r3d_src_load<CHIP>(cmd, cs, iview, layer, false);
}
template <chip CHIP>
@ -1372,7 +1379,7 @@ r3d_src_gmem(struct tu_cmd_buffer *cmd,
for (unsigned i = 6; i < FDL6_TEX_CONST_DWORDS; i++)
desc[i] = 0;
r3d_src_common(cmd, cs, desc, 0, 0, VK_FILTER_NEAREST);
r3d_src_common<CHIP>(cmd, cs, desc, 0, 0, VK_FILTER_NEAREST);
}
template <chip CHIP>
@ -1792,10 +1799,10 @@ template <chip CHIP>
static const struct blit_ops r3d_ops = {
.coords = r3d_coords,
.clear_value = r3d_clear_value,
.src = r3d_src,
.src = r3d_src<CHIP>,
.src_buffer = r3d_src_buffer<CHIP>,
.src_depth = r3d_src_depth,
.src_stencil = r3d_src_stencil,
.src_depth = r3d_src_depth<CHIP>,
.src_stencil = r3d_src_stencil<CHIP>,
.dst = r3d_dst<CHIP>,
.dst_depth = r3d_dst_depth<CHIP>,
.dst_stencil = r3d_dst_stencil<CHIP>,
@ -3630,7 +3637,7 @@ resolve_sysmem(struct tu_cmd_buffer *cmd,
}
} else {
if (ops == &r3d_ops<CHIP>) {
r3d_src_sysmem_load(cmd, cs, src, i);
r3d_src_sysmem_load<CHIP>(cmd, cs, src, i);
} else {
ops->src(cmd, cs, &src->view, i, VK_FILTER_NEAREST, dst_format);
}
@ -5069,11 +5076,11 @@ load_3d_blit(struct tu_cmd_buffer *cmd,
if (iview->image->vk.format == VK_FORMAT_D32_SFLOAT_S8_UINT) {
if (separate_stencil)
r3d_src_stencil(cmd, cs, iview, i, VK_FILTER_NEAREST);
r3d_src_stencil<CHIP>(cmd, cs, iview, i, VK_FILTER_NEAREST);
else
r3d_src_depth(cmd, cs, iview, i, VK_FILTER_NEAREST);
r3d_src_depth<CHIP>(cmd, cs, iview, i, VK_FILTER_NEAREST);
} else {
r3d_src_gmem_load(cmd, cs, iview, i);
r3d_src_gmem_load<CHIP>(cmd, cs, iview, i);
}
r3d_run(cmd, cs);

View file

@ -2597,6 +2597,7 @@ tu6_emit_binning_pass(struct tu_cmd_buffer *cmd, struct tu_cs *cs,
tu_cs_emit(cs, 0x0);
}
template <chip CHIP>
static struct tu_draw_state
tu_emit_input_attachments(struct tu_cmd_buffer *cmd,
const struct tu_subpass *subpass,
@ -2763,6 +2764,7 @@ tu_emit_input_attachments(struct tu_cmd_buffer *cmd,
return ds;
}
template <chip CHIP>
static void
tu_set_input_attachments(struct tu_cmd_buffer *cmd, const struct tu_subpass *subpass)
{
@ -2770,9 +2772,9 @@ tu_set_input_attachments(struct tu_cmd_buffer *cmd, const struct tu_subpass *sub
tu_cs_emit_pkt7(cs, CP_SET_DRAW_STATE, 6);
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_INPUT_ATTACHMENTS_GMEM,
tu_emit_input_attachments(cmd, subpass, true));
tu_emit_input_attachments<CHIP>(cmd, subpass, true));
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_INPUT_ATTACHMENTS_SYSMEM,
tu_emit_input_attachments(cmd, subpass, false));
tu_emit_input_attachments<CHIP>(cmd, subpass, false));
}
static void
@ -4693,6 +4695,7 @@ tu_dirty_desc_sets(struct tu_cmd_buffer *cmd,
}
}
template <chip CHIP>
static void
tu_bind_descriptor_sets(struct tu_cmd_buffer *cmd,
const VkBindDescriptorSetsInfoKHR *info,
@ -4829,6 +4832,7 @@ tu_bind_descriptor_sets(struct tu_cmd_buffer *cmd,
tu_dirty_desc_sets(cmd, bind_point);
}
template <chip CHIP>
VKAPI_ATTR void VKAPI_CALL
tu_CmdBindDescriptorSets2KHR(
VkCommandBuffer commandBuffer,
@ -4837,15 +4841,16 @@ tu_CmdBindDescriptorSets2KHR(
VK_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
if (pBindDescriptorSetsInfo->stageFlags & VK_SHADER_STAGE_COMPUTE_BIT) {
tu_bind_descriptor_sets(cmd, pBindDescriptorSetsInfo,
VK_PIPELINE_BIND_POINT_COMPUTE);
tu_bind_descriptor_sets<CHIP>(cmd, pBindDescriptorSetsInfo,
VK_PIPELINE_BIND_POINT_COMPUTE);
}
if (pBindDescriptorSetsInfo->stageFlags & VK_SHADER_STAGE_ALL_GRAPHICS) {
tu_bind_descriptor_sets(cmd, pBindDescriptorSetsInfo,
VK_PIPELINE_BIND_POINT_GRAPHICS);
tu_bind_descriptor_sets<CHIP>(cmd, pBindDescriptorSetsInfo,
VK_PIPELINE_BIND_POINT_GRAPHICS);
}
}
TU_GENX(tu_CmdBindDescriptorSets2KHR);
VKAPI_ATTR void VKAPI_CALL
tu_CmdBindDescriptorBuffersEXT(
@ -4980,6 +4985,7 @@ tu_push_descriptor_set_update_layout(struct tu_device *device,
return VK_SUCCESS;
}
template <chip CHIP>
static void
tu_push_descriptor_set(struct tu_cmd_buffer *cmd,
const VkPushDescriptorSetInfoKHR *info,
@ -5006,9 +5012,9 @@ tu_push_descriptor_set(struct tu_cmd_buffer *cmd,
return;
}
tu_update_descriptor_sets(cmd->device, tu_descriptor_set_to_handle(set),
info->descriptorWriteCount,
info->pDescriptorWrites, 0, NULL);
tu_update_descriptor_sets<CHIP>(cmd->device, tu_descriptor_set_to_handle(set),
info->descriptorWriteCount,
info->pDescriptorWrites, 0, NULL);
memcpy(set_mem.map, set->mapped_ptr, layout->size);
set->va = set_mem.iova;
@ -5019,6 +5025,7 @@ tu_push_descriptor_set(struct tu_cmd_buffer *cmd,
NULL);
}
template <chip CHIP>
VKAPI_ATTR void VKAPI_CALL
tu_CmdPushDescriptorSet2KHR(
VkCommandBuffer commandBuffer,
@ -5027,16 +5034,18 @@ tu_CmdPushDescriptorSet2KHR(
VK_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
if (pPushDescriptorSetInfo->stageFlags & VK_SHADER_STAGE_COMPUTE_BIT) {
tu_push_descriptor_set(cmd, pPushDescriptorSetInfo,
VK_PIPELINE_BIND_POINT_COMPUTE);
tu_push_descriptor_set<CHIP>(cmd, pPushDescriptorSetInfo,
VK_PIPELINE_BIND_POINT_COMPUTE);
}
if (pPushDescriptorSetInfo->stageFlags & VK_SHADER_STAGE_ALL_GRAPHICS) {
tu_push_descriptor_set(cmd, pPushDescriptorSetInfo,
VK_PIPELINE_BIND_POINT_GRAPHICS);
tu_push_descriptor_set<CHIP>(cmd, pPushDescriptorSetInfo,
VK_PIPELINE_BIND_POINT_GRAPHICS);
}
}
TU_GENX(tu_CmdPushDescriptorSet2KHR);
template <chip CHIP>
VKAPI_ATTR void VKAPI_CALL
tu_CmdPushDescriptorSetWithTemplate2KHR(
VkCommandBuffer commandBuffer,
@ -5069,7 +5078,7 @@ tu_CmdPushDescriptorSetWithTemplate2KHR(
return;
}
tu_update_descriptor_set_with_template(
tu_update_descriptor_set_with_template<CHIP>(
cmd->device, set,
pPushDescriptorSetWithTemplateInfo->descriptorUpdateTemplate,
pPushDescriptorSetWithTemplateInfo->pData);
@ -5083,6 +5092,7 @@ tu_CmdPushDescriptorSetWithTemplate2KHR(
pPushDescriptorSetWithTemplateInfo->layout,
pPushDescriptorSetWithTemplateInfo->set, 1, desc_set, 0, NULL);
}
TU_GENX(tu_CmdPushDescriptorSetWithTemplate2KHR);
template <chip CHIP>
VKAPI_ATTR void VKAPI_CALL
@ -6775,7 +6785,7 @@ tu_emit_subpass_begin(struct tu_cmd_buffer *cmd)
tu7_emit_subpass_shading_rate<CHIP>(cmd, cmd->state.subpass, &cmd->draw_cs);
}
tu_set_input_attachments(cmd, cmd->state.subpass);
tu_set_input_attachments<CHIP>(cmd, cmd->state.subpass);
vk_cmd_set_cb_attachment_count(&cmd->vk, cmd->state.subpass->color_count);
@ -7121,6 +7131,7 @@ tu_CmdSetRenderingAttachmentLocationsKHR(
}
TU_GENX(tu_CmdSetRenderingAttachmentLocationsKHR);
template <chip CHIP>
VKAPI_ATTR void VKAPI_CALL
tu_CmdSetRenderingInputAttachmentIndicesKHR(
VkCommandBuffer commandBuffer,
@ -7174,8 +7185,9 @@ tu_CmdSetRenderingInputAttachmentIndicesKHR(
subpass->input_count = input_count;
tu_set_input_attachments(cmd, subpass);
tu_set_input_attachments<CHIP>(cmd, subpass);
}
TU_GENX(tu_CmdSetRenderingInputAttachmentIndicesKHR);
static void
tu_next_subpass_lrz(struct tu_cmd_buffer *cmd,

View file

@ -979,6 +979,7 @@ buffer_info_to_address(const VkDescriptorBufferInfo *buffer_info)
};
}
template <chip CHIP>
static void
write_buffer_descriptor_addr(const struct tu_device *device,
uint32_t *dst,
@ -1049,13 +1050,14 @@ write_buffer_descriptor_addr(const struct tu_device *device,
}
}
template <chip CHIP>
static void
write_buffer_descriptor(const struct tu_device *device,
uint32_t *dst,
const VkDescriptorBufferInfo *buffer_info)
{
VkDescriptorAddressInfoEXT addr = buffer_info_to_address(buffer_info);
write_buffer_descriptor_addr(device, dst, &addr);
write_buffer_descriptor_addr<CHIP>(device, dst, &addr);
}
static void
@ -1123,6 +1125,7 @@ write_sampler_descriptor(uint32_t *dst, VkSampler _sampler)
memcpy(dst, sampler->descriptor, sizeof(sampler->descriptor));
}
template <chip CHIP>
static void
write_accel_struct(uint32_t *dst, uint64_t va)
{
@ -1152,6 +1155,7 @@ write_sampler_push(uint32_t *dst, const struct tu_sampler *sampler)
memcpy(dst, sampler->descriptor, sizeof(sampler->descriptor));
}
template <chip CHIP>
VKAPI_ATTR void VKAPI_CALL
tu_GetDescriptorEXT(
VkDevice _device,
@ -1167,13 +1171,13 @@ tu_GetDescriptorEXT(
write_ubo_descriptor_addr(dest, pDescriptorInfo->data.pUniformBuffer);
break;
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
write_buffer_descriptor_addr(device, dest, pDescriptorInfo->data.pStorageBuffer);
write_buffer_descriptor_addr<CHIP>(device, dest, pDescriptorInfo->data.pStorageBuffer);
break;
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
TU_CALLX(device, write_texel_buffer_descriptor_addr)(dest, pDescriptorInfo->data.pUniformTexelBuffer);
write_texel_buffer_descriptor_addr<CHIP>(dest, pDescriptorInfo->data.pUniformTexelBuffer);
break;
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
TU_CALLX(device, write_texel_buffer_descriptor_addr)(dest, pDescriptorInfo->data.pStorageTexelBuffer);
write_texel_buffer_descriptor_addr<CHIP>(dest, pDescriptorInfo->data.pStorageTexelBuffer);
break;
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
write_image_descriptor(dest, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
@ -1194,9 +1198,9 @@ tu_GetDescriptorEXT(
break;
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: {
if (pDescriptorInfo->data.accelerationStructure == 0) {
write_accel_struct(dest, device->null_accel_struct_bo->iova);
write_accel_struct<CHIP>(dest, device->null_accel_struct_bo->iova);
} else {
write_accel_struct(dest, pDescriptorInfo->data.accelerationStructure);
write_accel_struct<CHIP>(dest, pDescriptorInfo->data.accelerationStructure);
}
break;
}
@ -1209,7 +1213,9 @@ tu_GetDescriptorEXT(
break;
}
}
TU_GENX(tu_GetDescriptorEXT);
template <chip CHIP>
void
tu_update_descriptor_sets(const struct tu_device *device,
VkDescriptorSet dstSetOverride,
@ -1293,7 +1299,7 @@ tu_update_descriptor_sets(const struct tu_device *device,
break;
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
write_buffer_descriptor(device, ptr, writeset->pBufferInfo + j);
write_buffer_descriptor<CHIP>(device, ptr, writeset->pBufferInfo + j);
break;
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
@ -1322,10 +1328,10 @@ tu_update_descriptor_sets(const struct tu_device *device,
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: {
VK_FROM_HANDLE(vk_acceleration_structure, accel_struct, accel_structs->pAccelerationStructures[j]);
if (accel_struct) {
write_accel_struct(ptr,
vk_acceleration_structure_get_va(accel_struct));
write_accel_struct<CHIP>(ptr,
vk_acceleration_structure_get_va(accel_struct));
} else {
write_accel_struct(ptr, device->null_accel_struct_bo->iova);
write_accel_struct<CHIP>(ptr, device->null_accel_struct_bo->iova);
}
break;
}
@ -1417,7 +1423,9 @@ tu_update_descriptor_sets(const struct tu_device *device,
}
}
}
TU_GENX(tu_update_descriptor_sets);
template <chip CHIP>
VKAPI_ATTR void VKAPI_CALL
tu_UpdateDescriptorSets(VkDevice _device,
uint32_t descriptorWriteCount,
@ -1426,10 +1434,11 @@ tu_UpdateDescriptorSets(VkDevice _device,
const VkCopyDescriptorSet *pDescriptorCopies)
{
VK_FROM_HANDLE(tu_device, device, _device);
tu_update_descriptor_sets(device, VK_NULL_HANDLE,
descriptorWriteCount, pDescriptorWrites,
descriptorCopyCount, pDescriptorCopies);
tu_update_descriptor_sets<CHIP>(device, VK_NULL_HANDLE,
descriptorWriteCount, pDescriptorWrites,
descriptorCopyCount, pDescriptorCopies);
}
TU_GENX(tu_UpdateDescriptorSets);
VKAPI_ATTR VkResult VKAPI_CALL
tu_CreateDescriptorUpdateTemplate(
@ -1591,6 +1600,7 @@ tu_DestroyDescriptorUpdateTemplate(
vk_object_free(&device->vk, pAllocator, templ);
}
template <chip CHIP>
void
tu_update_descriptor_set_with_template(
const struct tu_device *device,
@ -1627,14 +1637,14 @@ tu_update_descriptor_set_with_template(
break;
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: {
assert(!(set->layout->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR));
write_buffer_descriptor(device,
set->dynamic_descriptors + dst_offset,
(const VkDescriptorBufferInfo *) src);
write_buffer_descriptor<CHIP>(device,
set->dynamic_descriptors + dst_offset,
(const VkDescriptorBufferInfo *) src);
break;
}
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
write_buffer_descriptor(device, ptr,
(const VkDescriptorBufferInfo *) src);
write_buffer_descriptor<CHIP>(device, ptr,
(const VkDescriptorBufferInfo *) src);
break;
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
@ -1664,10 +1674,10 @@ tu_update_descriptor_set_with_template(
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: {
VK_FROM_HANDLE(vk_acceleration_structure, accel_struct, *(const VkAccelerationStructureKHR *)src);
if (accel_struct) {
write_accel_struct(ptr,
vk_acceleration_structure_get_va(accel_struct));
write_accel_struct<CHIP>(ptr,
vk_acceleration_structure_get_va(accel_struct));
} else {
write_accel_struct(ptr, device->null_accel_struct_bo->iova);
write_accel_struct<CHIP>(ptr, device->null_accel_struct_bo->iova);
}
break;
}
@ -1681,7 +1691,9 @@ tu_update_descriptor_set_with_template(
}
}
}
TU_GENX(tu_update_descriptor_set_with_template);
template <chip CHIP>
VKAPI_ATTR void VKAPI_CALL
tu_UpdateDescriptorSetWithTemplate(
VkDevice _device,
@ -1692,5 +1704,6 @@ tu_UpdateDescriptorSetWithTemplate(
VK_FROM_HANDLE(tu_device, device, _device);
VK_FROM_HANDLE(tu_descriptor_set, set, descriptorSet);
tu_update_descriptor_set_with_template(device, set, descriptorUpdateTemplate, pData);
tu_update_descriptor_set_with_template<CHIP>(device, set, descriptorUpdateTemplate, pData);
}
TU_GENX(tu_UpdateDescriptorSetWithTemplate);

View file

@ -202,6 +202,7 @@ VK_DEFINE_NONDISP_HANDLE_CASTS(tu_descriptor_update_template, base,
VkDescriptorUpdateTemplate,
VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE)
template <chip CHIP>
void
tu_update_descriptor_sets(const struct tu_device *device,
VkDescriptorSet overrideSet,
@ -210,6 +211,7 @@ tu_update_descriptor_sets(const struct tu_device *device,
uint32_t descriptorCopyCount,
const VkCopyDescriptorSet *pDescriptorCopies);
template <chip CHIP>
void
tu_update_descriptor_set_with_template(
const struct tu_device *device,