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"); }