diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_dispatch.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_dispatch.c index b3764f8bb49..e89ffc2dae5 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_dispatch.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_dispatch.c @@ -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) diff --git a/src/panfrost/vulkan/panvk_shader.h b/src/panfrost/vulkan/panvk_shader.h index 82684ac5eec..8a6be3d93cd 100644 --- a/src/panfrost/vulkan/panvk_shader.h +++ b/src/panfrost/vulkan/panvk_shader.h @@ -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; diff --git a/src/panfrost/vulkan/panvk_vX_shader.c b/src/panfrost/vulkan/panvk_vX_shader.c index 85786305490..44b3e7fb006 100644 --- a/src/panfrost/vulkan/panvk_vX_shader.c +++ b/src/panfrost/vulkan/panvk_vX_shader.c @@ -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);