From b4ea751a2c396dce698972258eabb1a1491cf3d2 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Mon, 16 Feb 2026 00:34:08 -0400 Subject: [PATCH] [vulkan, rasterizer] Filling missing byte count handling when TFB is not available --- .../renderer_vulkan/vk_rasterizer.cpp | 17 ++++++++++++----- src/video_core/vulkan_common/vulkan_device.h | 4 +--- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 5afb526de3..658a651ddb 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -354,11 +354,18 @@ void RasterizerVulkan::DrawIndirect() { const auto& buffer = indirect_buffer.first; const auto& offset = indirect_buffer.second; if (params.is_byte_count) { - scheduler.Record([buffer_obj = buffer->Handle(), offset, - stride = params.stride](vk::CommandBuffer cmdbuf) { - cmdbuf.DrawIndirectByteCountEXT(1, 0, buffer_obj, offset, 0, - static_cast(stride)); - }); + if (!device.IsExtTransformFeedbackSupported()) { + scheduler.Record([buffer_obj = buffer->Handle(), offset, + stride = params.stride](vk::CommandBuffer cmdbuf) { + cmdbuf.DrawIndirect(buffer_obj, offset, 1, static_cast(stride)); + }); + } else { + scheduler.Record([buffer_obj = buffer->Handle(), offset, + stride = params.stride](vk::CommandBuffer cmdbuf) { + cmdbuf.DrawIndirectByteCountEXT(1, 0, buffer_obj, offset, 0, + static_cast(stride)); + }); + } return; } if (params.include_count) { diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index f47b1298af..84beeaec1b 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -542,12 +542,10 @@ public: return extensions.transform_feedback; } - /// Returns true if the device supports VK_EXT_transform_feedback. bool AreTransformFeedbackGeometryStreamsSupported() const { return features.transform_feedback.geometryStreams; } - /// Returns true if transform feedback preserves provoking vertex. bool IsTransformFeedbackProvokingVertexPreserved() const { return features.provoking_vertex.transformFeedbackPreservesProvokingVertex; } @@ -714,7 +712,7 @@ public: return has_renderdoc || has_nsight_graphics || has_radeon_gpu_profiler; } - /// @returns True if compute pipelines can cause crashing. + /// Returns true if compute pipelines can cause crashing. bool HasBrokenCompute() const { return has_broken_compute; }