summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-03-08 18:31:53 -0300
committerGravatar ameerj2021-07-22 21:51:23 -0400
commitab463712474de5f99eec137a9c6233e55fe184f0 (patch)
tree30d79ac64dd03d5cfafd07c0c42c2baadc82de98 /src/video_core/renderer_vulkan
parentshader: Implement R2P (diff)
downloadyuzu-ab463712474de5f99eec137a9c6233e55fe184f0.tar.gz
yuzu-ab463712474de5f99eec137a9c6233e55fe184f0.tar.xz
yuzu-ab463712474de5f99eec137a9c6233e55fe184f0.zip
shader: Initial support for textures and TEX
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/vk_compute_pipeline.cpp101
-rw-r--r--src/video_core/renderer_vulkan/vk_compute_pipeline.h4
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.cpp4
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp3
4 files changed, 111 insertions, 1 deletions
diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp
index a658a3276..ef8bef6ff 100644
--- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp
+++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp
@@ -40,6 +40,16 @@ vk::DescriptorSetLayout CreateDescriptorSetLayout(const Device& device, const Sh
40 }); 40 });
41 ++binding; 41 ++binding;
42 } 42 }
43 for (const auto& desc : info.texture_descriptors) {
44 bindings.push_back({
45 .binding = binding,
46 .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
47 .descriptorCount = 1,
48 .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
49 .pImmutableSamplers = nullptr,
50 });
51 ++binding;
52 }
43 return device.GetLogical().CreateDescriptorSetLayout({ 53 return device.GetLogical().CreateDescriptorSetLayout({
44 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, 54 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
45 .pNext = nullptr, 55 .pNext = nullptr,
@@ -79,6 +89,18 @@ vk::DescriptorUpdateTemplateKHR CreateDescriptorUpdateTemplate(
79 ++binding; 89 ++binding;
80 offset += sizeof(DescriptorUpdateEntry); 90 offset += sizeof(DescriptorUpdateEntry);
81 } 91 }
92 for (const auto& desc : info.texture_descriptors) {
93 entries.push_back({
94 .dstBinding = binding,
95 .dstArrayElement = 0,
96 .descriptorCount = 1,
97 .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
98 .offset = offset,
99 .stride = sizeof(DescriptorUpdateEntry),
100 });
101 ++binding;
102 offset += sizeof(DescriptorUpdateEntry);
103 }
82 return device.GetLogical().CreateDescriptorUpdateTemplateKHR({ 104 return device.GetLogical().CreateDescriptorUpdateTemplateKHR({
83 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO, 105 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO,
84 .pNext = nullptr, 106 .pNext = nullptr,
@@ -92,6 +114,44 @@ vk::DescriptorUpdateTemplateKHR CreateDescriptorUpdateTemplate(
92 .set = 0, 114 .set = 0,
93 }); 115 });
94} 116}
117
118struct TextureHandle {
119 explicit TextureHandle(u32 data, bool via_header_index) {
120 const Tegra::Texture::TextureHandle handle{data};
121 image = handle.tic_id;
122 sampler = via_header_index ? image : handle.tsc_id.Value();
123 }
124
125 u32 image;
126 u32 sampler;
127};
128
129VideoCommon::ImageViewType CastType(Shader::TextureType type) {
130 switch (type) {
131 case Shader::TextureType::Color1D:
132 case Shader::TextureType::Shadow1D:
133 return VideoCommon::ImageViewType::e1D;
134 case Shader::TextureType::ColorArray1D:
135 case Shader::TextureType::ShadowArray1D:
136 return VideoCommon::ImageViewType::e1DArray;
137 case Shader::TextureType::Color2D:
138 case Shader::TextureType::Shadow2D:
139 return VideoCommon::ImageViewType::e2D;
140 case Shader::TextureType::ColorArray2D:
141 case Shader::TextureType::ShadowArray2D:
142 return VideoCommon::ImageViewType::e2DArray;
143 case Shader::TextureType::Color3D:
144 case Shader::TextureType::Shadow3D:
145 return VideoCommon::ImageViewType::e3D;
146 case Shader::TextureType::ColorCube:
147 case Shader::TextureType::ShadowCube:
148 return VideoCommon::ImageViewType::Cube;
149 case Shader::TextureType::ColorArrayCube:
150 case Shader::TextureType::ShadowArrayCube:
151 return VideoCommon::ImageViewType::CubeArray;
152 }
153 UNREACHABLE_MSG("Invalid texture type {}", type);
154}
95} // Anonymous namespace 155} // Anonymous namespace
96 156
97ComputePipeline::ComputePipeline(const Device& device, VKDescriptorPool& descriptor_pool, 157ComputePipeline::ComputePipeline(const Device& device, VKDescriptorPool& descriptor_pool,
@@ -143,6 +203,47 @@ void ComputePipeline::ConfigureBufferCache(BufferCache& buffer_cache) {
143 buffer_cache.BindHostComputeBuffers(); 203 buffer_cache.BindHostComputeBuffers();
144} 204}
145 205
206void ComputePipeline::ConfigureTextureCache(Tegra::Engines::KeplerCompute& kepler_compute,
207 Tegra::MemoryManager& gpu_memory,
208 TextureCache& texture_cache) {
209 texture_cache.SynchronizeComputeDescriptors();
210
211 static constexpr size_t max_elements = 64;
212 std::array<ImageId, max_elements> image_view_ids;
213 boost::container::static_vector<u32, max_elements> image_view_indices;
214 boost::container::static_vector<VkSampler, max_elements> sampler_handles;
215
216 const auto& launch_desc{kepler_compute.launch_description};
217 const auto& cbufs{launch_desc.const_buffer_config};
218 const bool via_header_index{launch_desc.linked_tsc};
219 for (const auto& desc : info.texture_descriptors) {
220 const u32 cbuf_index{desc.cbuf_index};
221 const u32 cbuf_offset{desc.cbuf_offset};
222 ASSERT(((launch_desc.const_buffer_enable_mask >> cbuf_index) & 1) != 0);
223
224 const GPUVAddr addr{cbufs[cbuf_index].Address() + cbuf_offset};
225 const u32 raw_handle{gpu_memory.Read<u32>(addr)};
226
227 const TextureHandle handle(raw_handle, via_header_index);
228 image_view_indices.push_back(handle.image);
229
230 Sampler* const sampler = texture_cache.GetComputeSampler(handle.sampler);
231 sampler_handles.push_back(sampler->Handle());
232 }
233
234 const std::span indices_span(image_view_indices.data(), image_view_indices.size());
235 texture_cache.FillComputeImageViews(indices_span, image_view_ids);
236
237 size_t index{};
238 for (const auto& desc : info.texture_descriptors) {
239 const VkSampler vk_sampler{sampler_handles[index]};
240 ImageView& image_view{texture_cache.GetImageView(image_view_ids[index])};
241 const VkImageView vk_image_view{image_view.Handle(CastType(desc.type))};
242 update_descriptor_queue->AddSampledImage(vk_image_view, vk_sampler);
243 ++index;
244 }
245}
246
146VkDescriptorSet ComputePipeline::UpdateDescriptorSet() { 247VkDescriptorSet ComputePipeline::UpdateDescriptorSet() {
147 const VkDescriptorSet descriptor_set{descriptor_allocator.Commit()}; 248 const VkDescriptorSet descriptor_set{descriptor_allocator.Commit()};
148 update_descriptor_queue->Send(*descriptor_update_template, descriptor_set); 249 update_descriptor_queue->Send(*descriptor_update_template, descriptor_set);
diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.h b/src/video_core/renderer_vulkan/vk_compute_pipeline.h
index dc045d524..08d73a2a4 100644
--- a/src/video_core/renderer_vulkan/vk_compute_pipeline.h
+++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.h
@@ -6,9 +6,11 @@
6 6
7#include "common/common_types.h" 7#include "common/common_types.h"
8#include "shader_recompiler/shader_info.h" 8#include "shader_recompiler/shader_info.h"
9#include "video_core/memory_manager.h"
9#include "video_core/renderer_vulkan/vk_buffer_cache.h" 10#include "video_core/renderer_vulkan/vk_buffer_cache.h"
10#include "video_core/renderer_vulkan/vk_descriptor_pool.h" 11#include "video_core/renderer_vulkan/vk_descriptor_pool.h"
11#include "video_core/renderer_vulkan/vk_pipeline.h" 12#include "video_core/renderer_vulkan/vk_pipeline.h"
13#include "video_core/renderer_vulkan/vk_texture_cache.h"
12#include "video_core/renderer_vulkan/vk_update_descriptor.h" 14#include "video_core/renderer_vulkan/vk_update_descriptor.h"
13#include "video_core/vulkan_common/vulkan_wrapper.h" 15#include "video_core/vulkan_common/vulkan_wrapper.h"
14 16
@@ -30,6 +32,8 @@ public:
30 ComputePipeline(const ComputePipeline&) = delete; 32 ComputePipeline(const ComputePipeline&) = delete;
31 33
32 void ConfigureBufferCache(BufferCache& buffer_cache); 34 void ConfigureBufferCache(BufferCache& buffer_cache);
35 void ConfigureTextureCache(Tegra::Engines::KeplerCompute& kepler_compute,
36 Tegra::MemoryManager& gpu_memory, TextureCache& texture_cache);
33 37
34 [[nodiscard]] VkDescriptorSet UpdateDescriptorSet(); 38 [[nodiscard]] VkDescriptorSet UpdateDescriptorSet();
35 39
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
index 2497c2385..bcb7dd2eb 100644
--- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
@@ -76,6 +76,10 @@ public:
76 return gpu_memory.Read<u64>(program_base + address); 76 return gpu_memory.Read<u64>(program_base + address);
77 } 77 }
78 78
79 u32 TextureBoundBuffer() override {
80 return kepler_compute.regs.tex_cb_index;
81 }
82
79 std::array<u32, 3> WorkgroupSize() override { 83 std::array<u32, 3> WorkgroupSize() override {
80 const auto& qmd{kepler_compute.launch_description}; 84 const auto& qmd{kepler_compute.launch_description};
81 return {qmd.block_dim_x, qmd.block_dim_y, qmd.block_dim_z}; 85 return {qmd.block_dim_x, qmd.block_dim_y, qmd.block_dim_z};
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
index 1b662f9f3..c94419d29 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
@@ -241,9 +241,10 @@ void RasterizerVulkan::DispatchCompute() {
241 if (!pipeline) { 241 if (!pipeline) {
242 return; 242 return;
243 } 243 }
244 std::scoped_lock lock{buffer_cache.mutex}; 244 std::scoped_lock lock{texture_cache.mutex, buffer_cache.mutex};
245 update_descriptor_queue.Acquire(); 245 update_descriptor_queue.Acquire();
246 pipeline->ConfigureBufferCache(buffer_cache); 246 pipeline->ConfigureBufferCache(buffer_cache);
247 pipeline->ConfigureTextureCache(kepler_compute, gpu_memory, texture_cache);
247 const VkDescriptorSet descriptor_set{pipeline->UpdateDescriptorSet()}; 248 const VkDescriptorSet descriptor_set{pipeline->UpdateDescriptorSet()};
248 249
249 const auto& qmd{kepler_compute.launch_description}; 250 const auto& qmd{kepler_compute.launch_description};