diff options
| author | 2021-04-13 05:32:21 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:27 -0400 | |
| commit | fa75b9b0626c8e118e27207dd1e82e2f415fc0bc (patch) | |
| tree | 29738f645876c19fd561a39b8f9d62799bf92ef9 /src/video_core | |
| parent | shader: Fix fixed pipeline point size on geometry shaders (diff) | |
| download | yuzu-fa75b9b0626c8e118e27207dd1e82e2f415fc0bc.tar.gz yuzu-fa75b9b0626c8e118e27207dd1e82e2f415fc0bc.tar.xz yuzu-fa75b9b0626c8e118e27207dd1e82e2f415fc0bc.zip | |
spirv: Rework storage buffers and shader memory
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 911dfed44..87cfe6312 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -44,6 +44,7 @@ constexpr std::array REQUIRED_EXTENSIONS{ | |||
| 44 | VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, | 44 | VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, |
| 45 | VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, | 45 | VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, |
| 46 | VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME, | 46 | VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME, |
| 47 | VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, | ||
| 47 | VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, | 48 | VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, |
| 48 | VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME, | 49 | VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME, |
| 49 | VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME, | 50 | VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME, |
| @@ -313,6 +314,14 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 313 | }; | 314 | }; |
| 314 | SetNext(next, host_query_reset); | 315 | SetNext(next, host_query_reset); |
| 315 | 316 | ||
| 317 | VkPhysicalDeviceVariablePointerFeaturesKHR variable_pointers{ | ||
| 318 | .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR, | ||
| 319 | .pNext = nullptr, | ||
| 320 | .variablePointersStorageBuffer = VK_TRUE, | ||
| 321 | .variablePointers = VK_TRUE, | ||
| 322 | }; | ||
| 323 | SetNext(next, variable_pointers); | ||
| 324 | |||
| 316 | VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT demote{ | 325 | VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT demote{ |
| 317 | .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT, | 326 | .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT, |
| 318 | .pNext = nullptr, | 327 | .pNext = nullptr, |
| @@ -399,6 +408,17 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 399 | LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state"); | 408 | LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state"); |
| 400 | } | 409 | } |
| 401 | 410 | ||
| 411 | VkPhysicalDeviceShaderAtomicInt64FeaturesKHR atomic_int64; | ||
| 412 | if (ext_shader_atomic_int64) { | ||
| 413 | atomic_int64 = { | ||
| 414 | .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR, | ||
| 415 | .pNext = nullptr, | ||
| 416 | .shaderBufferInt64Atomics = VK_TRUE, | ||
| 417 | .shaderSharedInt64Atomics = VK_TRUE, | ||
| 418 | }; | ||
| 419 | SetNext(next, atomic_int64); | ||
| 420 | } | ||
| 421 | |||
| 402 | VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR workgroup_layout; | 422 | VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR workgroup_layout; |
| 403 | if (khr_workgroup_memory_explicit_layout) { | 423 | if (khr_workgroup_memory_explicit_layout) { |
| 404 | workgroup_layout = { | 424 | workgroup_layout = { |
| @@ -624,9 +644,13 @@ void Device::CheckSuitability(bool requires_swapchain) const { | |||
| 624 | VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT; | 644 | VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT; |
| 625 | demote.pNext = nullptr; | 645 | demote.pNext = nullptr; |
| 626 | 646 | ||
| 647 | VkPhysicalDeviceVariablePointerFeaturesKHR variable_pointers{}; | ||
| 648 | variable_pointers.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR; | ||
| 649 | variable_pointers.pNext = &demote; | ||
| 650 | |||
| 627 | VkPhysicalDeviceRobustness2FeaturesEXT robustness2{}; | 651 | VkPhysicalDeviceRobustness2FeaturesEXT robustness2{}; |
| 628 | robustness2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT; | 652 | robustness2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT; |
| 629 | robustness2.pNext = &demote; | 653 | robustness2.pNext = &variable_pointers; |
| 630 | 654 | ||
| 631 | VkPhysicalDeviceFeatures2KHR features2{}; | 655 | VkPhysicalDeviceFeatures2KHR features2{}; |
| 632 | features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; | 656 | features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; |
| @@ -654,6 +678,9 @@ void Device::CheckSuitability(bool requires_swapchain) const { | |||
| 654 | std::make_pair(features.shaderStorageImageWriteWithoutFormat, | 678 | std::make_pair(features.shaderStorageImageWriteWithoutFormat, |
| 655 | "shaderStorageImageWriteWithoutFormat"), | 679 | "shaderStorageImageWriteWithoutFormat"), |
| 656 | std::make_pair(demote.shaderDemoteToHelperInvocation, "shaderDemoteToHelperInvocation"), | 680 | std::make_pair(demote.shaderDemoteToHelperInvocation, "shaderDemoteToHelperInvocation"), |
| 681 | std::make_pair(variable_pointers.variablePointers, "variablePointers"), | ||
| 682 | std::make_pair(variable_pointers.variablePointersStorageBuffer, | ||
| 683 | "variablePointersStorageBuffer"), | ||
| 657 | std::make_pair(robustness2.robustBufferAccess2, "robustBufferAccess2"), | 684 | std::make_pair(robustness2.robustBufferAccess2, "robustBufferAccess2"), |
| 658 | std::make_pair(robustness2.robustImageAccess2, "robustImageAccess2"), | 685 | std::make_pair(robustness2.robustImageAccess2, "robustImageAccess2"), |
| 659 | std::make_pair(robustness2.nullDescriptor, "nullDescriptor"), | 686 | std::make_pair(robustness2.nullDescriptor, "nullDescriptor"), |