diff --git a/src/nouveau/vulkan/nvk_cmd_dispatch.c b/src/nouveau/vulkan/nvk_cmd_dispatch.c index 5508c8a46f5..45150e779c3 100644 --- a/src/nouveau/vulkan/nvk_cmd_dispatch.c +++ b/src/nouveau/vulkan/nvk_cmd_dispatch.c @@ -15,6 +15,7 @@ #include "cla1c0.h" #include "clc0c0.h" #include "clc5c0.h" +#include "clcbc0.h" #include "clcdc0.h" #include "nv_push_cl90c0.h" #include "nv_push_cl9097.h" @@ -24,6 +25,7 @@ #include "nv_push_clc3c0.h" #include "nv_push_clc597.h" #include "nv_push_clc6c0.h" +#include "nv_push_clc86f.h" VkResult nvk_push_dispatch_state_init(struct nvk_queue *queue, struct nv_push *p) @@ -529,6 +531,8 @@ nvk_CmdDispatchIndirect(VkCommandBuffer commandBuffer, { VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); VK_FROM_HANDLE(nvk_buffer, buffer, _buffer); + struct nvk_device *dev = nvk_cmd_buffer_device(cmd); + const struct nvk_physical_device *pdev = nvk_device_physical(dev); uint64_t dispatch_addr = vk_buffer_address(&buffer->vk, offset); @@ -561,7 +565,11 @@ nvk_CmdDispatchIndirect(VkCommandBuffer commandBuffer, } else { p = nvk_cmd_buffer_push(cmd, 5); /* Stall the command streamer */ - __push_immd(p, SUBC_NV9097, NV906F_SET_REFERENCE, 0); + if (pdev->info.cls_compute >= HOPPER_COMPUTE_A) { + P_IMMD(p, NVC86F, WFI, 0); + } else { + __push_immd(p, SUBC_NV9097, NV906F_SET_REFERENCE, 0); + } P_1INC(p, NV9097, CALL_MME_MACRO(NVK_MME_DISPATCH_INDIRECT)); nv_push_update_count(p, sizeof(VkDispatchIndirectCommand) / 4); diff --git a/src/nouveau/vulkan/nvk_cmd_indirect.c b/src/nouveau/vulkan/nvk_cmd_indirect.c index 6eca148bf98..1b6a64b7b8d 100644 --- a/src/nouveau/vulkan/nvk_cmd_indirect.c +++ b/src/nouveau/vulkan/nvk_cmd_indirect.c @@ -13,12 +13,14 @@ #include "nir_builder.h" #include "vk_pipeline.h" +#include "clcb97.h" #include "nv_push.h" #include "nv_push_cl9097.h" #include "nv_push_cl906f.h" #include "nv_push_cla0c0.h" #include "nv_push_clb1c0.h" #include "nv_push_clc6c0.h" +#include "nv_push_clc86f.h" struct nvk_indirect_commands_layout { struct vk_object_base base; @@ -1035,7 +1037,7 @@ nvk_CmdExecuteGeneratedCommandsEXT(VkCommandBuffer commandBuffer, nvk_cmd_flush_process_state(cmd, info); nvk_cmd_process_cmds(cmd, info, &cmd->state); - struct nv_push *p = nvk_cmd_buffer_push(cmd, 5); + struct nv_push *p = nvk_cmd_buffer_push(cmd, 6); P_IMMD(p, NVA0C0, INVALIDATE_SHADER_CACHES, { .data = DATA_TRUE, .constant = CONSTANT_TRUE, @@ -1043,7 +1045,10 @@ nvk_CmdExecuteGeneratedCommandsEXT(VkCommandBuffer commandBuffer, }); if (pdev->info.cls_eng3d >= MAXWELL_COMPUTE_B) P_IMMD(p, NVB1C0, INVALIDATE_SKED_CACHES, 0); - __push_immd(p, SUBC_NV9097, NV906F_SET_REFERENCE, 0); + if (pdev->info.cls_eng3d >= HOPPER_A) + P_IMMD(p, NVC86F, WFI, 0); + else + __push_immd(p, SUBC_NV9097, NV906F_SET_REFERENCE, 0); } if (layout->stages & VK_SHADER_STAGE_COMPUTE_BIT) {