{"record":{"id":"26a94ae3c43f1b9e","repo":"stride3d/stride","slug":"can-not-use-more-than-commandlist","errorCode":null,"errorMessage":"Can not use more than {CommandList.MaxViewportAndScissorRectangleCount} viewports simultaneously","messagePattern":"Can not use more than (.+?) viewports simultaneously","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Rendering/Rendering/Images/ImageEffect.cs","lineNumber":177,"sourceCode":"                var viewport = value.Value;\n                SetViewports(MemoryMarshal.CreateReadOnlySpan(ref viewport, 1));\n            }\n            else\n            {\n                SetViewports(ReadOnlySpan<Viewport>.Empty);\n            }\n        }\n\n        /// <summary>\n        /// Binds a set of viewports to the rasterizer stage.\n        /// </summary>\n        /// <param name=\"values\">The set of viewports to bind.</param>\n        /// <remarks>Only <see cref=\"CommandList\"/>'s `MaxViewportAndScissorRectangleCount` scissors can be used simultaneously</remarks>\n        public void SetViewports(ReadOnlySpan<Viewport> values)\n        {\n            if (values.Length > CommandList.MaxViewportAndScissorRectangleCount)\n            {\n                throw new ArgumentException($\"Can not use more than {CommandList.MaxViewportAndScissorRectangleCount} viewports simultaneously\");\n            }\n\n            boundViewportCount = values.Length;\n            values.CopyTo(viewports);\n        }\n\n        /// <summary>\n        /// Binds a single scissor rectangle to the rasterizer stage.\n        /// </summary>\n        /// <param name=\"value\">The scissor rectangle.</param>\n        public void SetScissorRectangle(Rectangle? value)\n        {\n            if (value.HasValue)\n            {\n                var scissor = value.Value;\n                SetScissorRectangles(MemoryMarshal.CreateReadOnlySpan(ref scissor, 1));\n            }\n            else","sourceCodeStart":159,"sourceCodeEnd":195,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Rendering/Rendering/Images/ImageEffect.cs#L159-L195","documentation":"SetViewports rejects any viewport array whose length exceeds CommandList.MaxViewportAndScissorRectangleCount (a hardware-derived constant). Passing more viewports than the graphics device supports would otherwise cause a driver-level error. The message interpolates the actual constant at runtime.","triggerScenarios":"Calling effect.SetViewports(ReadOnlySpan<Viewport>) with a span of length > MaxViewportAndScissorRectangleCount (typically 16, D3D hardware limit); called indirectly by SetViewport overloads.","commonSituations":"Rendering multiple simultaneous viewports (split-screen / shadow cascades) and miscounting; porting code from a device with a higher viewport limit; passing an unbounded list converted to a span.","solutions":["Cap the span length to CommandList.MaxViewportAndScissorRectangleCount before calling","Batch viewport groups and call SetViewports multiple times per draw where possible","Verify the constant at runtime and configure viewport arrays from it"],"exampleFix":"// before\nvar viewports = BuildAllViewports(); // 32 entries\neffect.SetViewports(viewports);\n// after\nvar viewports = BuildAllViewports();\nif (viewports.Length > CommandList.MaxViewportAndScissorRectangleCount)\n    viewports = viewports.Slice(0, CommandList.MaxViewportAndScissorRectangleCount);\neffect.SetViewports(viewports);","handlingStrategy":"validation","validationCode":"if (values.Length > CommandList.MaxViewportAndScissorRectangleCount) throw new ArgumentException(\"too many viewports\");","typeGuard":null,"tryCatchPattern":"try { effect.SetViewports(span); } catch (ArgumentException) { /* truncate span and retry */ }","preventionTips":["Derive viewport counts from CommandList.MaxViewportAndScissorRectangleCount, not hard-coded values","Batch drawing per hardware viewport limit","Clamp arrays at construction"],"tags":["argument-out-of-range","rendering","gpu-limits"],"backgroundTag":"argument-out-of-range","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}