From 560756f34cec54ee6393ca3a09cf4e66ea9278b3 Mon Sep 17 00:00:00 2001 From: nmzik Date: Mon, 26 Oct 2026 00:25:26 +0100 Subject: [PATCH] graphics: skip draws of mesh shaders that exceed host mesh limits --- .../host_gpu/renderer/pipeline/pipelineCache.cpp | 11 +++++++++-- src/graphics/host_gpu/renderer/renderDraw.cpp | 5 +++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/graphics/host_gpu/renderer/pipeline/pipelineCache.cpp b/src/graphics/host_gpu/renderer/pipeline/pipelineCache.cpp index 1f41d75ae..7e63281a0 100644 --- a/src/graphics/host_gpu/renderer/pipeline/pipelineCache.cpp +++ b/src/graphics/host_gpu/renderer/pipeline/pipelineCache.cpp @@ -711,8 +711,15 @@ void PipelineCache::GetGraphicsPrograms(const CommandBuffer& command, DrawRender mesh.max_vertices > limits.maxMeshOutputVertices || mesh.max_primitives > limits.maxMeshOutputPrimitives || mesh.lds_size_dwords * sizeof(uint32_t) > limits.maxMeshSharedMemorySize) { - EXIT("mesh shader exceeds host limits: threads=%u vertices=%u primitives=%u LDS=%u\n", - host_threads, mesh.max_vertices, mesh.max_primitives, mesh.lds_size_dwords); + static std::atomic_bool warned = false; + if (!warned.exchange(true, std::memory_order_relaxed)) { + Log::WriteToConsoleAndLog( + fmt::format("Warning: skipping draws of mesh shaders that exceed host limits " + "(shader=0x{:016x} threads={} vertices={} primitives={} LDS={}).\n", + vertex_params[0].hash, host_threads, mesh.max_vertices, + mesh.max_primitives, mesh.lds_size_dwords)); + } + return; } } ShaderParams pixel_params; diff --git a/src/graphics/host_gpu/renderer/renderDraw.cpp b/src/graphics/host_gpu/renderer/renderDraw.cpp index 86f37055e..b3ba36daf 100644 --- a/src/graphics/host_gpu/renderer/renderDraw.cpp +++ b/src/graphics/host_gpu/renderer/renderDraw.cpp @@ -843,6 +843,11 @@ bool RenderExecutor::PrepareDrawRenderState(CommandBuffer& buffer, const DrawCal LogDrawPhase(draw.Name(), "GetGraphicsPrograms"); } m_context.GetPipelineCache().GetGraphicsPrograms(buffer, state); + // Vertex programs beyond the host mesh limits or with unsupported call targets are not + // compiled. + if (state.vertex_info[0].stage.module == nullptr) { + return false; + } if (draw.IsIndexed()) { LogDrawPhase(draw.Name(), "ResolveRenderColorTarget"); }