diff --git a/src/graphics/guest_gpu/command_processor/pm4Handlers.cpp b/src/graphics/guest_gpu/command_processor/pm4Handlers.cpp index bed933c0..f8ec573e 100644 --- a/src/graphics/guest_gpu/command_processor/pm4Handlers.cpp +++ b/src/graphics/guest_gpu/command_processor/pm4Handlers.cpp @@ -1360,10 +1360,6 @@ static void HwShSetCsRegister(CommandProcessor& cp, uint32_t cmd_offset, uint32_ Pm4::COMPUTE_PGM_RSRC1_BULKY_MASK) != 0u; cs_regs.threadgroup_configuration = ((value >> Pm4::COMPUTE_PGM_RSRC1_WGP_MODE_SHIFT) & Pm4::COMPUTE_PGM_RSRC1_WGP_MODE_MASK) != 0u; - cs_regs.wave_size = (((value >> Pm4::COMPUTE_PGM_RSRC1_W32_EN_SHIFT) & - Pm4::COMPUTE_PGM_RSRC1_W32_EN_MASK) != 0u) - ? 32u - : 64u; break; case Pm4::COMPUTE_PGM_RSRC2: cs_regs.scratch_en = ((value >> Pm4::COMPUTE_PGM_RSRC2_SCRATCH_EN_SHIFT) & diff --git a/src/graphics/guest_gpu/graphicsRun.cpp b/src/graphics/guest_gpu/graphicsRun.cpp index abf6ab1d..77ad9045 100644 --- a/src/graphics/guest_gpu/graphicsRun.cpp +++ b/src/graphics/guest_gpu/graphicsRun.cpp @@ -1108,6 +1108,8 @@ void CommandProcessor::DrawIndirectMulti(uint32_t data_offset, uint32_t max_coun void CommandProcessor::DispatchDirect(uint32_t thread_group_x, uint32_t thread_group_y, uint32_t thread_group_z, uint32_t mode) { + m_sh_ctx.SetCsWaveSize(Pm4::ComputeWaveSize(mode)); + uint32_t frame_num = 0; // uint32_t local_x = 1; // uint32_t local_y = 1; diff --git a/src/graphics/guest_gpu/hardwareContext.h b/src/graphics/guest_gpu/hardwareContext.h index b7f46ac1..e1a2f974 100644 --- a/src/graphics/guest_gpu/hardwareContext.h +++ b/src/graphics/guest_gpu/hardwareContext.h @@ -1089,6 +1089,7 @@ public: void SetPsShaderChksum(uint32_t value) { m_ps.ps_regs.chksum = value; } void SetCsShader(const CsStageRegisters& cs_regs) { m_cs.cs_regs = cs_regs; } + void SetCsWaveSize(uint8_t wave_size) { m_cs.cs_regs.wave_size = wave_size; } void SetPsUserSgpr(uint32_t id, uint32_t value, UserSgprType type) { m_ps.ps_user_sgpr.value[id] = value; diff --git a/src/graphics/guest_gpu/pm4.h b/src/graphics/guest_gpu/pm4.h index 1d31c7dd..e11a1153 100644 --- a/src/graphics/guest_gpu/pm4.h +++ b/src/graphics/guest_gpu/pm4.h @@ -984,8 +984,16 @@ constexpr uint32_t COMPUTE_PGM_RSRC1_FP16_OVFL_SHIFT = 26; constexpr uint32_t COMPUTE_PGM_RSRC1_FP16_OVFL_MASK = 0x1; constexpr uint32_t COMPUTE_PGM_RSRC1_WGP_MODE_SHIFT = 29; constexpr uint32_t COMPUTE_PGM_RSRC1_WGP_MODE_MASK = 0x1; -constexpr uint32_t COMPUTE_PGM_RSRC1_W32_EN_SHIFT = 30; -constexpr uint32_t COMPUTE_PGM_RSRC1_W32_EN_MASK = 0x1; + +constexpr uint32_t COMPUTE_DISPATCH_INITIATOR_CS_W32_EN_SHIFT = 15; +constexpr uint32_t COMPUTE_DISPATCH_INITIATOR_CS_W32_EN_MASK = 0x1; + +[[nodiscard]] constexpr uint8_t ComputeWaveSize(uint32_t dispatch_initiator) { + return ((dispatch_initiator >> COMPUTE_DISPATCH_INITIATOR_CS_W32_EN_SHIFT) & + COMPUTE_DISPATCH_INITIATOR_CS_W32_EN_MASK) != 0u + ? 32u + : 64u; +} constexpr uint32_t COMPUTE_PGM_RSRC2 = 0x213; constexpr uint32_t COMPUTE_PGM_RSRC2_SCRATCH_EN_SHIFT = 0; diff --git a/src/graphics/host_gpu/renderer/renderCompute.cpp b/src/graphics/host_gpu/renderer/renderCompute.cpp index 97793152..4cc6baa7 100644 --- a/src/graphics/host_gpu/renderer/renderCompute.cpp +++ b/src/graphics/host_gpu/renderer/renderCompute.cpp @@ -115,7 +115,7 @@ bool ResolveComputeImageClear(const ShaderComputeInputInfo& input, uint32_t grou group_z == 1 && input.dispatch_threads_num[0] == group_x && input.dispatch_threads_num[1] == 1 && input.dispatch_threads_num[2] == 1 && input.group_id[0] && !input.group_id[1] && !input.group_id[2] && - input.thread_ids_num == 1 && input.wave_size == 32 && !input.tg_size_en && mode == 0x61u && + input.thread_ids_num == 1 && input.wave_size == 64 && !input.tg_size_en && mode == 0x61u && group_x % input.threads_num[0] == 0 && descriptor.NumRecords() == group_x; const auto size = BufferDescriptorSize(descriptor); if (!full_dispatch || size == 0) { diff --git a/tests/ShaderRecompilerComputeTests.cpp b/tests/ShaderRecompilerComputeTests.cpp index 775fcb25..bf1af39a 100644 --- a/tests/ShaderRecompilerComputeTests.cpp +++ b/tests/ShaderRecompilerComputeTests.cpp @@ -18780,14 +18780,14 @@ void CheckPs5GameExampleImageClearRuntimeShape() { compute.dispatch_threads_num[2] = 1; compute.group_id[0] = true; compute.dispatch_thread_dimensions = true; - compute.wave_size = 32; + compute.wave_size = 64; compute.thread_ids_num = 1; compute.workgroup_register = 8; const auto Compile = [&](const char *stage, const std::vector &code) { ShaderRecompiler::CompileOptions options; options.stage = ShaderType::Compute; - options.wave_size = 32; + options.wave_size = 64; options.user_data_base = 0; options.user_data_count = static_cast(user_data.size()); options.user_data = user_data.data(); diff --git a/tests/shaderCfgTests.cpp b/tests/shaderCfgTests.cpp index 42ede9aa..f63bc6fd 100644 --- a/tests/shaderCfgTests.cpp +++ b/tests/shaderCfgTests.cpp @@ -8137,23 +8137,11 @@ void TestNewShaderRecompilerU64PairLowering() { "dispatcher did not use one canonical U64 vector spill slot"); } -void TestComputeShaderInputWaveSize() { - const auto decode_wave_size = [](uint32_t rsrc1) { - const bool wave32 = (((rsrc1 >> Pm4::COMPUTE_PGM_RSRC1_W32_EN_SHIFT) & - Pm4::COMPUTE_PGM_RSRC1_W32_EN_MASK) != 0u); - return wave32 ? 32u : 64u; - }; - - constexpr uint32_t observed_wave32_rsrc1_a = 0x402c0146u; - constexpr uint32_t observed_wave32_rsrc1_b = 0x402c00c1u; - Check(decode_wave_size(observed_wave32_rsrc1_a) == 32u, - "COMPUTE_PGM_RSRC1 W32_EN bit did not match observed PS5 value A"); - Check(decode_wave_size(observed_wave32_rsrc1_b) == 32u, - "COMPUTE_PGM_RSRC1 W32_EN bit did not match observed PS5 value B"); - - constexpr uint32_t w32_en_bit = 1u << Pm4::COMPUTE_PGM_RSRC1_W32_EN_SHIFT; - Check(decode_wave_size(observed_wave32_rsrc1_a & ~w32_en_bit) == 64u, - "cleared COMPUTE_PGM_RSRC1 W32_EN bit did not decode as wave64"); +void TestComputeDispatchWaveSize() { + Check(Pm4::ComputeWaveSize(0x00000041u) == 64u, + "dispatch without CS_W32_EN did not select wave64"); + Check(Pm4::ComputeWaveSize(0x00008041u) == 32u, + "dispatch with CS_W32_EN did not select wave32"); } void TestNewShaderRecompilerBufferLoadsGuardedByExec() { @@ -11581,7 +11569,7 @@ int main() { TestNewShaderRecompilerCfgIrreducibleDispatcher(); TestNewShaderRecompilerDispatcherSpillsU32x3(); TestNewShaderRecompilerU64PairLowering(); - TestComputeShaderInputWaveSize(); + TestComputeDispatchWaveSize(); TestNewShaderRecompilerBufferLoadsGuardedByExec(); TestNewShaderRecompilerBufferAtomicsGuardedByBounds(); TestNewShaderRecompilerPixelImageSampleLodSelection();