diff --git a/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp b/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp index 2dd34e74..389ee36f 100644 --- a/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp @@ -9,6 +9,8 @@ #include "BackendObject_DirectVulkan.h" #include "MG_Backend/BackendObject.h" #include "DirectVulkan.h" +#include "MG_State/GLState/FramebufferState/FramebufferObject.h" +#include "MG_State/GLState/TextureState/TextureState.h" namespace MobileGL::MG_Backend::DirectVulkan { namespace { @@ -331,10 +333,15 @@ namespace MobileGL::MG_Backend::DirectVulkan { m_dynamicParameters.MaxIntegerSamples = m_vulkanCaps.MaxIntegerSamples; m_dynamicParameters.MaxSamples = m_vulkanCaps.MaxSamples; m_dynamicParameters.MaxSampleMaskWords = m_vulkanCaps.MaxSampleMaskWords; - m_dynamicParameters.MaxTextureImageUnits = m_vulkanCaps.MaxTextureImageUnits; - m_dynamicParameters.MaxVertexTextureImageUnits = m_vulkanCaps.MaxVertexTextureImageUnits; - m_dynamicParameters.MaxComputeTextureImageUnits = m_vulkanCaps.MaxComputeTextureImageUnits; - m_dynamicParameters.MaxCombinedTextureImageUnits = m_vulkanCaps.MaxCombinedTextureImageUnits; + const Int maxSupportedTextureUnits = + static_cast(MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS); + m_dynamicParameters.MaxTextureImageUnits = std::min(m_vulkanCaps.MaxTextureImageUnits, maxSupportedTextureUnits); + m_dynamicParameters.MaxVertexTextureImageUnits = + std::min(m_vulkanCaps.MaxVertexTextureImageUnits, maxSupportedTextureUnits); + m_dynamicParameters.MaxComputeTextureImageUnits = + std::min(m_vulkanCaps.MaxComputeTextureImageUnits, maxSupportedTextureUnits); + m_dynamicParameters.MaxCombinedTextureImageUnits = + std::min(m_vulkanCaps.MaxCombinedTextureImageUnits, maxSupportedTextureUnits); m_dynamicParameters.MaxVertexAttribs = m_vulkanCaps.MaxVertexAttribs; m_dynamicParameters.MaxComputeShaderStorageBlocks = m_vulkanCaps.MaxComputeShaderStorageBlocks; m_dynamicParameters.MaxCombinedShaderStorageBlocks = m_vulkanCaps.MaxCombinedShaderStorageBlocks; @@ -347,8 +354,10 @@ namespace MobileGL::MG_Backend::DirectVulkan { m_dynamicParameters.MaxImageUnits = m_vulkanCaps.MaxImageUnits; m_dynamicParameters.MaxCombinedImageUniforms = m_vulkanCaps.MaxCombinedImageUniforms; m_dynamicParameters.MaxComputeImageUniforms = m_vulkanCaps.MaxComputeImageUniforms; - m_dynamicParameters.MaxDrawBuffers = m_vulkanCaps.MaxDrawBuffers; - m_dynamicParameters.MaxColorAttachments = m_vulkanCaps.MaxColorAttachments; + const Int maxSupportedDrawBuffers = + static_cast(MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS); + m_dynamicParameters.MaxDrawBuffers = std::min(m_vulkanCaps.MaxDrawBuffers, maxSupportedDrawBuffers); + m_dynamicParameters.MaxColorAttachments = std::min(m_vulkanCaps.MaxColorAttachments, maxSupportedDrawBuffers); m_dynamicParameters.MaxClipDistances = m_vulkanCaps.MaxClipDistances; m_dynamicParameters.MaxViewports = m_vulkanCaps.MaxViewports; m_dynamicParameters.MaxViewportWidth = m_vulkanCaps.MaxViewportWidth; diff --git a/MobileGL/MG_Test/SanityTest.cpp b/MobileGL/MG_Test/SanityTest.cpp index c462696d..c5cc3bfa 100644 --- a/MobileGL/MG_Test/SanityTest.cpp +++ b/MobileGL/MG_Test/SanityTest.cpp @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include #include #include @@ -200,6 +202,46 @@ TEST(DirectVulkanSanity, AdvertisesVoxyRequiredRenderingExtensionsWithoutRaising extensions.end()); } +TEST(DirectVulkanSanity, ClampsAdvertisedTextureAndDrawBufferLimitsToFrontendState) { + using namespace MobileGL; + + MG_Backend::DirectVulkan::BackendObject_DirectVulkan backend; + + MG_External::VulkanCapabilities highCaps; + highCaps.MaxTextureImageUnits = 256; + highCaps.MaxVertexTextureImageUnits = 256; + highCaps.MaxComputeTextureImageUnits = 256; + highCaps.MaxCombinedTextureImageUnits = 256; + highCaps.MaxDrawBuffers = 128; + highCaps.MaxColorAttachments = 128; + backend.ApplyVulkanCapabilitiesForTesting(highCaps); + + const auto& highParams = backend.GetDynamicParameters(); + EXPECT_EQ(highParams.MaxTextureImageUnits, MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS); + EXPECT_EQ(highParams.MaxVertexTextureImageUnits, MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS); + EXPECT_EQ(highParams.MaxComputeTextureImageUnits, MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS); + EXPECT_EQ(highParams.MaxCombinedTextureImageUnits, MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS); + EXPECT_EQ(highParams.MaxDrawBuffers, MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS); + EXPECT_EQ(highParams.MaxColorAttachments, MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS); + + MG_External::VulkanCapabilities lowCaps; + lowCaps.MaxTextureImageUnits = 16; + lowCaps.MaxVertexTextureImageUnits = 12; + lowCaps.MaxComputeTextureImageUnits = 10; + lowCaps.MaxCombinedTextureImageUnits = 20; + lowCaps.MaxDrawBuffers = 4; + lowCaps.MaxColorAttachments = 6; + backend.ApplyVulkanCapabilitiesForTesting(lowCaps); + + const auto& lowParams = backend.GetDynamicParameters(); + EXPECT_EQ(lowParams.MaxTextureImageUnits, 16); + EXPECT_EQ(lowParams.MaxVertexTextureImageUnits, 12); + EXPECT_EQ(lowParams.MaxComputeTextureImageUnits, 10); + EXPECT_EQ(lowParams.MaxCombinedTextureImageUnits, 20); + EXPECT_EQ(lowParams.MaxDrawBuffers, 4); + EXPECT_EQ(lowParams.MaxColorAttachments, 6); +} + TEST(DirectVulkanSanity, AdvertisesSubgroupOnlyWhenVulkanReportsUsableSupport) { using namespace MobileGL;