diff options
| author | 2022-02-09 15:39:40 +0100 | |
|---|---|---|
| committer | 2023-01-01 16:43:57 -0500 | |
| commit | 0f89828073a541eaa2cfd985483f839bd2f97b74 (patch) | |
| tree | 3e26c71678e17ca97ec744a884f5ecb9ae2b6c5e /src/video_core/vulkan_common | |
| parent | MacroHLE: Add MultidrawIndirect HLE Macro. (diff) | |
| download | yuzu-0f89828073a541eaa2cfd985483f839bd2f97b74.tar.gz yuzu-0f89828073a541eaa2cfd985483f839bd2f97b74.tar.xz yuzu-0f89828073a541eaa2cfd985483f839bd2f97b74.zip | |
MacroHLE: Implement DrawIndexedIndirect & DrawArraysIndirect.
Diffstat (limited to 'src/video_core/vulkan_common')
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.h | 1 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_wrapper.cpp | 6 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_wrapper.h | 24 |
4 files changed, 27 insertions, 9 deletions
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 477fc428b..207fae8c9 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -351,7 +351,7 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 351 | .dualSrcBlend = true, | 351 | .dualSrcBlend = true, |
| 352 | .logicOp = true, | 352 | .logicOp = true, |
| 353 | .multiDrawIndirect = true, | 353 | .multiDrawIndirect = true, |
| 354 | .drawIndirectFirstInstance = false, | 354 | .drawIndirectFirstInstance = true, |
| 355 | .depthClamp = true, | 355 | .depthClamp = true, |
| 356 | .depthBiasClamp = true, | 356 | .depthBiasClamp = true, |
| 357 | .fillModeNonSolid = true, | 357 | .fillModeNonSolid = true, |
| @@ -1024,6 +1024,8 @@ void Device::CheckSuitability(bool requires_swapchain) const { | |||
| 1024 | std::make_pair(features.vertexPipelineStoresAndAtomics, "vertexPipelineStoresAndAtomics"), | 1024 | std::make_pair(features.vertexPipelineStoresAndAtomics, "vertexPipelineStoresAndAtomics"), |
| 1025 | std::make_pair(features.imageCubeArray, "imageCubeArray"), | 1025 | std::make_pair(features.imageCubeArray, "imageCubeArray"), |
| 1026 | std::make_pair(features.independentBlend, "independentBlend"), | 1026 | std::make_pair(features.independentBlend, "independentBlend"), |
| 1027 | std::make_pair(features.multiDrawIndirect, "multiDrawIndirect"), | ||
| 1028 | std::make_pair(features.drawIndirectFirstInstance, "drawIndirectFirstInstance"), | ||
| 1027 | std::make_pair(features.depthClamp, "depthClamp"), | 1029 | std::make_pair(features.depthClamp, "depthClamp"), |
| 1028 | std::make_pair(features.samplerAnisotropy, "samplerAnisotropy"), | 1030 | std::make_pair(features.samplerAnisotropy, "samplerAnisotropy"), |
| 1029 | std::make_pair(features.largePoints, "largePoints"), | 1031 | std::make_pair(features.largePoints, "largePoints"), |
| @@ -1117,6 +1119,7 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 1117 | test(khr_spirv_1_4, VK_KHR_SPIRV_1_4_EXTENSION_NAME, true); | 1119 | test(khr_spirv_1_4, VK_KHR_SPIRV_1_4_EXTENSION_NAME, true); |
| 1118 | test(khr_push_descriptor, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, true); | 1120 | test(khr_push_descriptor, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, true); |
| 1119 | test(has_khr_shader_float16_int8, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, false); | 1121 | test(has_khr_shader_float16_int8, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, false); |
| 1122 | test(khr_draw_indirect_count, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME, true); | ||
| 1120 | test(ext_depth_range_unrestricted, VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME, true); | 1123 | test(ext_depth_range_unrestricted, VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME, true); |
| 1121 | test(ext_index_type_uint8, VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, true); | 1124 | test(ext_index_type_uint8, VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, true); |
| 1122 | test(has_ext_primitive_topology_list_restart, | 1125 | test(has_ext_primitive_topology_list_restart, |
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 6a26c4e6e..d0d7c2299 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h | |||
| @@ -451,6 +451,7 @@ private: | |||
| 451 | bool nv_viewport_swizzle{}; ///< Support for VK_NV_viewport_swizzle. | 451 | bool nv_viewport_swizzle{}; ///< Support for VK_NV_viewport_swizzle. |
| 452 | bool nv_viewport_array2{}; ///< Support for VK_NV_viewport_array2. | 452 | bool nv_viewport_array2{}; ///< Support for VK_NV_viewport_array2. |
| 453 | bool nv_geometry_shader_passthrough{}; ///< Support for VK_NV_geometry_shader_passthrough. | 453 | bool nv_geometry_shader_passthrough{}; ///< Support for VK_NV_geometry_shader_passthrough. |
| 454 | bool khr_draw_indirect_count{}; ///< Support for VK_KHR_draw_indirect_count. | ||
| 454 | bool khr_uniform_buffer_standard_layout{}; ///< Support for scalar uniform buffer layouts. | 455 | bool khr_uniform_buffer_standard_layout{}; ///< Support for scalar uniform buffer layouts. |
| 455 | bool khr_spirv_1_4{}; ///< Support for VK_KHR_spirv_1_4. | 456 | bool khr_spirv_1_4{}; ///< Support for VK_KHR_spirv_1_4. |
| 456 | bool khr_workgroup_memory_explicit_layout{}; ///< Support for explicit workgroup layouts. | 457 | bool khr_workgroup_memory_explicit_layout{}; ///< Support for explicit workgroup layouts. |
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index c58c4c1c4..f8f8ed9f8 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp | |||
| @@ -94,8 +94,10 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { | |||
| 94 | X(vkCmdDispatch); | 94 | X(vkCmdDispatch); |
| 95 | X(vkCmdDraw); | 95 | X(vkCmdDraw); |
| 96 | X(vkCmdDrawIndexed); | 96 | X(vkCmdDrawIndexed); |
| 97 | X(vkCmdDrawIndirectCount); | 97 | X(vkCmdDrawIndirect); |
| 98 | X(vkCmdDrawIndexedIndirectCount); | 98 | X(vkCmdDrawIndexedIndirect); |
| 99 | X(vkCmdDrawIndirectCountKHR); | ||
| 100 | X(vkCmdDrawIndexedIndirectCountKHR); | ||
| 99 | X(vkCmdEndQuery); | 101 | X(vkCmdEndQuery); |
| 100 | X(vkCmdEndRenderPass); | 102 | X(vkCmdEndRenderPass); |
| 101 | X(vkCmdEndTransformFeedbackEXT); | 103 | X(vkCmdEndTransformFeedbackEXT); |
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index 9bd158dce..493a48573 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h | |||
| @@ -213,8 +213,10 @@ struct DeviceDispatch : InstanceDispatch { | |||
| 213 | PFN_vkCmdDispatch vkCmdDispatch{}; | 213 | PFN_vkCmdDispatch vkCmdDispatch{}; |
| 214 | PFN_vkCmdDraw vkCmdDraw{}; | 214 | PFN_vkCmdDraw vkCmdDraw{}; |
| 215 | PFN_vkCmdDrawIndexed vkCmdDrawIndexed{}; | 215 | PFN_vkCmdDrawIndexed vkCmdDrawIndexed{}; |
| 216 | PFN_vkCmdDrawIndirectCount vkCmdDrawIndirectCount{}; | 216 | PFN_vkCmdDrawIndirect vkCmdDrawIndirect{}; |
| 217 | PFN_vkCmdDrawIndexedIndirectCount vkCmdDrawIndexedIndirectCount{}; | 217 | PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect{}; |
| 218 | PFN_vkCmdDrawIndirectCountKHR vkCmdDrawIndirectCountKHR{}; | ||
| 219 | PFN_vkCmdDrawIndexedIndirectCountKHR vkCmdDrawIndexedIndirectCountKHR{}; | ||
| 218 | PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT{}; | 220 | PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT{}; |
| 219 | PFN_vkCmdEndQuery vkCmdEndQuery{}; | 221 | PFN_vkCmdEndQuery vkCmdEndQuery{}; |
| 220 | PFN_vkCmdEndRenderPass vkCmdEndRenderPass{}; | 222 | PFN_vkCmdEndRenderPass vkCmdEndRenderPass{}; |
| @@ -1021,17 +1023,27 @@ public: | |||
| 1021 | first_instance); | 1023 | first_instance); |
| 1022 | } | 1024 | } |
| 1023 | 1025 | ||
| 1026 | void DrawIndirect(VkBuffer src_buffer, VkDeviceSize src_offset, u32 draw_count, | ||
| 1027 | u32 stride) const noexcept { | ||
| 1028 | dld->vkCmdDrawIndirect(handle, src_buffer, src_offset, draw_count, stride); | ||
| 1029 | } | ||
| 1030 | |||
| 1031 | void DrawIndexedIndirect(VkBuffer src_buffer, VkDeviceSize src_offset, u32 draw_count, | ||
| 1032 | u32 stride) const noexcept { | ||
| 1033 | dld->vkCmdDrawIndexedIndirect(handle, src_buffer, src_offset, draw_count, stride); | ||
| 1034 | } | ||
| 1035 | |||
| 1024 | void DrawIndirectCount(VkBuffer src_buffer, VkDeviceSize src_offset, VkBuffer count_buffer, | 1036 | void DrawIndirectCount(VkBuffer src_buffer, VkDeviceSize src_offset, VkBuffer count_buffer, |
| 1025 | VkDeviceSize count_offset, u32 draw_count, u32 stride) const noexcept { | 1037 | VkDeviceSize count_offset, u32 draw_count, u32 stride) const noexcept { |
| 1026 | dld->vkCmdDrawIndirectCount(handle, src_buffer, src_offset, count_buffer, count_offset, | 1038 | dld->vkCmdDrawIndirectCountKHR(handle, src_buffer, src_offset, count_buffer, count_offset, |
| 1027 | draw_count, stride); | 1039 | draw_count, stride); |
| 1028 | } | 1040 | } |
| 1029 | 1041 | ||
| 1030 | void DrawIndexedIndirectCount(VkBuffer src_buffer, VkDeviceSize src_offset, | 1042 | void DrawIndexedIndirectCount(VkBuffer src_buffer, VkDeviceSize src_offset, |
| 1031 | VkBuffer count_buffer, VkDeviceSize count_offset, u32 draw_count, | 1043 | VkBuffer count_buffer, VkDeviceSize count_offset, u32 draw_count, |
| 1032 | u32 stride) const noexcept { | 1044 | u32 stride) const noexcept { |
| 1033 | dld->vkCmdDrawIndexedIndirectCount(handle, src_buffer, src_offset, count_buffer, | 1045 | dld->vkCmdDrawIndexedIndirectCountKHR(handle, src_buffer, src_offset, count_buffer, |
| 1034 | count_offset, draw_count, stride); | 1046 | count_offset, draw_count, stride); |
| 1035 | } | 1047 | } |
| 1036 | 1048 | ||
| 1037 | void ClearAttachments(Span<VkClearAttachment> attachments, | 1049 | void ClearAttachments(Span<VkClearAttachment> attachments, |