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
panvk_per_arch(CmdDispatch)(VkCommandBuffer commandBuffer, uint32_t x,
uint32_t y, uint32_t z)
panvk_per_arch(CmdDispatchBase)(VkCommandBuffer commandBuffer,
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);
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 =
to_panvk_physical_device(dev->vk.physical);
struct panvk_dispatch_info dispatch = {
.wg_count = {x, y, z},
.wg_count = {groupCountX, groupCountY, groupCountZ},
};
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);
struct panvk_compute_sysvals *sysvals = &cmdbuf->state.compute.sysvals;
sysvals->num_work_groups.x = x;
sysvals->num_work_groups.y = y;
sysvals->num_work_groups.z = z;
sysvals->base.x = baseGroupX;
sysvals->base.y = baseGroupY;
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.y = shader->local_size.y;
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);
}
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
panvk_per_arch(CmdDispatchIndirect)(VkCommandBuffer commandBuffer,
VkBuffer _buffer, VkDeviceSize offset)

View File

@@ -66,6 +66,9 @@ struct panvk_graphics_sysvals {
};
struct panvk_compute_sysvals {
struct {
uint32_t x, y, z;
} base;
struct {
uint32_t x, y, z;
} 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)
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:
val =
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_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);