radv: add a function to get compute pipeline metadata for DGC
This struct will be used to emit a compute pipeline from the prepare DGC shader. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27495>
This commit is contained in:
committed by
Marge Bot
parent
7409d7ec29
commit
6d8f88d12f
@@ -72,6 +72,44 @@ radv_get_compute_resource_limits(const struct radv_physical_device *pdevice, con
|
||||
threadgroups_per_cu);
|
||||
}
|
||||
|
||||
void
|
||||
radv_get_compute_pipeline_metadata(const struct radv_device *device, const struct radv_compute_pipeline *pipeline,
|
||||
struct radv_compute_pipeline_metadata *metadata)
|
||||
{
|
||||
const struct radv_shader *cs = pipeline->base.shaders[MESA_SHADER_COMPUTE];
|
||||
uint32_t upload_sgpr = 0, inline_sgpr = 0;
|
||||
|
||||
memset(metadata, 0, sizeof(*metadata));
|
||||
|
||||
metadata->shader_va = radv_shader_get_va(cs) >> 8;
|
||||
metadata->rsrc1 = cs->config.rsrc1;
|
||||
metadata->rsrc2 = cs->config.rsrc2;
|
||||
metadata->rsrc3 = cs->config.rsrc3;
|
||||
metadata->compute_resource_limits = radv_get_compute_resource_limits(device->physical_device, cs);
|
||||
metadata->block_size_x = cs->info.cs.block_size[0];
|
||||
metadata->block_size_y = cs->info.cs.block_size[1];
|
||||
metadata->block_size_z = cs->info.cs.block_size[2];
|
||||
metadata->wave32 = cs->info.wave_size == 32;
|
||||
|
||||
const struct radv_userdata_info *grid_size_loc = radv_get_user_sgpr(cs, AC_UD_CS_GRID_SIZE);
|
||||
if (grid_size_loc->sgpr_idx != -1) {
|
||||
metadata->grid_base_sgpr = (cs->info.user_data_0 + 4 * grid_size_loc->sgpr_idx - SI_SH_REG_OFFSET) >> 2;
|
||||
}
|
||||
|
||||
const struct radv_userdata_info *push_constant_loc = radv_get_user_sgpr(cs, AC_UD_PUSH_CONSTANTS);
|
||||
if (push_constant_loc->sgpr_idx != -1) {
|
||||
upload_sgpr = (cs->info.user_data_0 + 4 * push_constant_loc->sgpr_idx - SI_SH_REG_OFFSET) >> 2;
|
||||
}
|
||||
|
||||
const struct radv_userdata_info *inline_push_constant_loc = radv_get_user_sgpr(cs, AC_UD_INLINE_PUSH_CONSTANTS);
|
||||
if (inline_push_constant_loc->sgpr_idx != -1) {
|
||||
inline_sgpr = (cs->info.user_data_0 + 4 * inline_push_constant_loc->sgpr_idx - SI_SH_REG_OFFSET) >> 2;
|
||||
}
|
||||
|
||||
metadata->push_const_sgpr = upload_sgpr | (inline_sgpr << 16);
|
||||
metadata->inline_push_const_mask = cs->info.inline_push_constant_mask;
|
||||
}
|
||||
|
||||
void
|
||||
radv_emit_compute_shader(const struct radv_physical_device *pdevice, struct radeon_cmdbuf *cs,
|
||||
const struct radv_shader *shader)
|
||||
|
||||
@@ -3771,6 +3771,24 @@ radv_uses_image_float32_atomics(const struct radv_device *device)
|
||||
|
||||
bool radv_device_fault_detection_enabled(const struct radv_device *device);
|
||||
|
||||
struct radv_compute_pipeline_metadata {
|
||||
uint32_t shader_va;
|
||||
uint32_t rsrc1;
|
||||
uint32_t rsrc2;
|
||||
uint32_t rsrc3;
|
||||
uint32_t compute_resource_limits;
|
||||
uint32_t block_size_x;
|
||||
uint32_t block_size_y;
|
||||
uint32_t block_size_z;
|
||||
uint32_t wave32;
|
||||
uint32_t grid_base_sgpr;
|
||||
uint32_t push_const_sgpr;
|
||||
uint64_t inline_push_const_mask;
|
||||
};
|
||||
|
||||
void radv_get_compute_pipeline_metadata(const struct radv_device *device, const struct radv_compute_pipeline *pipeline,
|
||||
struct radv_compute_pipeline_metadata *metadata);
|
||||
|
||||
#define RADV_FROM_HANDLE(__radv_type, __name, __handle) VK_FROM_HANDLE(__radv_type, __name, __handle)
|
||||
|
||||
VK_DEFINE_HANDLE_CASTS(radv_cmd_buffer, vk.base, VkCommandBuffer, VK_OBJECT_TYPE_COMMAND_BUFFER)
|
||||
|
||||
Reference in New Issue
Block a user