# HG changeset patch # User sam # Date 1737471611 -25200 # Node ID e54ef155de10051e71f1be2134586ea105a24a1b # Parent cf0bae787044d0c84ea9a9b77eb490441034ea11 add: check whether submitted vertex-attribute-arrays have all the same length diff -r cf0bae787044 -r e54ef155de10 semicongine/rendering/renderer.nim --- a/semicongine/rendering/renderer.nim Mon Jan 20 23:12:30 2025 +0700 +++ b/semicongine/rendering/renderer.nim Tue Jan 21 22:00:11 2025 +0700 @@ -1,4 +1,5 @@ import std/typetraits +import std/strformat import std/macros import std/logging @@ -284,16 +285,30 @@ for meshName, meshValue in mesh.fieldPairs: when meshName == shaderAttributeName: debug(" vertex attr: ", shaderAttributeName) + assert meshValue.buffer.vk.Valid, + "Mesh vertex-attribute '{TMesh}.{shaderAttributeName}' has no valid buffer (encountered while rendering with '{TShader}')" vertexBuffers.add meshValue.buffer.vk vertexBuffersOffsets.add meshValue.offset - elementCount = meshValue.data.len.uint32 + if elementCount == 0: + elementCount = meshValue.data.len.uint32 + else: + assert meshValue.data.len.uint32 == elementCount, + "Mesh attribute '" & $(TMesh) & "." & meshName & "' has length " & + $(meshValue.data.len) & " but previous attributes had length " & + $elementCount elif hasCustomPragma(shaderAttribute, InstanceAttribute): for instanceName, instanceValue in instances.fieldPairs: when instanceName == shaderAttributeName: debug(" instnc attr: ", shaderAttributeName) vertexBuffers.add instanceValue.buffer.vk vertexBuffersOffsets.add instanceValue.offset - instanceCount = instanceValue.data.len.uint32 + if instanceCount == 1: + instanceCount = meshValue.data.len.uint32 + else: + assert instanceValue.data.len.uint32 == instanceCount, + "Mesh instance attribute '" & $(TMesh) & "." & instanceName & "' has length " & + $(instanceValue.data.len) & " but previous attributes had length " & + $instanceCount if vertexBuffers.len > 0: vkCmdBindVertexBuffers(