From dfb9a99c3edbb87f2918b0f0d4abd47d52c361fa Mon Sep 17 00:00:00 2001 From: oltolm Date: Tue, 19 May 2026 00:38:25 +0200 Subject: [PATCH] Vulkan: Remove unused transform feedback extension path (#1919) --- src/Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h | 5 -- .../Latte/Renderer/Vulkan/VulkanRenderer.cpp | 49 +++---------------- .../HW/Latte/Renderer/Vulkan/VulkanRenderer.h | 15 ++---- 3 files changed, 11 insertions(+), 58 deletions(-) diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h index e670cbd1..c44a7b1c 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h @@ -192,11 +192,6 @@ VKFUNC_DEVICE(vkCmdEndRenderingKHR); // khr_present_wait VKFUNC_DEVICE(vkWaitForPresentKHR); -// transform feedback extension -VKFUNC_DEVICE(vkCmdBindTransformFeedbackBuffersEXT); -VKFUNC_DEVICE(vkCmdBeginTransformFeedbackEXT); -VKFUNC_DEVICE(vkCmdEndTransformFeedbackEXT); - // query VKFUNC_DEVICE(vkCreateQueryPool); VKFUNC_DEVICE(vkDestroyQueryPool); diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp index fe2a1e4d..796b7bda 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp @@ -646,10 +646,7 @@ VulkanRenderer::VulkanRenderer() deviceFeatures.robustBufferAccess = VK_TRUE; } - if (m_featureControl.mode.useTFEmulationViaSSBO) - { - deviceFeatures.vertexPipelineStoresAndAtomics = true; - } + deviceFeatures.vertexPipelineStoresAndAtomics = true; void* deviceExtensionFeatures = nullptr; @@ -787,7 +784,8 @@ VulkanRenderer::VulkanRenderer() m_textureReadbackBufferPtr = (uint8*)bufferPtr; // transform feedback ringbuffer - memoryManager->CreateBuffer(LatteStreamout_GetRingBufferSize(), VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | (m_featureControl.mode.useTFEmulationViaSSBO ? VK_BUFFER_USAGE_STORAGE_BUFFER_BIT : 0), 0, m_xfbRingBuffer, m_xfbRingBufferMemory); + VkBufferUsageFlags xfbRingBufferUsage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; + memoryManager->CreateBuffer(LatteStreamout_GetRingBufferSize(), xfbRingBufferUsage, 0, m_xfbRingBuffer, m_xfbRingBufferMemory); // occlusion query result buffer if (!memoryManager->CreateBuffer(OCCLUSION_QUERY_POOL_SIZE * sizeof(uint64), VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT, m_occlusionQueries.bufferQueryResults, m_occlusionQueries.memoryQueryResults)) @@ -1367,7 +1365,6 @@ bool VulkanRenderer::CheckDeviceExtensionSupport(const VkPhysicalDevice device, } info.deviceExtensions.tooling_info = isExtensionAvailable(VK_EXT_TOOLING_INFO_EXTENSION_NAME); - info.deviceExtensions.transform_feedback = isExtensionAvailable(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME); info.deviceExtensions.depth_range_unrestricted = isExtensionAvailable(VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME); info.deviceExtensions.nv_fill_rectangle = isExtensionAvailable(VK_NV_FILL_RECTANGLE_EXTENSION_NAME); info.deviceExtensions.pipeline_feedback = isExtensionAvailable(VK_EXT_PIPELINE_CREATION_FEEDBACK_EXTENSION_NAME); @@ -3714,46 +3711,14 @@ void VulkanRenderer::streamout_setupXfbBuffer(uint32 bufferIndex, sint32 ringBuf void VulkanRenderer::streamout_begin() { - if (m_featureControl.mode.useTFEmulationViaSSBO) - return; - if (m_state.hasActiveXfb == false) - m_state.hasActiveXfb = true; -} - -void VulkanRenderer::streamout_applyTransformFeedbackState() -{ - if (m_featureControl.mode.useTFEmulationViaSSBO) - return; - cemu_assert_debug(m_state.hasActiveXfb == false); - if (m_state.hasActiveXfb) - { - // set buffers - for (sint32 i = 0; i < LATTE_NUM_STREAMOUT_BUFFER; i++) - { - if (m_streamoutState.buffer[i].enabled) - { - VkBuffer tfBuffer = m_xfbRingBuffer; - VkDeviceSize tfBufferOffset = m_streamoutState.buffer[i].ringBufferOffset; - VkDeviceSize tfBufferSize = VK_WHOLE_SIZE; - vkCmdBindTransformFeedbackBuffersEXT(m_state.currentCommandBuffer, i, 1, &tfBuffer, &tfBufferOffset, &tfBufferSize); - } - } - // begin transform feedback - vkCmdBeginTransformFeedbackEXT(m_state.currentCommandBuffer, 0, 0, nullptr, nullptr); - } } void VulkanRenderer::streamout_rendererFinishDrawcall() { - if (m_state.hasActiveXfb) - { - vkCmdEndTransformFeedbackEXT(m_state.currentCommandBuffer, 0, 0, nullptr, nullptr); - m_streamoutState.buffer[0].enabled = false; - m_streamoutState.buffer[1].enabled = false; - m_streamoutState.buffer[2].enabled = false; - m_streamoutState.buffer[3].enabled = false; - m_state.hasActiveXfb = false; - } + m_streamoutState.buffer[0].enabled = false; + m_streamoutState.buffer[1].enabled = false; + m_streamoutState.buffer[2].enabled = false; + m_streamoutState.buffer[3].enabled = false; } diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h index 2c7af53b..62ecd797 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h @@ -380,9 +380,6 @@ private: uint32 offset; }currentVertexBinding[LATTE_MAX_VERTEX_BUFFERS]{}; - // transform feedback - bool hasActiveXfb{}; - // index buffer Renderer::INDEX_TYPE activeIndexType{}; uint32 activeIndexBufferIndex{}; @@ -442,7 +439,6 @@ private: { // if using new optional extensions add to CheckDeviceExtensionSupport and CreateDeviceCreateInfo bool tooling_info = false; // VK_EXT_tooling_info - bool transform_feedback = false; bool depth_range_unrestricted = false; bool nv_fill_rectangle = false; // NV_fill_rectangle bool pipeline_feedback = false; @@ -470,11 +466,6 @@ private: bool debug_utils = false; // VK_EXT_DEBUG_UTILS }instanceExtensions; - struct - { - bool useTFEmulationViaSSBO = true; // emulate transform feedback via shader writes to a storage buffer - }mode; - struct { uint32 minUniformBufferOffsetAlignment = 256; @@ -521,7 +512,10 @@ private: void DeleteFontTextures() override; bool BeginFrame(bool mainWindow) override; - bool UseTFViaSSBO() const override { return m_featureControl.mode.useTFEmulationViaSSBO; } + bool UseTFViaSSBO() const override + { + return true; + } // drawcall emulation PipelineInfo* draw_createGraphicsPipeline(uint32 indexCount); @@ -567,7 +561,6 @@ private: // streamout void streamout_setupXfbBuffer(uint32 bufferIndex, sint32 ringBufferOffset, uint32 rangeAddr, uint32 rangeSize) override; void streamout_begin() override; - void streamout_applyTransformFeedbackState(); void bufferCache_copyStreamoutToMainBuffer(uint32 srcOffset, uint32 dstOffset, uint32 size) override; void streamout_rendererFinishDrawcall() override;