summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-04-13 05:32:21 -0300
committerGravatar ameerj2021-07-22 21:51:27 -0400
commitfa75b9b0626c8e118e27207dd1e82e2f415fc0bc (patch)
tree29738f645876c19fd561a39b8f9d62799bf92ef9 /src/video_core
parentshader: Fix fixed pipeline point size on geometry shaders (diff)
downloadyuzu-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.cpp29
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"),