diff options
| author | 2020-07-16 16:02:46 -0300 | |
|---|---|---|
| committer | 2020-07-16 16:02:46 -0300 | |
| commit | a5a72cbd201489319856baaec88f02a6607423ae (patch) | |
| tree | a260784d8810d6c3f982d77e7c7ebaa5dbf957c7 /src/video_core/renderer_vulkan | |
| parent | Merge pull request #4342 from lioncash/endian (diff) | |
| download | yuzu-a5a72cbd201489319856baaec88f02a6607423ae.tar.gz yuzu-a5a72cbd201489319856baaec88f02a6607423ae.tar.xz yuzu-a5a72cbd201489319856baaec88f02a6607423ae.zip | |
renderer_{opengl,vulkan}: Clamp shared memory to host's limit
This stops shaders from failing to build when the exceed host's shared
memory size limit. An error is logged.
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_device.h | 5 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 12 |
2 files changed, 14 insertions, 3 deletions
diff --git a/src/video_core/renderer_vulkan/vk_device.h b/src/video_core/renderer_vulkan/vk_device.h index ae5c21baa..529744f2d 100644 --- a/src/video_core/renderer_vulkan/vk_device.h +++ b/src/video_core/renderer_vulkan/vk_device.h | |||
| @@ -122,6 +122,11 @@ public: | |||
| 122 | return properties.limits.maxPushConstantsSize; | 122 | return properties.limits.maxPushConstantsSize; |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | /// Returns the maximum size for shared memory. | ||
| 126 | u32 GetMaxComputeSharedMemorySize() const { | ||
| 127 | return properties.limits.maxComputeSharedMemorySize; | ||
| 128 | } | ||
| 129 | |||
| 125 | /// Returns true if ASTC is natively supported. | 130 | /// Returns true if ASTC is natively supported. |
| 126 | bool IsOptimalAstcSupported() const { | 131 | bool IsOptimalAstcSupported() const { |
| 127 | return is_optimal_astc_supported; | 132 | return is_optimal_astc_supported; |
diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp index 97429cc59..694452fd8 100644 --- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp +++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | |||
| @@ -685,13 +685,19 @@ private: | |||
| 685 | } | 685 | } |
| 686 | t_smem_uint = TypePointer(spv::StorageClass::Workgroup, t_uint); | 686 | t_smem_uint = TypePointer(spv::StorageClass::Workgroup, t_uint); |
| 687 | 687 | ||
| 688 | const u32 smem_size = specialization.shared_memory_size; | 688 | u32 smem_size = specialization.shared_memory_size * 4; |
| 689 | if (smem_size == 0) { | 689 | if (smem_size == 0) { |
| 690 | // Avoid declaring an empty array. | 690 | // Avoid declaring an empty array. |
| 691 | return; | 691 | return; |
| 692 | } | 692 | } |
| 693 | const auto element_count = static_cast<u32>(Common::AlignUp(smem_size, 4) / 4); | 693 | const u32 limit = device.GetMaxComputeSharedMemorySize(); |
| 694 | const Id type_array = TypeArray(t_uint, Constant(t_uint, element_count)); | 694 | if (smem_size > limit) { |
| 695 | LOG_ERROR(Render_Vulkan, "Shared memory size {} is clamped to host's limit {}", | ||
| 696 | smem_size, limit); | ||
| 697 | smem_size = limit; | ||
| 698 | } | ||
| 699 | |||
| 700 | const Id type_array = TypeArray(t_uint, Constant(t_uint, smem_size / 4)); | ||
| 695 | const Id type_pointer = TypePointer(spv::StorageClass::Workgroup, type_array); | 701 | const Id type_pointer = TypePointer(spv::StorageClass::Workgroup, type_array); |
| 696 | Name(type_pointer, "SharedMemory"); | 702 | Name(type_pointer, "SharedMemory"); |
| 697 | 703 | ||