diff --git a/src/nouveau/vulkan/nvk_cmd_dispatch.c b/src/nouveau/vulkan/nvk_cmd_dispatch.c index ac3f086d879..27fd443215c 100644 --- a/src/nouveau/vulkan/nvk_cmd_dispatch.c +++ b/src/nouveau/vulkan/nvk_cmd_dispatch.c @@ -30,8 +30,8 @@ nvk_cmd_buffer_begin_compute(struct nvk_cmd_buffer *cmd, { } static void -gv100_compute_setup_launch_desc(uint32_t *qmd, - uint32_t x, uint32_t y, uint32_t z) +qmd_set_dispatch_size(UNUSED struct nvk_device *dev, uint32_t *qmd, + uint32_t x, uint32_t y, uint32_t z) { NVC3C0_QMDV02_02_VAL_SET(qmd, CTA_RASTER_WIDTH, x); NVC3C0_QMDV02_02_VAL_SET(qmd, CTA_RASTER_HEIGHT, y); @@ -56,13 +56,9 @@ nvk_cmd_bind_compute_pipeline(struct nvk_cmd_buffer *cmd, cmd->state.cs.pipeline = pipeline; } -VKAPI_ATTR void VKAPI_CALL -nvk_CmdDispatch(VkCommandBuffer commandBuffer, - uint32_t groupCountX, - uint32_t groupCountY, - uint32_t groupCountZ) +static uint64_t +nvk_flush_compute_state(struct nvk_cmd_buffer *cmd) { - VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); const struct nvk_compute_pipeline *pipeline = cmd->state.cs.pipeline; const struct nvk_shader *shader = &pipeline->base.shaders[MESA_SHADER_COMPUTE]; @@ -74,35 +70,55 @@ nvk_CmdDispatch(VkCommandBuffer commandBuffer, desc->root.cs.block_size[0] = shader->cp.block_size[0]; desc->root.cs.block_size[1] = shader->cp.block_size[1]; desc->root.cs.block_size[2] = shader->cp.block_size[2]; - desc->root.cs.grid_size[0] = groupCountX; - desc->root.cs.grid_size[1] = groupCountY; - desc->root.cs.grid_size[2] = groupCountZ; - uint64_t root_table_addr; + uint64_t root_desc_addr; result = nvk_cmd_buffer_upload_data(cmd, &desc->root, sizeof(desc->root), NVK_MIN_UBO_ALIGNMENT, - &root_table_addr); + &root_desc_addr); if (unlikely(result != VK_SUCCESS)) { vk_command_buffer_set_error(&cmd->vk, result); - return; + return 0; } uint32_t qmd[128]; memset(qmd, 0, sizeof(qmd)); memcpy(qmd, pipeline->qmd_template, sizeof(pipeline->qmd_template)); - gv100_compute_setup_launch_desc(qmd, groupCountX, groupCountY, groupCountZ); + qmd_set_dispatch_size(nvk_cmd_buffer_device(cmd), qmd, + desc->root.cs.grid_size[0], + desc->root.cs.grid_size[1], + desc->root.cs.grid_size[2]); - gp100_cp_launch_desc_set_cb(qmd, 0, sizeof(desc->root), root_table_addr); - gp100_cp_launch_desc_set_cb(qmd, 1, sizeof(desc->root), root_table_addr); + gp100_cp_launch_desc_set_cb(qmd, 0, sizeof(desc->root), root_desc_addr); + gp100_cp_launch_desc_set_cb(qmd, 1, sizeof(desc->root), root_desc_addr); uint64_t qmd_addr; result = nvk_cmd_buffer_upload_data(cmd, qmd, sizeof(qmd), 256, &qmd_addr); if (unlikely(result != VK_SUCCESS)) { vk_command_buffer_set_error(&cmd->vk, result); - return; + return 0; } + return qmd_addr; +} + +VKAPI_ATTR void VKAPI_CALL +nvk_CmdDispatch(VkCommandBuffer commandBuffer, + uint32_t groupCountX, + uint32_t groupCountY, + uint32_t groupCountZ) +{ + VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); + struct nvk_descriptor_state *desc = &cmd->state.cs.descriptors; + + desc->root.cs.grid_size[0] = groupCountX; + desc->root.cs.grid_size[1] = groupCountY; + desc->root.cs.grid_size[2] = groupCountZ; + + uint64_t qmd_addr = nvk_flush_compute_state(cmd); + if (unlikely(qmd_addr == 0)) + return; + struct nv_push *p = nvk_cmd_buffer_push(cmd, 6); P_MTHD(p, NVA0C0, INVALIDATE_SHADER_CACHES_NO_WFI);