{"record":{"id":"48a3e10ecdc4ffe0","repo":"stride3d/stride","slug":"element-size-cannot-be-less-or-equal-0-for-structured-buffer","errorCode":null,"errorMessage":"Element size cannot be less or equal 0 for structured buffer","messagePattern":"Element size cannot be less or equal 0 for structured buffer","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Graphics/Direct3D12/Buffer.Direct3D12.cs","lineNumber":175,"sourceCode":"            var bufferFlags = bufferDescription.BufferFlags;\n            var desiredResourceState = ResourceStates.Common;\n\n            if (bufferFlags.HasFlag(BufferFlags.ConstantBuffer))\n                desiredResourceState |= ResourceStates.VertexAndConstantBuffer;\n\n            if (bufferFlags.HasFlag(BufferFlags.IndexBuffer))\n                desiredResourceState |= ResourceStates.IndexBuffer;\n\n            if (bufferFlags.HasFlag(BufferFlags.VertexBuffer))\n                desiredResourceState |= ResourceStates.VertexAndConstantBuffer;\n\n            if (bufferFlags.HasFlag(BufferFlags.ShaderResource))\n                desiredResourceState |= ResourceStates.PixelShaderResource | ResourceStates.NonPixelShaderResource;\n\n            if (bufferFlags.HasFlag(BufferFlags.StructuredBuffer))\n            {\n                if (bufferDescription.StructureByteStride <= 0)\n                    throw new ArgumentException(\"Element size cannot be less or equal 0 for structured buffer\");\n            }\n\n            if (bufferFlags.HasFlag(BufferFlags.ArgumentBuffer))\n                desiredResourceState |= ResourceStates.IndirectArgument;\n\n            var heapType = HeapType.Default;\n            IsHostVisibleHeap = false;\n            if (Usage == GraphicsResourceUsage.Staging)\n            {\n                // Per our own definition of staging resource (read-back only)\n                if (hasInitData)\n                    throw new InvalidOperationException(\"D3D12: Staging buffers can't be created with initial data.\");\n\n                heapType = HeapType.Readback;\n                desiredResourceState = ResourceStates.CopyDest;\n                IsHostVisibleHeap = true;\n            }\n            else if (Usage == GraphicsResourceUsage.Dynamic)","sourceCodeStart":157,"sourceCodeEnd":193,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Graphics/Direct3D12/Buffer.Direct3D12.cs#L157-L193","documentation":"Thrown in Buffer.Recreate on D3D12 when a buffer flagged as StructuredBuffer has StructureByteStride <= 0. A structured buffer requires a nonzero element size so the GPU knows the stride between elements; the library rejects the description with ArgumentException up front.","triggerScenarios":"Creating or recreating a Buffer with BufferFlags.StructuredBuffer while BufferDescription.StructureByteStride is 0 (default) or negative — e.g. building the description manually and forgetting to set StructureByteStride, or using a helper overload that doesn't take an element size.","commonSituations":"Porting D3D11 code where the stride was inferred from a typed format, copy-pasting a byte-buffer description and adding the StructuredBuffer flag, or serializing a description where the stride field defaulted to 0.","solutions":["Set StructureByteStride to the exact size of one element (e.g. sizeof(MyStruct)) in the BufferDescription.","Remove the StructuredBuffer flag if the buffer is a plain byte/raw buffer.","Validate the description before calling Buffer.New / Recreate."],"exampleFix":"// before\nvar desc = new BufferDescription(dataSize, BufferFlags.StructuredBuffer, ResourceUsage.Default);\n// after\nvar desc = new BufferDescription(dataSize, BufferFlags.StructuredBuffer, ResourceUsage.Default);\ndesc.StructureByteStride = Unsafe.SizeOf<MyStruct>();","handlingStrategy":"validation","validationCode":"if (desc.BufferFlags.HasFlag(BufferFlags.StructuredBuffer) && desc.StructureByteStride <= 0)\n    throw new InvalidOperationException(\"StructureByteStride must be > 0 for StructuredBuffer\");","typeGuard":"static bool IsValidStructuredBuffer(in BufferDescription d) => !d.BufferFlags.HasFlag(BufferFlags.StructuredBuffer) || d.StructureByteStride > 0;","tryCatchPattern":"try { buffer = Buffer.New(device, desc); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"structured buffer\")) { desc.StructureByteStride = elementSize; buffer = Buffer.New(device, desc); }","preventionTips":["Always construct structured buffers through a helper that takes the element type and sets StructureByteStride = sizeOf<T>().","Remember BufferDescription's default StructureByteStride is 0 — set it explicitly.","Assert stride equals the shader-side struct size to avoid silent mismatches."],"tags":["graphics","direct3d12","buffer","structured-buffer","argument-validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}