panvk: Implement CmdDispatchBase

Fix "dEQP-VK.compute.pipeline.device_group.dispatch_base"

Signed-off-by: Mary Guillemard <mary.guillemard@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29783>
This commit is contained in:
Mary Guillemard
2024-06-19 09:39:31 +02:00
parent 91fd031ba7
commit bbc7c76590
3 changed files with 19 additions and 15 deletions

View File

@@ -32,8 +32,10 @@ struct panvk_dispatch_info {
}; };
VKAPI_ATTR void VKAPI_CALL VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdDispatch)(VkCommandBuffer commandBuffer, uint32_t x, panvk_per_arch(CmdDispatchBase)(VkCommandBuffer commandBuffer,
uint32_t y, uint32_t z) uint32_t baseGroupX, uint32_t baseGroupY,
uint32_t baseGroupZ, uint32_t groupCountX,
uint32_t groupCountY, uint32_t groupCountZ)
{ {
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
const struct panvk_shader *shader = cmdbuf->state.compute.shader; const struct panvk_shader *shader = cmdbuf->state.compute.shader;
@@ -46,7 +48,7 @@ panvk_per_arch(CmdDispatch)(VkCommandBuffer commandBuffer, uint32_t x,
struct panvk_physical_device *phys_dev = struct panvk_physical_device *phys_dev =
to_panvk_physical_device(dev->vk.physical); to_panvk_physical_device(dev->vk.physical);
struct panvk_dispatch_info dispatch = { struct panvk_dispatch_info dispatch = {
.wg_count = {x, y, z}, .wg_count = {groupCountX, groupCountY, groupCountZ},
}; };
panvk_per_arch(cmd_close_batch)(cmdbuf); panvk_per_arch(cmd_close_batch)(cmdbuf);
@@ -64,9 +66,12 @@ panvk_per_arch(CmdDispatch)(VkCommandBuffer commandBuffer, uint32_t x,
shader->desc_info.used_set_mask); shader->desc_info.used_set_mask);
struct panvk_compute_sysvals *sysvals = &cmdbuf->state.compute.sysvals; struct panvk_compute_sysvals *sysvals = &cmdbuf->state.compute.sysvals;
sysvals->num_work_groups.x = x; sysvals->base.x = baseGroupX;
sysvals->num_work_groups.y = y; sysvals->base.y = baseGroupY;
sysvals->num_work_groups.z = z; sysvals->base.z = baseGroupZ;
sysvals->num_work_groups.x = groupCountX;
sysvals->num_work_groups.y = groupCountY;
sysvals->num_work_groups.z = groupCountZ;
sysvals->local_group_size.x = shader->local_size.x; sysvals->local_group_size.x = shader->local_size.x;
sysvals->local_group_size.y = shader->local_size.y; sysvals->local_group_size.y = shader->local_size.y;
sysvals->local_group_size.z = shader->local_size.z; sysvals->local_group_size.z = shader->local_size.z;
@@ -149,14 +154,6 @@ panvk_per_arch(CmdDispatch)(VkCommandBuffer commandBuffer, uint32_t x,
panvk_per_arch(cmd_close_batch)(cmdbuf); panvk_per_arch(cmd_close_batch)(cmdbuf);
} }
VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdDispatchBase)(VkCommandBuffer commandBuffer, uint32_t base_x,
uint32_t base_y, uint32_t base_z, uint32_t x,
uint32_t y, uint32_t z)
{
panvk_stub();
}
VKAPI_ATTR void VKAPI_CALL VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdDispatchIndirect)(VkCommandBuffer commandBuffer, panvk_per_arch(CmdDispatchIndirect)(VkCommandBuffer commandBuffer,
VkBuffer _buffer, VkDeviceSize offset) VkBuffer _buffer, VkDeviceSize offset)

View File

@@ -66,6 +66,9 @@ struct panvk_graphics_sysvals {
}; };
struct panvk_compute_sysvals { struct panvk_compute_sysvals {
struct {
uint32_t x, y, z;
} base;
struct { struct {
uint32_t x, y, z; uint32_t x, y, z;
} num_work_groups; } num_work_groups;

View File

@@ -80,6 +80,10 @@ panvk_lower_sysvals(nir_builder *b, nir_instr *instr, void *data)
#define SYSVAL(ptype, name) offsetof(struct panvk_##ptype##_sysvals, name) #define SYSVAL(ptype, name) offsetof(struct panvk_##ptype##_sysvals, name)
switch (intr->intrinsic) { switch (intr->intrinsic) {
case nir_intrinsic_load_base_workgroup_id:
val =
load_sysval_from_push_const(b, intr, SYSVAL(compute, base));
break;
case nir_intrinsic_load_num_workgroups: case nir_intrinsic_load_num_workgroups:
val = val =
load_sysval_from_push_const(b, intr, SYSVAL(compute, num_work_groups)); load_sysval_from_push_const(b, intr, SYSVAL(compute, num_work_groups));
@@ -244,7 +248,7 @@ panvk_preprocess_nir(UNUSED struct vk_physical_device *vk_pdev, nir_shader *nir)
NIR_PASS_V(nir, nir_lower_system_values); NIR_PASS_V(nir, nir_lower_system_values);
nir_lower_compute_system_values_options options = { nir_lower_compute_system_values_options options = {
.has_base_workgroup_id = false, .has_base_workgroup_id = true,
}; };
NIR_PASS_V(nir, nir_lower_compute_system_values, &options); NIR_PASS_V(nir, nir_lower_compute_system_values, &options);