diff --git a/src/modules/graphics/metal/Shader.h b/src/modules/graphics/metal/Shader.h index 51c98acf7..d5fc22638 100644 --- a/src/modules/graphics/metal/Shader.h +++ b/src/modules/graphics/metal/Shader.h @@ -81,7 +81,7 @@ public: void sendBuffers(const UniformInfo *info, love::graphics::Buffer **buffers, int count) override; bool hasUniform(const std::string &name) const override; ptrdiff_t getHandle() const override { return 0; } - void setVideoTextures(love::graphics::Texture *ytexture, love::graphics::Texture *cbtexture, love::graphics::Texture *crtexture) override {} + void setVideoTextures(love::graphics::Texture *ytexture, love::graphics::Texture *cbtexture, love::graphics::Texture *crtexture) override; id getCachedRenderPipeline(const RenderPipelineKey &key); diff --git a/src/modules/graphics/metal/Shader.mm b/src/modules/graphics/metal/Shader.mm index c3549513b..1e9385b35 100644 --- a/src/modules/graphics/metal/Shader.mm +++ b/src/modules/graphics/metal/Shader.mm @@ -172,7 +172,6 @@ Shader::Shader(id device, love::graphics::ShaderStage *vertex, love:: std::string msgs = logger.getAllMessages(); // printf("spirv length: %ld, messages:\n%s\n", spirv.size(), msgs.c_str()); - // Compile to GLSL, ready to give to GL driver. try { // printf("GLSL INPUT SOURCE:\n\n%s\n\n", pixel->getSource().c_str()); @@ -191,12 +190,6 @@ Shader::Shader(id device, love::graphics::ShaderStage *vertex, love:: int binding = msl.get_decoration(resource.id, spv::DecorationBinding); const SPIRType &type = msl.get_type(resource.base_type_id); - BuiltinUniform builtin = BUILTIN_MAX_ENUM; - if (getConstant(resource.name.c_str(), builtin)) - { - // TODO - } - auto it = uniforms.find(resource.name); if (it != uniforms.end()) { @@ -240,6 +233,10 @@ Shader::Shader(id device, love::graphics::ShaderStage *vertex, love:: } uniforms[u.name] = u; + + BuiltinUniform builtin = BUILTIN_MAX_ENUM; + if (getConstant(resource.name.c_str(), builtin)) + builtinUniformInfo[builtin] = &uniforms[u.name]; } for (const auto &resource : resources.uniform_buffers) @@ -281,13 +278,6 @@ Shader::Shader(id device, love::graphics::ShaderStage *vertex, love:: u.dataSize = membersize; u.count = std::max(1, membertype.array.size()); - BuiltinUniform builtin = BUILTIN_MAX_ENUM; - if (getConstant(u.name.c_str(), builtin)) - { - if (builtin == BUILTIN_UNIFORMS_PER_DRAW) - builtinUniformDataOffset = offset; - } - switch (membertype.basetype) { case SPIRType::Int: @@ -317,6 +307,16 @@ Shader::Shader(id device, love::graphics::ShaderStage *vertex, love:: default: break; } + + uniforms[u.name] = u; + + BuiltinUniform builtin = BUILTIN_MAX_ENUM; + if (getConstant(u.name.c_str(), builtin)) + { + if (builtin == BUILTIN_UNIFORMS_PER_DRAW) + builtinUniformDataOffset = offset; + builtinUniformInfo[builtin] = &uniforms[u.name]; + } } } @@ -477,6 +477,11 @@ void Shader::sendBuffers(const UniformInfo *info, love::graphics::Buffer **buffe // TODO } +void Shader::setVideoTextures(love::graphics::Texture *ytexture, love::graphics::Texture *cbtexture, love::graphics::Texture *crtexture) +{ + // TODO +} + bool Shader::hasUniform(const std::string &name) const { return uniforms.find(name) != uniforms.end(); diff --git a/src/modules/graphics/metal/ShaderStage.mm b/src/modules/graphics/metal/ShaderStage.mm index 19b3123c2..d940842b8 100644 --- a/src/modules/graphics/metal/ShaderStage.mm +++ b/src/modules/graphics/metal/ShaderStage.mm @@ -159,6 +159,10 @@ ShaderStage::ShaderStage(love::graphics::Graphics *gfx, StageType stage, const s glslangShader->setEnvTarget(EShTargetSpv, EShTargetSpv_1_5); glslangShader->setAutoMapLocations(true); glslangShader->setAutoMapBindings(true); + + // Needed for local uniforms to work (they will be converted into a uniform + // block). + // https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_vulkan_glsl_relaxed.txt glslangShader->setEnvInputVulkanRulesRelaxed(); const char *csrc = source.c_str();