From 63aba28d18cf8d5cf1829183f60cd3c28eed3d73 Mon Sep 17 00:00:00 2001 From: Sasha Szpakowski Date: Mon, 11 Mar 2024 19:14:25 -0300 Subject: [PATCH] metal: fix shader compilation when using void effect() with MRTs. --- src/modules/graphics/Shader.cpp | 14 +++++++++++++- src/modules/graphics/ShaderStage.cpp | 2 +- src/modules/graphics/metal/Shader.mm | 2 +- src/modules/graphics/vulkan/Shader.cpp | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/modules/graphics/Shader.cpp b/src/modules/graphics/Shader.cpp index 1f5a76553..696e7f3b5 100644 --- a/src/modules/graphics/Shader.cpp +++ b/src/modules/graphics/Shader.cpp @@ -26,6 +26,7 @@ // glslang #include "libraries/glslang/glslang/Public/ShaderLang.h" +#include "libraries/glslang/glslang/Public/ResourceLimits.h" // Needed for reflection information. #include "libraries/glslang/glslang/Include/Types.h" @@ -1445,7 +1446,18 @@ void Shader::handleUnknownUniformName(const char */*name*/) bool Shader::initialize() { - return glslang::InitializeProcess(); + bool success = glslang::InitializeProcess(); + if (!success) + return false; + + TBuiltInResource *resources = GetResources(); + *resources = *GetDefaultResources(); + + // This is 32 in the default resource struct, which is too high for Metal. + // TODO: Set this based on what the system actually supports? + resources->maxDrawBuffers = 8; + + return true; } void Shader::deinitialize() diff --git a/src/modules/graphics/ShaderStage.cpp b/src/modules/graphics/ShaderStage.cpp index 6b4aaf304..d079cfa96 100644 --- a/src/modules/graphics/ShaderStage.cpp +++ b/src/modules/graphics/ShaderStage.cpp @@ -62,7 +62,7 @@ ShaderStage::ShaderStage(Graphics *gfx, ShaderStageType stage, const std::string bool forwardcompat = supportsGLSL3 && !forcedefault; - if (!glslangShader->parse(GetDefaultResources(), defaultversion, defaultprofile, forcedefault, forwardcompat, EShMsgSuppressWarnings)) + if (!glslangShader->parse(GetResources(), defaultversion, defaultprofile, forcedefault, forwardcompat, EShMsgSuppressWarnings)) { const char *stagename = "unknown"; getConstant(stage, stagename); diff --git a/src/modules/graphics/metal/Shader.mm b/src/modules/graphics/metal/Shader.mm index b481236c0..316efd6fc 100644 --- a/src/modules/graphics/metal/Shader.mm +++ b/src/modules/graphics/metal/Shader.mm @@ -208,7 +208,7 @@ Shader::Shader(id device, StrongRef stag forcedefault = true; #endif - if (!tshader->parse(GetDefaultResources(), defaultversion, defaultprofile, forcedefault, forwardcompat, EShMsgSuppressWarnings)) + if (!tshader->parse(GetResources(), defaultversion, defaultprofile, forcedefault, forwardcompat, EShMsgSuppressWarnings)) { const char *stagename = "unknown"; ShaderStage::getConstant(stage, stagename); diff --git a/src/modules/graphics/vulkan/Shader.cpp b/src/modules/graphics/vulkan/Shader.cpp index f28b8bfd8..caa277d41 100644 --- a/src/modules/graphics/vulkan/Shader.cpp +++ b/src/modules/graphics/vulkan/Shader.cpp @@ -554,7 +554,7 @@ void Shader::compileShaders() bool forceDefault = false; bool forwardCompat = true; - if (!tshader->parse(GetDefaultResources(), defaultVersion, defaultProfile, forceDefault, forwardCompat, EShMsgSuppressWarnings)) + if (!tshader->parse(GetResources(), defaultVersion, defaultProfile, forceDefault, forwardCompat, EShMsgSuppressWarnings)) { const char *stageName = "unknown"; ShaderStage::getConstant(stage, stageName);