summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/CMakeLists.txt2
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.cpp43
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.h22
3 files changed, 67 insertions, 0 deletions
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt
index aa008576d..efdd2c902 100644
--- a/src/video_core/CMakeLists.txt
+++ b/src/video_core/CMakeLists.txt
@@ -163,6 +163,8 @@ if (ENABLE_VULKAN)
163 renderer_vulkan/vk_image.h 163 renderer_vulkan/vk_image.h
164 renderer_vulkan/vk_memory_manager.cpp 164 renderer_vulkan/vk_memory_manager.cpp
165 renderer_vulkan/vk_memory_manager.h 165 renderer_vulkan/vk_memory_manager.h
166 renderer_vulkan/vk_pipeline_cache.cpp
167 renderer_vulkan/vk_pipeline_cache.h
166 renderer_vulkan/vk_rasterizer.h 168 renderer_vulkan/vk_rasterizer.h
167 renderer_vulkan/vk_renderpass_cache.cpp 169 renderer_vulkan/vk_renderpass_cache.cpp
168 renderer_vulkan/vk_renderpass_cache.h 170 renderer_vulkan/vk_renderpass_cache.h
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
new file mode 100644
index 000000000..9bc027cbf
--- /dev/null
+++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
@@ -0,0 +1,43 @@
1// Copyright 2019 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <cstddef>
6#include <vector>
7
8#include "video_core/renderer_vulkan/declarations.h"
9#include "video_core/renderer_vulkan/vk_device.h"
10#include "video_core/renderer_vulkan/vk_pipeline_cache.h"
11#include "video_core/renderer_vulkan/vk_update_descriptor.h"
12
13namespace Vulkan {
14
15void FillDescriptorUpdateTemplateEntries(
16 const VKDevice& device, const ShaderEntries& entries, u32& binding, u32& offset,
17 std::vector<vk::DescriptorUpdateTemplateEntry>& template_entries) {
18 static constexpr auto entry_size = static_cast<u32>(sizeof(DescriptorUpdateEntry));
19 const auto AddEntry = [&](vk::DescriptorType descriptor_type, std::size_t count_) {
20 const u32 count = static_cast<u32>(count_);
21 if (descriptor_type == vk::DescriptorType::eUniformTexelBuffer &&
22 device.GetDriverID() == vk::DriverIdKHR::eNvidiaProprietary) {
23 // Nvidia has a bug where updating multiple uniform texels at once causes the driver to
24 // crash.
25 for (u32 i = 0; i < count; ++i) {
26 template_entries.emplace_back(binding + i, 0, 1, descriptor_type,
27 offset + i * entry_size, entry_size);
28 }
29 } else if (count != 0) {
30 template_entries.emplace_back(binding, 0, count, descriptor_type, offset, entry_size);
31 }
32 offset += count * entry_size;
33 binding += count;
34 };
35
36 AddEntry(vk::DescriptorType::eUniformBuffer, entries.const_buffers.size());
37 AddEntry(vk::DescriptorType::eStorageBuffer, entries.global_buffers.size());
38 AddEntry(vk::DescriptorType::eUniformTexelBuffer, entries.texel_buffers.size());
39 AddEntry(vk::DescriptorType::eCombinedImageSampler, entries.samplers.size());
40 AddEntry(vk::DescriptorType::eStorageImage, entries.images.size());
41}
42
43} // namespace Vulkan
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.h b/src/video_core/renderer_vulkan/vk_pipeline_cache.h
new file mode 100644
index 000000000..532ee45cc
--- /dev/null
+++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.h
@@ -0,0 +1,22 @@
1// Copyright 2019 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <vector>
8
9#include "common/common_types.h"
10#include "video_core/renderer_vulkan/declarations.h"
11#include "video_core/renderer_vulkan/vk_shader_decompiler.h"
12#include "video_core/shader/shader_ir.h"
13
14namespace Vulkan {
15
16class VKDevice;
17
18void FillDescriptorUpdateTemplateEntries(
19 const VKDevice& device, const ShaderEntries& entries, u32& binding, u32& offset,
20 std::vector<vk::DescriptorUpdateTemplateEntry>& template_entries);
21
22} // namespace Vulkan