diff --git a/src/dawn_native/metal/CommandBufferMTL.mm b/src/dawn_native/metal/CommandBufferMTL.mm index 4b389bf210..176186df3e 100644 --- a/src/dawn_native/metal/CommandBufferMTL.mm +++ b/src/dawn_native/metal/CommandBufferMTL.mm @@ -30,6 +30,8 @@ #include "dawn_native/metal/TextureMTL.h" #include "dawn_native/metal/UtilsMetal.h" +#include + namespace dawn_native { namespace metal { namespace { @@ -272,7 +274,7 @@ namespace dawn_native { namespace metal { // The lengths of buffers are stored as 32bit integers because that is the width the // MSL code generated by SPIRV-Cross expects. - PerStage> data; + PerStage> data; void Apply(id render, RenderPipeline* pipeline, @@ -292,6 +294,10 @@ namespace dawn_native { namespace metal { bufferCount += pipeline->GetVertexBufferCount(); } +#ifdef TINT_EXPECTS_UBOS_TO_BE_MULTIPLE_OF_16 + bufferCount = Align(bufferCount, 4); + ASSERT(bufferCount <= data[SingleShaderStage::Vertex].size()); +#endif [render setVertexBytes:data[SingleShaderStage::Vertex].data() length:sizeof(uint32_t) * bufferCount atIndex:kBufferLengthBufferSlot]; @@ -300,6 +306,10 @@ namespace dawn_native { namespace metal { if (stagesToApply & wgpu::ShaderStage::Fragment) { uint32_t bufferCount = ToBackend(pipeline->GetLayout()) ->GetBufferBindingCount(SingleShaderStage::Fragment); +#ifdef TINT_EXPECTS_UBOS_TO_BE_MULTIPLE_OF_16 + bufferCount = Align(bufferCount, 4); + ASSERT(bufferCount <= data[SingleShaderStage::Fragment].size()); +#endif [render setFragmentBytes:data[SingleShaderStage::Fragment].data() length:sizeof(uint32_t) * bufferCount atIndex:kBufferLengthBufferSlot]; @@ -320,6 +330,10 @@ namespace dawn_native { namespace metal { uint32_t bufferCount = ToBackend(pipeline->GetLayout()) ->GetBufferBindingCount(SingleShaderStage::Compute); +#ifdef TINT_EXPECTS_UBOS_TO_BE_MULTIPLE_OF_16 + bufferCount = Align(bufferCount, 4); + ASSERT(bufferCount <= data[SingleShaderStage::Compute].size()); +#endif [compute setBytes:data[SingleShaderStage::Compute].data() length:sizeof(uint32_t) * bufferCount atIndex:kBufferLengthBufferSlot];