summaryrefslogtreecommitdiff
path: root/src/video_core/vulkan_common
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2022-02-09 15:39:40 +0100
committerGravatar Fernando Sahmkow2023-01-01 16:43:57 -0500
commit0f89828073a541eaa2cfd985483f839bd2f97b74 (patch)
tree3e26c71678e17ca97ec744a884f5ecb9ae2b6c5e /src/video_core/vulkan_common
parentMacroHLE: Add MultidrawIndirect HLE Macro. (diff)
downloadyuzu-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.cpp5
-rw-r--r--src/video_core/vulkan_common/vulkan_device.h1
-rw-r--r--src/video_core/vulkan_common/vulkan_wrapper.cpp6
-rw-r--r--src/video_core/vulkan_common/vulkan_wrapper.h24
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,