{"record":{"id":"7b9910bdf1b53341","repo":"stride3d/stride","slug":"expecting-a-buffer-supporting-uav-commandlist-direct3d12","errorCode":null,"errorMessage":"Expecting a Buffer supporting UAV","messagePattern":"Expecting a Buffer supporting UAV","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Graphics/Direct3D12/CommandList.Direct3D12.cs","lineNumber":1216,"sourceCode":"\n            currentCommandList.NativeCommandList.ClearRenderTargetView(renderTarget.NativeRenderTargetView, ref clearColorFloats,\n                                                                        NumRects: 0, in nullRect);\n            RecordDebugCounter(DebugCounterKind.Clear);\n        }\n\n        /// <summary>\n        ///   Clears a Read-Write Buffer.\n        /// </summary>\n        /// <param name=\"buffer\">The Buffer to clear. It must have been created with read-write / unordered access flags.</param>\n        /// <param name=\"value\">The value to use to clear the Buffer.</param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"buffer\"/> is <see langword=\"null\"/>.</exception>\n        /// <exception cref=\"ArgumentException\"><paramref name=\"buffer\"/> must support Unordered Access.</exception>\n        public void ClearReadWrite(Buffer buffer, Vector4 value)\n        {\n            ArgumentNullException.ThrowIfNull(buffer);\n\n            if (buffer.NativeUnorderedAccessView.Ptr == 0)\n                throw new ArgumentException(\"Expecting a Buffer supporting UAV\", nameof(buffer));\n\n            ResourceBarrierTransition(buffer, BarrierLayout.UnorderedAccess);\n            FlushResourceBarriers();\n\n            var cpuHandle = buffer.NativeUnorderedAccessView;\n            var gpuHandle = GetGpuDescriptorHandle(cpuHandle);\n\n            scoped ref SilkBox2I nullRect = ref NullRef<SilkBox2I>();\n            scoped ref var clearValue = ref value.AsSpan<Vector4, float>()[0];\n\n            currentCommandList.NativeCommandList.ClearUnorderedAccessViewFloat(gpuHandle, cpuHandle, buffer.NativeResource,\n                                                                               ref clearValue, NumRects: 0, in nullRect);\n            RecordDebugCounter(DebugCounterKind.Clear);\n        }\n\n        /// <summary>\n        ///   Clears a Read-Write Buffer.\n        /// </summary>","sourceCodeStart":1198,"sourceCodeEnd":1234,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Graphics/Direct3D12/CommandList.Direct3D12.cs#L1198-L1234","documentation":"CommandList.ClearReadWrite(Buffer, Vector4) clears a GPU buffer via its Unordered Access View (UAV). On Direct3D12, the throw fires when buffer.NativeUnorderedAccessView.Ptr is 0, meaning the buffer was never created with the UnorderedAccess flag, so no UAV exists to clear through. The library refuses silently proceeding because the native clear would corrupt or do nothing.","triggerScenarios":"Calling CommandList.ClearReadWrite(buffer, value) with a Buffer whose NativeUnorderedAccessView.Ptr == 0 — i.e. the Buffer was created without BufferFlags.UnorderedAccess (e.g. a default vertex/index/staging buffer).","commonSituations":"Reusing a plain structured buffer for a compute shader read/write counter or output without the UAV flag; passing a staging or copy-source buffer because it happens to be the right size; D3D11-era code ported to D3D12 where UAV-capable buffers were implicit.","solutions":["Recreate the Buffer with BufferFlags.UnorderedAccess (e.g. Buffer.New(graphicsDevice, size, stride, BufferFlags.UnorderedAccess)).","If the buffer must serve multiple roles, include UnorderedAccess together with the other needed flags (StructuredBuffer | UnorderedAccess).","Guard the call: only call ClearReadWrite when buffer.NativeUnorderedAccessView.Ptr != 0."],"exampleFix":"// before\nvar buffer = Buffer.New(device, 1024, 16, BufferFlags.StructuredBuffer);\ncommandList.ClearReadWrite(buffer, Vector4.Zero); // throws\n\n// after\nvar buffer = Buffer.New(device, 1024, 16, BufferFlags.StructuredBuffer | BufferFlags.UnorderedAccess);\ncommandList.ClearReadWrite(buffer, Vector4.Zero);","handlingStrategy":"validation","validationCode":"if (buffer == null) throw new ArgumentNullException(nameof(buffer));\nif (buffer.NativeUnorderedAccessView.Ptr == 0)\n    throw new InvalidOperationException(\"Buffer must be created with BufferFlags.UnorderedAccess before ClearReadWrite\");","typeGuard":"bool SupportsBufferUav(Buffer b) => b != null && b.NativeUnorderedAccessView.Ptr != 0;","tryCatchPattern":"try\n{\n    commandList.ClearReadWrite(buffer, value);\n}\ncatch (ArgumentException ex) when (ex.ParamName == nameof(buffer))\n{\n    // recreate buffer with BufferFlags.UnorderedAccess or skip clear\n}","preventionTips":["Always pass BufferFlags.UnorderedAccess when a buffer will be cleared or written from compute shaders.","Centralize buffer creation in a factory that takes intended usage and maps it to flags.","Assert NativeUnorderedAccessView.Ptr != 0 in debug builds before UAV operations."],"tags":["direct3d12","graphics","uav","buffer"],"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"}