From 5519c73f5cdc4d5f80bbfc3bfc8079be92fc5f3d Mon Sep 17 00:00:00 2001 From: Kelsi Date: Mon, 2 Mar 2026 09:00:56 -0800 Subject: [PATCH] Validate WMO GPU resources before render to prevent device lost Add null checks for vertex/index buffers, pipelines, and zero-count draws in WMO render path. The shadow pass already had buffer validation but the main render() was missing it, which could cause GPU crashes on WMO-only maps like Stockades (26 groups). --- src/rendering/wmo_renderer.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/rendering/wmo_renderer.cpp b/src/rendering/wmo_renderer.cpp index e05b17e8..18230194 100644 --- a/src/rendering/wmo_renderer.cpp +++ b/src/rendering/wmo_renderer.cpp @@ -1499,6 +1499,9 @@ void WMORenderer::render(VkCommandBuffer cmd, VkDescriptorSet perFrameSet, const if (groupDistSq < LOD_SHELL_DIST_SQ) continue; } + // Skip groups with invalid GPU resources + if (group.vertexBuffer == VK_NULL_HANDLE || group.indexBuffer == VK_NULL_HANDLE) continue; + // Bind vertex + index buffers VkDeviceSize offset = 0; vkCmdBindVertexBuffers(cmd, 0, 1, &group.vertexBuffer, &offset); @@ -1522,6 +1525,7 @@ void WMORenderer::render(VkCommandBuffer cmd, VkDescriptorSet perFrameSet, const VkPipeline targetPipeline = activePipeline; if (neededPipeline == 1) targetPipeline = transparentPipeline_; else if (neededPipeline == 2) targetPipeline = glassPipeline_; + if (targetPipeline == VK_NULL_HANDLE) continue; vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, targetPipeline); currentPipelineKind = neededPipeline; @@ -1533,6 +1537,7 @@ void WMORenderer::render(VkCommandBuffer cmd, VkDescriptorSet perFrameSet, const // Issue draw calls for each range in this merged batch for (const auto& dr : mb.draws) { + if (dr.indexCount == 0) continue; vkCmdDrawIndexed(cmd, dr.indexCount, 1, dr.firstIndex, 0, 0); lastDrawCalls++; }