From ed14c24bd7fb97dcc6fcab710adccd4ffedbbf91 Mon Sep 17 00:00:00 2001 From: Zheorgyan <52031840+Zheorgyan@users.noreply.github.com> Date: Thu, 8 Oct 2026 14:43:17 +0200 Subject: [PATCH] test(agc): skip the exec host lanes vertex draw without vertex subgroups --- .../prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp | 1 + core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp | 4 ++++ .../prx/libSceAgcDriver/tests/execution/ExecHostLanes.cpp | 2 ++ 3 files changed, 7 insertions(+) diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp index ca9536125..da3315287 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp +++ b/core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp @@ -162,6 +162,7 @@ public: bool PrimitiveListRestart() const; bool SamplerFilterMinmax() const; bool ConservativeRasterization() const; + VkShaderStageFlags SubgroupStages() const; // A presentation is a few steps so the presenter holds GuestMemory::GpuMutex only while it // touches the queue. Presentations are slots (FlipInFlight() + 1, each with its own command // buffer, fence, kept resident image and dump buffer): RetirePresents(keep) (no mutex) retires diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp index 98f53f726..eaeeab7af 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp @@ -2450,6 +2450,10 @@ bool VulkanDevice::ConservativeRasterization() const { return state->conservativeRasterization; } +VkShaderStageFlags VulkanDevice::SubgroupStages() const { + return state->subgroup.supportedStages; +} + Graphics::Context VulkanDevice::graphicsContext() const { static const bool noCache = std::getenv("APS5_NO_CONTEXT_CACHE") != nullptr; if (state->contextReady && !noCache) return state->context; diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/ExecHostLanes.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/ExecHostLanes.cpp index 9d1cbec5b..1978891b9 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/ExecHostLanes.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/ExecHostLanes.cpp @@ -169,6 +169,8 @@ int main() { Check("compute lane", Threads); if (device->Target().subgroupSize < 32u) { std::printf("vertex draw skipped, subgroup size %u cannot hold a wave32\n", device->Target().subgroupSize); + } else if ((device->SubgroupStages() & VK_SHADER_STAGE_VERTEX_BIT) == 0u) { + std::puts("vertex draw skipped, the device has no subgroup operations in vertex shaders"); } else { Draw(*device); Check("vertex", Vertices);