summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-04-14 21:36:36 -0300
committerGravatar ameerj2021-07-22 21:51:27 -0400
commit416e1b7441d34512fcb0ffed014daf7ca4bb62bd (patch)
treefa14781ad4969613919a8bcd68b887b9b7a98304 /src/video_core/renderer_vulkan
parentspirv: Implement Layer stores (diff)
downloadyuzu-416e1b7441d34512fcb0ffed014daf7ca4bb62bd.tar.gz
yuzu-416e1b7441d34512fcb0ffed014daf7ca4bb62bd.tar.xz
yuzu-416e1b7441d34512fcb0ffed014daf7ca4bb62bd.zip
spirv: Implement image buffers
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/pipeline_helper.h2
-rw-r--r--src/video_core/renderer_vulkan/vk_compute_pipeline.cpp25
-rw-r--r--src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp31
3 files changed, 37 insertions, 21 deletions
diff --git a/src/video_core/renderer_vulkan/pipeline_helper.h b/src/video_core/renderer_vulkan/pipeline_helper.h
index e2167dc4b..aaf9a735e 100644
--- a/src/video_core/renderer_vulkan/pipeline_helper.h
+++ b/src/video_core/renderer_vulkan/pipeline_helper.h
@@ -88,6 +88,7 @@ public:
88 Add(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, stage, info.constant_buffer_descriptors.size()); 88 Add(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, stage, info.constant_buffer_descriptors.size());
89 Add(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stage, info.storage_buffers_descriptors.size()); 89 Add(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stage, info.storage_buffers_descriptors.size());
90 Add(VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, stage, info.texture_buffer_descriptors.size()); 90 Add(VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, stage, info.texture_buffer_descriptors.size());
91 Add(VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, stage, info.image_buffer_descriptors.size());
91 Add(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, stage, info.texture_descriptors.size()); 92 Add(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, stage, info.texture_descriptors.size());
92 Add(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, stage, info.image_descriptors.size()); 93 Add(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, stage, info.image_descriptors.size());
93 } 94 }
@@ -126,6 +127,7 @@ inline void PushImageDescriptors(const Shader::Info& info, const VkSampler*& sam
126 const ImageId*& image_view_ids, TextureCache& texture_cache, 127 const ImageId*& image_view_ids, TextureCache& texture_cache,
127 VKUpdateDescriptorQueue& update_descriptor_queue) { 128 VKUpdateDescriptorQueue& update_descriptor_queue) {
128 image_view_ids += info.texture_buffer_descriptors.size(); 129 image_view_ids += info.texture_buffer_descriptors.size();
130 image_view_ids += info.image_buffer_descriptors.size();
129 for (const auto& desc : info.texture_descriptors) { 131 for (const auto& desc : info.texture_descriptors) {
130 const VkSampler sampler{*(samplers++)}; 132 const VkSampler sampler{*(samplers++)};
131 ImageView& image_view{texture_cache.GetImageView(*(image_view_ids++))}; 133 ImageView& image_view{texture_cache.GetImageView(*(image_view_ids++))};
diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp
index 3d690f335..3c907ec5a 100644
--- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp
+++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp
@@ -97,10 +97,12 @@ void ComputePipeline::Configure(Tegra::Engines::KeplerCompute& kepler_compute,
97 const u32 raw_handle{gpu_memory.Read<u32>(addr)}; 97 const u32 raw_handle{gpu_memory.Read<u32>(addr)};
98 return TextureHandle(raw_handle, via_header_index); 98 return TextureHandle(raw_handle, via_header_index);
99 }}; 99 }};
100 for (const auto& desc : info.texture_buffer_descriptors) { 100 const auto add_image{[&](const auto& desc) {
101 const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)}; 101 const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)};
102 image_view_indices.push_back(handle.image); 102 image_view_indices.push_back(handle.image);
103 } 103 }};
104 std::ranges::for_each(info.texture_buffer_descriptors, add_image);
105 std::ranges::for_each(info.image_buffer_descriptors, add_image);
104 for (const auto& desc : info.texture_descriptors) { 106 for (const auto& desc : info.texture_descriptors) {
105 const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)}; 107 const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)};
106 image_view_indices.push_back(handle.image); 108 image_view_indices.push_back(handle.image);
@@ -108,24 +110,29 @@ void ComputePipeline::Configure(Tegra::Engines::KeplerCompute& kepler_compute,
108 Sampler* const sampler = texture_cache.GetComputeSampler(handle.sampler); 110 Sampler* const sampler = texture_cache.GetComputeSampler(handle.sampler);
109 samplers.push_back(sampler->Handle()); 111 samplers.push_back(sampler->Handle());
110 } 112 }
111 for (const auto& desc : info.image_descriptors) { 113 std::ranges::for_each(info.image_descriptors, add_image);
112 const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)}; 114
113 image_view_indices.push_back(handle.image);
114 }
115 const std::span indices_span(image_view_indices.data(), image_view_indices.size()); 115 const std::span indices_span(image_view_indices.data(), image_view_indices.size());
116 texture_cache.FillComputeImageViews(indices_span, image_view_ids); 116 texture_cache.FillComputeImageViews(indices_span, image_view_ids);
117 117
118 buffer_cache.UnbindComputeTextureBuffers(); 118 buffer_cache.UnbindComputeTextureBuffers();
119 ImageId* texture_buffer_ids{image_view_ids.data()}; 119 ImageId* texture_buffer_ids{image_view_ids.data()};
120 size_t index{}; 120 size_t index{};
121 for (const auto& desc : info.texture_buffer_descriptors) { 121 const auto add_buffer{[&](const auto& desc) {
122 ASSERT(desc.count == 1); 122 ASSERT(desc.count == 1);
123 bool is_written{false};
124 if constexpr (std::is_same_v<decltype(desc), const Shader::ImageBufferDescriptor&>) {
125 is_written = desc.is_written;
126 }
123 ImageView& image_view = texture_cache.GetImageView(*texture_buffer_ids); 127 ImageView& image_view = texture_cache.GetImageView(*texture_buffer_ids);
124 buffer_cache.BindComputeTextureBuffer(index, image_view.GpuAddr(), image_view.BufferSize(), 128 buffer_cache.BindComputeTextureBuffer(index, image_view.GpuAddr(), image_view.BufferSize(),
125 image_view.format); 129 image_view.format, is_written);
126 ++texture_buffer_ids; 130 ++texture_buffer_ids;
127 ++index; 131 ++index;
128 } 132 }};
133 std::ranges::for_each(info.texture_buffer_descriptors, add_buffer);
134 std::ranges::for_each(info.image_buffer_descriptors, add_buffer);
135
129 buffer_cache.UpdateComputeBuffers(); 136 buffer_cache.UpdateComputeBuffers();
130 buffer_cache.BindHostComputeBuffers(); 137 buffer_cache.BindHostComputeBuffers();
131 138
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
index 23c01f24e..84720a6f9 100644
--- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
+++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
@@ -175,10 +175,12 @@ void GraphicsPipeline::Configure(bool is_indexed) {
175 const u32 raw_handle{gpu_memory.Read<u32>(addr)}; 175 const u32 raw_handle{gpu_memory.Read<u32>(addr)};
176 return TextureHandle(raw_handle, via_header_index); 176 return TextureHandle(raw_handle, via_header_index);
177 }}; 177 }};
178 for (const auto& desc : info.texture_buffer_descriptors) { 178 const auto add_image{[&](const auto& desc) {
179 const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)}; 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 std::ranges::for_each(info.texture_buffer_descriptors, add_image);
183 std::ranges::for_each(info.image_buffer_descriptors, add_image);
182 for (const auto& desc : info.texture_descriptors) { 184 for (const auto& desc : info.texture_descriptors) {
183 const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)}; 185 const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)};
184 image_view_indices.push_back(handle.image); 186 image_view_indices.push_back(handle.image);
@@ -186,28 +188,33 @@ void GraphicsPipeline::Configure(bool is_indexed) {
186 Sampler* const sampler{texture_cache.GetGraphicsSampler(handle.sampler)}; 188 Sampler* const sampler{texture_cache.GetGraphicsSampler(handle.sampler)};
187 samplers.push_back(sampler->Handle()); 189 samplers.push_back(sampler->Handle());
188 } 190 }
189 for (const auto& desc : info.image_descriptors) { 191 std::ranges::for_each(info.image_descriptors, add_image);
190 const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)};
191 image_view_indices.push_back(handle.image);
192 }
193 } 192 }
194 const std::span indices_span(image_view_indices.data(), image_view_indices.size()); 193 const std::span indices_span(image_view_indices.data(), image_view_indices.size());
195 texture_cache.FillGraphicsImageViews(indices_span, image_view_ids); 194 texture_cache.FillGraphicsImageViews(indices_span, image_view_ids);
196 195
197 ImageId* texture_buffer_index{image_view_ids.data()}; 196 ImageId* texture_buffer_index{image_view_ids.data()};
198 for (size_t stage = 0; stage < Maxwell::MaxShaderStage; ++stage) { 197 for (size_t stage = 0; stage < Maxwell::MaxShaderStage; ++stage) {
199 const Shader::Info& info{stage_infos[stage]};
200 buffer_cache.UnbindGraphicsTextureBuffers(stage);
201 size_t index{}; 198 size_t index{};
202 for (const auto& desc : info.texture_buffer_descriptors) { 199 const auto add_buffer{[&](const auto& desc) {
203 ASSERT(desc.count == 1); 200 ASSERT(desc.count == 1);
204 ImageView& image_view = texture_cache.GetImageView(*texture_buffer_index); 201 bool is_written{false};
202 if constexpr (std::is_same_v<decltype(desc), const Shader::ImageBufferDescriptor&>) {
203 is_written = desc.is_written;
204 }
205 ImageView& image_view{texture_cache.GetImageView(*texture_buffer_index)};
205 buffer_cache.BindGraphicsTextureBuffer(stage, index, image_view.GpuAddr(), 206 buffer_cache.BindGraphicsTextureBuffer(stage, index, image_view.GpuAddr(),
206 image_view.BufferSize(), image_view.format); 207 image_view.BufferSize(), image_view.format,
208 is_written);
207 ++index; 209 ++index;
208 ++texture_buffer_index; 210 ++texture_buffer_index;
209 } 211 }};
212 const Shader::Info& info{stage_infos[stage]};
213 buffer_cache.UnbindGraphicsTextureBuffers(stage);
214 std::ranges::for_each(info.texture_buffer_descriptors, add_buffer);
215 std::ranges::for_each(info.image_buffer_descriptors, add_buffer);
210 texture_buffer_index += info.texture_descriptors.size(); 216 texture_buffer_index += info.texture_descriptors.size();
217 texture_buffer_index += info.image_descriptors.size();
211 } 218 }
212 buffer_cache.UpdateGraphicsBuffers(is_indexed); 219 buffer_cache.UpdateGraphicsBuffers(is_indexed);
213 220