From 7851124260265b56f533fcc027c751bd205a5845 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sun, 5 Sep 2021 13:18:10 -0300 Subject: [PATCH] metal: work on storage buffers --- src/modules/graphics/metal/Graphics.mm | 10 +++++++++ src/modules/graphics/metal/Shader.mm | 29 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/modules/graphics/metal/Graphics.mm b/src/modules/graphics/metal/Graphics.mm index 23aa90113..d5230f388 100644 --- a/src/modules/graphics/metal/Graphics.mm +++ b/src/modules/graphics/metal/Graphics.mm @@ -964,6 +964,16 @@ void Graphics::applyShaderUniforms(id renderEncoder, lo if (sampindex != LOVE_UINT8_MAX) setSampler(renderEncoder, bindings, ShaderStage::STAGE_PIXEL, sampindex, sampler); } + + for (const Shader::BufferBinding &b : s->getBufferBindings()) + { + uint8 index = b.stages[ShaderStage::STAGE_VERTEX]; + if (index != LOVE_UINT8_MAX) + setBuffer(renderEncoder, bindings, ShaderStage::STAGE_VERTEX, index, b.buffer, 0); + index = b.stages[ShaderStage::STAGE_PIXEL]; + if (index != LOVE_UINT8_MAX) + setBuffer(renderEncoder, bindings, ShaderStage::STAGE_PIXEL, index, b.buffer, 0); + } } static void setVertexBuffers(id encoder, const BufferBindings *buffers, Graphics::RenderEncoderBindings &bindings) diff --git a/src/modules/graphics/metal/Shader.mm b/src/modules/graphics/metal/Shader.mm index becaaa2d7..a27bf97c1 100644 --- a/src/modules/graphics/metal/Shader.mm +++ b/src/modules/graphics/metal/Shader.mm @@ -684,6 +684,35 @@ void Shader::compileFromGLSLang(id device, const glslang::TProgram &p b.samplerStages[stageindex] = (uint8) samplerbinding; } } + + for (const auto &resource : resources.storage_buffers) + { + auto it = uniforms.find(resource.name); + if (it == uniforms.end()) + continue; + + UniformInfo &u = it->second; + + uint32 bufferbinding = msl.get_automatic_msl_resource_binding(resource.id); + if (bufferbinding == (uint32)-1) + continue; + + for (int i = 0; i < u.count; i++) + { + if (u.ints[i] == -1) + { + u.ints[i] = (int)bufferBindings.size(); + BufferBinding b = {}; + + for (uint8 &stagebinding : b.stages) + stagebinding = LOVE_UINT8_MAX; + + bufferBindings.push_back(b); + } + + bufferBindings[u.ints[i]].stages[stageindex] = (uint8) bufferbinding; + } + } } catch (std::exception &e) {