CNA-BUG-099: 24 classic SDL_GPU CTests still fail in CNA's latest recorded run; CNA's records name a cause for only three of them
Evidence basis: source-verified at the pinned commit; recorded by CNA's own run (not repeated here); tests exist (not executed for this page). Claims on this page were checked by reading the CNA source at commit 009d40f5; unless a sentence says otherwise, nothing here was built or executed. Nothing on this page was executed unless the Evidence section says so.
CNA's SDL_GPU records list 26 classic ^SdlGpu CTests still failing just before TARGET; two are analysed in their own entries. Of the other 24, covering formats, render targets, render state and recovery, the records give a cause for two (a test that clears depth on a DepthFormat::None device, and a double free in the constructor failure path), a guess for a third, and nothing for the other 21.
- Identifier
CNA-BUG-099- Category
- Bug
- Subsystem
- Graphics & renderers
- Status
- Open
- Verified against
- CNA
009d40f5(009d40f5dd085c4e674d3479675fac84b12b3e0a) - Severity
- Medium (a triage suggestion, not a project priority)
- Evidence basis
- Recorded by CNA: CNA's own recorded run, not repeated here
- Tests touching this area
- Yes: see Current tests
- Affected contract
- SDL_GPU renderer behaviour pinned by the classic ^SdlGpu CTest set (renderer examples, shared parity fixtures, EasyGL oracle cases and SdlGpuIndexedDrawRangeTest)
Expected behaviour
Each registered ^SdlGpu CTest states part of the renderer's contract; the parity fixtures and EasyGL oracle cases are the same checks other renderers are held to. SDL_GPU is declared Supported in GraphicsBackendMaturity.hpp, so a routine run of its own suite is expected to pass.
Actual behaviour at TARGET
- PSG-0009 (
plan_pre_sdlgpu_closeout.md) recorded 202 passing and 27 failing of 229 classicSDL_GPUCTests. TheSDL_GPUmodern-graphics and street workstreams re-ran the set after their changes and report "the same 27 by name" (SMG-0042: 204 / 27 of 231 with two new tests) until STREETS-0007 repairedSdlGpu_Smoke's stale checks; the last record before TARGET (STREETS-0008,plan_street_sdlgpu.md) is 26 failures, "none new". Two of the 26 are analysed elsewhere (SdlGpu_OcclusionQuery_Limitationunder CNA-BUG-012,SdlGpu_2D_HeadlessDriverunder CNA-BUG-203). The other 24, grouped here by name only: - Formats and targets:
SdlGpu_Texture2D_FormatMatrix,SdlGpu_Texture2D_FormatMatrixFallback,SdlGpu_TextureCube_FormatMatrix,SdlGpu_TextureCube_FormatMatrixFallback,SdlGpu_Parity_compressed_cube,SdlGpu_Parity_compressed_cube_fallback,SdlGpu_RenderTargetCube_Formats,SdlGpu_RenderTargetCube_MsaaMip,SdlGpu_RenderTarget_SetData,SdlGpu_TextureFilterMipContract,SdlGpu_EasyGLOracle_surface_format_throws. - State and draws:
SdlGpu_RenderState,SdlGpu_DepthBias,SdlGpu_Deferred_Scissor,SdlGpu_DrawLineTopology,SdlGpu_EasyGLOracle_depthstencilstate_stencil_twosided,SdlGpu_EasyGLOracle_draw_range_validation,SdlGpu_Parity_dual_texture_terms,SdlGpuIndexedDrawRangeTest.MutatingSourceBuffersAfterQueuingDoesNotChangeQueuedDraws,SdlGpuIndexedDrawRangeTest.RejectsIndexedRangesOutsideTheBoundBuffers. - Device, presentation and lifetime:
SdlGpu_BackbufferFormat,SdlGpu_ConstructorExceptionSafety,SdlGpu_SwapchainRecovery,SdlGpu_DepthlessCube_SpriteBatchCompatibility. - CNA's records name a cause for only three of the 24.
SdlGpu_BackbufferFormat:plan_gpu_test_isolation.md(GTI-0010) records that the test clears depth on aDepthFormat::Nonedevice, whichGraphicsDevice::Clearrefuses under XNA's rule (a stale test expectation).SdlGpu_ConstructorExceptionSafety:plan_sdlgpu_modern_graphics.md(SMG-0041 and its classic-debt backlog) records an abort with "free(): double free detected in tcache 2", identical on the unmodified renderer sources, and calls it a real bug rather than test debt; that cause is also published on its own as CNA-BUG-253.SdlGpu_Parity_dual_texture_terms: PSG-0009 only suggests it may be the XNA opaque-black null-texture rule. The other 21 have no recorded cause.
Source locations
plans/plan_pre_sdlgpu_closeout.md— PSG-0009: the 27 failing classic SDL_GPU CTests by name; PSG-0010: the configuration they belong toplans/plan_street_sdlgpu.md— STREETS-0007 and STREETS-0008: the same set re-run, 26 failures remainplans/plan_sdlgpu_modern_graphics.md— SMG-0042 and earlier re-runs: the 27 failures identical by nameplans/plan_sdlgpu.md— SDLGPU-11: SdlGpu_SwapchainRecovery recorded passing when it was addedmodules/renderers/sdl-gpu/examples/CMakeLists.txt— registrations of the SdlGpu_* example, parity and EasyGL-oracle CTestsmodules/graphics/tests/Microsoft/Xna/Framework/Graphics/SdlGpuIndexedDrawRangeTests.cpp— the two failing SdlGpuIndexedDrawRangeTest casesmodules/core/include/CNA/GraphicsBackendMaturity.hpp— SDL_GPU declared Supported
Evidence
CNA's own record executed the set, on one machine: tools/platform/run_gpu_tests_private.sh (private Weston and rootful Xwayland), an AMD Radeon 780M under RADV Mesa 25.0.7, SDL_gpu on its Vulkan driver, a Release build with CNA_SDL_GPU_SHADERCROSS=OFF and libshaderc present (PSG-0010). The record calls them "Real renderer results, none of them a dead test", and STREETS-0008 re-ran all 27 on a stashed baseline to show they predate its change. No per-test output or cause is kept in the tree, except PSG-0009's remark that SdlGpu_Parity_dual_texture_terms may be the XNA opaque-black null-texture rule that WebGPU's twin failed until WMG-0025. SdlGpu_SwapchainRecovery passed 5/5 when SDLGPU-11 added it, so at least that one regressed later. Nothing was re-run for this entry: whether each failure is a renderer defect or a stale expectation is not established, which is why this entry is one cluster rather than 24 diagnoses. No CI workflow runs any SDL_GPU test.
A record from twelve days before that baseline points the other way: the closeout row of plans/plan_sdlgpu.md (2026-09-11, the sweep after SDLGPU-133) reports all 194 registered native SDL_GPU integration CTests passing sequentially with SDL_VIDEODRIVER=offscreen and no display, while the classic baseline above (PSG-0009, 2026-09-23) was taken under a private Weston and Xwayland. The two records count different sets (194 registrations against 229 tests matching ^SdlGpu) and neither says whether the difference is a regression after 11 September or the display route, so this entry reports the failures as recorded and does not attribute them.
Independent re-verification: CNA's own record executed the set, on one machine: run_gpu_tests_private.sh (private Weston and rootful Xwayland), an AMD Radeon 780M under RADV Mesa 25.0.7, SDL_gpu on its Vulkan driver, a Release build with CNA_SDL_GPU_SHADERCROSS=OFF and libshaderc present (PSG-0010). The record calls them "Real renderer results, none of them a dead test", and STREETS-0008 re-ran all 27 on a stashed baseline to show they predate its change. Nothing was re-run for this entry: the evidence is recorded by CNA, not reproduced here, and whether each failure is a renderer defect, a stale expectation or specific to that machine is not established. Earlier records were greener: remediation/REMEDIATION_INDEX.md (REMED-GFX-180, 2026-07-31) reports a fully green 102-test SDL_GPU shard, and SdlGpu_SwapchainRecovery passed 5/5 when SDLGPU-11 added it, so some of these are later regressions or environment-specific. No CI workflow runs any SDL_GPU test.
Focused reproduction
# The command CNA's own record uses; not executed for this entry.
tools/platform/run_gpu_tests_private.sh cmake-build-sdlgpu -R '^SdlGpu' -j4
Current tests
The failing CTests themselves, registered in modules/renderers/sdl-gpu/examples/CMakeLists.txt and SdlGpuIndexedDrawRangeTests.cpp. They run only where someone runs the classic set on a GPU host; no workflow names SDL_GPU.
Regression test
The tests exist; what is missing is triage. Record each failure's cause in the SDL_GPU plan, fix the renderer or the stale expectation so the CTest turns green, and put the classic ^SdlGpu set behind a recorded gate (a GPU-capable CI lane or a release checklist) so the count cannot silently stay at 26.
Blast radius
SDL_GPU only. The areas these tests pin (texture and cube-map formats and their fallbacks, compressed cubes, cube render targets with MSAA and mips, RenderTarget2D SetData, filtering and mips, render state, depth bias, deferred scissor, line topology, two-sided stencil, draw-range validation, dual-texture terms, indexed draw ranges, back-buffer formats, constructor exception safety and swapchain recovery) may diverge from the tested contract. Which of them affect a real game is unknown until each is triaged. Other renderers are unaffected.
Workaround
No workaround is known.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.
- User guide
- Verification: renderers
- Internals
- SDL_gpu renderer internals: tests
- Maintainer workflow
- Fix a renderer bug: triage
- Tests and validation
- Test architecture: GPU tests
- Deep dives
- Evidence tiers of the native modern GPU renderers · SDL_GPU shader intake, pipeline keys and draw order · SDL_GPU uploads, render-target lifetime and swapchain recovery
- Known issues
- Bug index