summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-04-06 02:56:15 -0300
committerGravatar ameerj2021-07-22 21:51:26 -0400
commit1f3eb601acdcdfa4c119cffbf36b5792147b893f (patch)
tree1a8dcc5e4ce11e9090dd6d7a8b4e8aaa130ff67b /src/video_core/renderer_vulkan
parentshader: Address feedback (diff)
downloadyuzu-1f3eb601acdcdfa4c119cffbf36b5792147b893f.tar.gz
yuzu-1f3eb601acdcdfa4c119cffbf36b5792147b893f.tar.xz
yuzu-1f3eb601acdcdfa4c119cffbf36b5792147b893f.zip
shader: Implement texture buffers
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/pipeline_helper.h10
-rw-r--r--src/video_core/renderer_vulkan/vk_compute_pipeline.cpp15
-rw-r--r--src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp14
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.cpp2
4 files changed, 29 insertions, 12 deletions
diff --git a/src/video_core/renderer_vulkan/pipeline_helper.h b/src/video_core/renderer_vulkan/pipeline_helper.h
index eebe5d569..decf0d32c 100644
--- a/src/video_core/renderer_vulkan/pipeline_helper.h
+++ b/src/video_core/renderer_vulkan/pipeline_helper.h
@@ -93,6 +93,9 @@ public:
93 for ([[maybe_unused]] const auto& desc : info.texture_descriptors) { 93 for ([[maybe_unused]] const auto& desc : info.texture_descriptors) {
94 Add(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, stage); 94 Add(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, stage);
95 } 95 }
96 for (const auto& desc : info.texture_buffer_descriptors) {
97 Add(VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, stage);
98 }
96 } 99 }
97 100
98private: 101private:
@@ -146,6 +149,8 @@ inline VideoCommon::ImageViewType CastType(Shader::TextureType type) {
146 case Shader::TextureType::ColorArrayCube: 149 case Shader::TextureType::ColorArrayCube:
147 case Shader::TextureType::ShadowArrayCube: 150 case Shader::TextureType::ShadowArrayCube:
148 return VideoCommon::ImageViewType::CubeArray; 151 return VideoCommon::ImageViewType::CubeArray;
152 case Shader::TextureType::Buffer:
153 break;
149 } 154 }
150 UNREACHABLE_MSG("Invalid texture type {}", type); 155 UNREACHABLE_MSG("Invalid texture type {}", type);
151 return {}; 156 return {};
@@ -161,6 +166,11 @@ inline void PushImageDescriptors(const Shader::Info& info, const VkSampler* samp
161 update_descriptor_queue.AddSampledImage(vk_image_view, sampler); 166 update_descriptor_queue.AddSampledImage(vk_image_view, sampler);
162 ++index; 167 ++index;
163 } 168 }
169 for (const auto& desc : info.texture_buffer_descriptors) {
170 ImageView& image_view{texture_cache.GetImageView(image_view_ids[index])};
171 update_descriptor_queue.AddTexelBuffer(image_view.BufferView());
172 ++index;
173 }
164} 174}
165 175
166} // namespace Vulkan 176} // namespace Vulkan
diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp
index 0bb5b852d..9922cbd0f 100644
--- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp
+++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp
@@ -93,20 +93,23 @@ void ComputePipeline::Configure(Tegra::Engines::KeplerCompute& kepler_compute,
93 const auto& launch_desc{kepler_compute.launch_description}; 93 const auto& launch_desc{kepler_compute.launch_description};
94 const auto& cbufs{launch_desc.const_buffer_config}; 94 const auto& cbufs{launch_desc.const_buffer_config};
95 const bool via_header_index{launch_desc.linked_tsc}; 95 const bool via_header_index{launch_desc.linked_tsc};
96 for (const auto& desc : info.texture_descriptors) { 96 const auto read_handle{[&](u32 cbuf_index, u32 cbuf_offset) {
97 const u32 cbuf_index{desc.cbuf_index};
98 const u32 cbuf_offset{desc.cbuf_offset};
99 ASSERT(((launch_desc.const_buffer_enable_mask >> cbuf_index) & 1) != 0); 97 ASSERT(((launch_desc.const_buffer_enable_mask >> cbuf_index) & 1) != 0);
100
101 const GPUVAddr addr{cbufs[cbuf_index].Address() + cbuf_offset}; 98 const GPUVAddr addr{cbufs[cbuf_index].Address() + cbuf_offset};
102 const u32 raw_handle{gpu_memory.Read<u32>(addr)}; 99 const u32 raw_handle{gpu_memory.Read<u32>(addr)};
103 100 return TextureHandle(raw_handle, via_header_index);
104 const TextureHandle handle(raw_handle, via_header_index); 101 }};
102 for (const auto& desc : info.texture_descriptors) {
103 const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)};
105 image_view_indices.push_back(handle.image); 104 image_view_indices.push_back(handle.image);
106 105
107 Sampler* const sampler = texture_cache.GetComputeSampler(handle.sampler); 106 Sampler* const sampler = texture_cache.GetComputeSampler(handle.sampler);
108 samplers.push_back(sampler->Handle()); 107 samplers.push_back(sampler->Handle());
109 } 108 }
109 for (const auto& desc : info.texture_buffer_descriptors) {
110 const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)};
111 image_view_indices.push_back(handle.image);
112 }
110 const std::span indices_span(image_view_indices.data(), image_view_indices.size()); 113 const std::span indices_span(image_view_indices.data(), image_view_indices.size());
111 texture_cache.FillComputeImageViews(indices_span, image_view_ids); 114 texture_cache.FillComputeImageViews(indices_span, image_view_ids);
112 115
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
index a0ef0e98b..afdd8b371 100644
--- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
+++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
@@ -169,19 +169,23 @@ void GraphicsPipeline::Configure(bool is_indexed) {
169 ++index; 169 ++index;
170 } 170 }
171 const auto& cbufs{maxwell3d.state.shader_stages[stage].const_buffers}; 171 const auto& cbufs{maxwell3d.state.shader_stages[stage].const_buffers};
172 for (const auto& desc : info.texture_descriptors) { 172 const auto read_handle{[&](u32 cbuf_index, u32 cbuf_offset) {
173 const u32 cbuf_index{desc.cbuf_index};
174 const u32 cbuf_offset{desc.cbuf_offset};
175 ASSERT(cbufs[cbuf_index].enabled); 173 ASSERT(cbufs[cbuf_index].enabled);
176 const GPUVAddr addr{cbufs[cbuf_index].address + cbuf_offset}; 174 const GPUVAddr addr{cbufs[cbuf_index].address + cbuf_offset};
177 const u32 raw_handle{gpu_memory.Read<u32>(addr)}; 175 const u32 raw_handle{gpu_memory.Read<u32>(addr)};
178 176 return TextureHandle(raw_handle, via_header_index);
179 const TextureHandle handle(raw_handle, via_header_index); 177 }};
178 for (const auto& desc : info.texture_descriptors) {
179 const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)};
180 image_view_indices.push_back(handle.image); 180 image_view_indices.push_back(handle.image);
181 181
182 Sampler* const sampler{texture_cache.GetGraphicsSampler(handle.sampler)}; 182 Sampler* const sampler{texture_cache.GetGraphicsSampler(handle.sampler)};
183 samplers.push_back(sampler->Handle()); 183 samplers.push_back(sampler->Handle());
184 } 184 }
185 for (const auto& desc : info.texture_buffer_descriptors) {
186 const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)};
187 image_view_indices.push_back(handle.image);
188 }
185 } 189 }
186 const std::span indices_span(image_view_indices.data(), image_view_indices.size()); 190 const std::span indices_span(image_view_indices.data(), image_view_indices.size());
187 buffer_cache.UpdateGraphicsBuffers(is_indexed); 191 buffer_cache.UpdateGraphicsBuffers(is_indexed);
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
index 25f592b8a..23bf84a92 100644
--- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
@@ -212,7 +212,7 @@ protected:
212 case Tegra::Texture::TextureType::Texture2DArray: 212 case Tegra::Texture::TextureType::Texture2DArray:
213 return Shader::TextureType::ColorArray2D; 213 return Shader::TextureType::ColorArray2D;
214 case Tegra::Texture::TextureType::Texture1DBuffer: 214 case Tegra::Texture::TextureType::Texture1DBuffer:
215 throw Shader::NotImplementedException("Texture buffer"); 215 return Shader::TextureType::Buffer;
216 case Tegra::Texture::TextureType::TextureCubeArray: 216 case Tegra::Texture::TextureType::TextureCubeArray:
217 return Shader::TextureType::ColorArrayCube; 217 return Shader::TextureType::ColorArrayCube;
218 default: 218 default: