diff options
| author | 2021-04-06 02:56:15 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:26 -0400 | |
| commit | 1f3eb601acdcdfa4c119cffbf36b5792147b893f (patch) | |
| tree | 1a8dcc5e4ce11e9090dd6d7a8b4e8aaa130ff67b /src/video_core/renderer_vulkan | |
| parent | shader: Address feedback (diff) | |
| download | yuzu-1f3eb601acdcdfa4c119cffbf36b5792147b893f.tar.gz yuzu-1f3eb601acdcdfa4c119cffbf36b5792147b893f.tar.xz yuzu-1f3eb601acdcdfa4c119cffbf36b5792147b893f.zip | |
shader: Implement texture buffers
Diffstat (limited to 'src/video_core/renderer_vulkan')
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 | ||
| 98 | private: | 101 | private: |
| @@ -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: |