diff options
| author | 2021-04-09 01:45:39 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:26 -0400 | |
| commit | 7cb2ab358517d95ebcd35c94c72b9e91762906c3 (patch) | |
| tree | 3f75959e255026665a4dde406cb8c4cc34fb45a0 /src/video_core | |
| parent | shader: Fix Windows build issues (diff) | |
| download | yuzu-7cb2ab358517d95ebcd35c94c72b9e91762906c3.tar.gz yuzu-7cb2ab358517d95ebcd35c94c72b9e91762906c3.tar.xz yuzu-7cb2ab358517d95ebcd35c94c72b9e91762906c3.zip | |
shader: Implement SULD and SUST
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/renderer_vulkan/blit_image.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/pipeline_helper.h | 43 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_compute_pipeline.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 112 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.h | 23 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 8 |
8 files changed, 135 insertions, 65 deletions
diff --git a/src/video_core/renderer_vulkan/blit_image.cpp b/src/video_core/renderer_vulkan/blit_image.cpp index 6c0d5c7f4..39fe9289b 100644 --- a/src/video_core/renderer_vulkan/blit_image.cpp +++ b/src/video_core/renderer_vulkan/blit_image.cpp | |||
| @@ -361,7 +361,7 @@ void BlitImageHelper::BlitColor(const Framebuffer* dst_framebuffer, const ImageV | |||
| 361 | .operation = operation, | 361 | .operation = operation, |
| 362 | }; | 362 | }; |
| 363 | const VkPipelineLayout layout = *one_texture_pipeline_layout; | 363 | const VkPipelineLayout layout = *one_texture_pipeline_layout; |
| 364 | const VkImageView src_view = src_image_view.Handle(ImageViewType::e2D); | 364 | const VkImageView src_view = src_image_view.Handle(Shader::TextureType::Color2D); |
| 365 | const VkSampler sampler = is_linear ? *linear_sampler : *nearest_sampler; | 365 | const VkSampler sampler = is_linear ? *linear_sampler : *nearest_sampler; |
| 366 | const VkPipeline pipeline = FindOrEmplacePipeline(key); | 366 | const VkPipeline pipeline = FindOrEmplacePipeline(key); |
| 367 | const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit(); | 367 | const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit(); |
| @@ -435,7 +435,7 @@ void BlitImageHelper::ConvertR16ToD16(const Framebuffer* dst_framebuffer, | |||
| 435 | void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer, | 435 | void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer, |
| 436 | const ImageView& src_image_view) { | 436 | const ImageView& src_image_view) { |
| 437 | const VkPipelineLayout layout = *one_texture_pipeline_layout; | 437 | const VkPipelineLayout layout = *one_texture_pipeline_layout; |
| 438 | const VkImageView src_view = src_image_view.Handle(ImageViewType::e2D); | 438 | const VkImageView src_view = src_image_view.Handle(Shader::TextureType::Color2D); |
| 439 | const VkSampler sampler = *nearest_sampler; | 439 | const VkSampler sampler = *nearest_sampler; |
| 440 | const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit(); | 440 | const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit(); |
| 441 | const VkExtent2D extent{ | 441 | const VkExtent2D extent{ |
diff --git a/src/video_core/renderer_vulkan/pipeline_helper.h b/src/video_core/renderer_vulkan/pipeline_helper.h index cff93cc60..d2c3f11c1 100644 --- a/src/video_core/renderer_vulkan/pipeline_helper.h +++ b/src/video_core/renderer_vulkan/pipeline_helper.h | |||
| @@ -97,6 +97,9 @@ public: | |||
| 97 | for ([[maybe_unused]] const auto& desc : info.texture_descriptors) { | 97 | for ([[maybe_unused]] const auto& desc : info.texture_descriptors) { |
| 98 | Add(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, stage); | 98 | Add(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, stage); |
| 99 | } | 99 | } |
| 100 | for (const auto& desc : info.image_descriptors) { | ||
| 101 | Add(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, stage); | ||
| 102 | } | ||
| 100 | } | 103 | } |
| 101 | 104 | ||
| 102 | private: | 105 | private: |
| @@ -127,36 +130,6 @@ private: | |||
| 127 | size_t offset{}; | 130 | size_t offset{}; |
| 128 | }; | 131 | }; |
| 129 | 132 | ||
| 130 | inline VideoCommon::ImageViewType CastType(Shader::TextureType type) { | ||
| 131 | switch (type) { | ||
| 132 | case Shader::TextureType::Color1D: | ||
| 133 | case Shader::TextureType::Shadow1D: | ||
| 134 | return VideoCommon::ImageViewType::e1D; | ||
| 135 | case Shader::TextureType::ColorArray1D: | ||
| 136 | case Shader::TextureType::ShadowArray1D: | ||
| 137 | return VideoCommon::ImageViewType::e1DArray; | ||
| 138 | case Shader::TextureType::Color2D: | ||
| 139 | case Shader::TextureType::Shadow2D: | ||
| 140 | return VideoCommon::ImageViewType::e2D; | ||
| 141 | case Shader::TextureType::ColorArray2D: | ||
| 142 | case Shader::TextureType::ShadowArray2D: | ||
| 143 | return VideoCommon::ImageViewType::e2DArray; | ||
| 144 | case Shader::TextureType::Color3D: | ||
| 145 | case Shader::TextureType::Shadow3D: | ||
| 146 | return VideoCommon::ImageViewType::e3D; | ||
| 147 | case Shader::TextureType::ColorCube: | ||
| 148 | case Shader::TextureType::ShadowCube: | ||
| 149 | return VideoCommon::ImageViewType::Cube; | ||
| 150 | case Shader::TextureType::ColorArrayCube: | ||
| 151 | case Shader::TextureType::ShadowArrayCube: | ||
| 152 | return VideoCommon::ImageViewType::CubeArray; | ||
| 153 | case Shader::TextureType::Buffer: | ||
| 154 | break; | ||
| 155 | } | ||
| 156 | UNREACHABLE_MSG("Invalid texture type {}", type); | ||
| 157 | return {}; | ||
| 158 | } | ||
| 159 | |||
| 160 | inline void PushImageDescriptors(const Shader::Info& info, const VkSampler*& samplers, | 133 | inline void PushImageDescriptors(const Shader::Info& info, const VkSampler*& samplers, |
| 161 | const ImageId*& image_view_ids, TextureCache& texture_cache, | 134 | const ImageId*& image_view_ids, TextureCache& texture_cache, |
| 162 | VKUpdateDescriptorQueue& update_descriptor_queue) { | 135 | VKUpdateDescriptorQueue& update_descriptor_queue) { |
| @@ -164,9 +137,17 @@ inline void PushImageDescriptors(const Shader::Info& info, const VkSampler*& sam | |||
| 164 | for (const auto& desc : info.texture_descriptors) { | 137 | for (const auto& desc : info.texture_descriptors) { |
| 165 | const VkSampler sampler{*(samplers++)}; | 138 | const VkSampler sampler{*(samplers++)}; |
| 166 | ImageView& image_view{texture_cache.GetImageView(*(image_view_ids++))}; | 139 | ImageView& image_view{texture_cache.GetImageView(*(image_view_ids++))}; |
| 167 | const VkImageView vk_image_view{image_view.Handle(CastType(desc.type))}; | 140 | const VkImageView vk_image_view{image_view.Handle(desc.type)}; |
| 168 | update_descriptor_queue.AddSampledImage(vk_image_view, sampler); | 141 | update_descriptor_queue.AddSampledImage(vk_image_view, sampler); |
| 169 | } | 142 | } |
| 143 | for (const auto& desc : info.image_descriptors) { | ||
| 144 | ImageView& image_view{texture_cache.GetImageView(*(image_view_ids++))}; | ||
| 145 | if (desc.is_written) { | ||
| 146 | texture_cache.MarkModification(image_view.image_id); | ||
| 147 | } | ||
| 148 | const VkImageView vk_image_view{image_view.StorageView(desc.type, desc.format)}; | ||
| 149 | update_descriptor_queue.AddImage(vk_image_view); | ||
| 150 | } | ||
| 170 | } | 151 | } |
| 171 | 152 | ||
| 172 | } // namespace Vulkan | 153 | } // 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 ac47b1f3c..3d690f335 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp | |||
| @@ -108,6 +108,10 @@ void ComputePipeline::Configure(Tegra::Engines::KeplerCompute& kepler_compute, | |||
| 108 | Sampler* const sampler = texture_cache.GetComputeSampler(handle.sampler); | 108 | Sampler* const sampler = texture_cache.GetComputeSampler(handle.sampler); |
| 109 | samplers.push_back(sampler->Handle()); | 109 | samplers.push_back(sampler->Handle()); |
| 110 | } | 110 | } |
| 111 | for (const auto& desc : info.image_descriptors) { | ||
| 112 | const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)}; | ||
| 113 | image_view_indices.push_back(handle.image); | ||
| 114 | } | ||
| 111 | 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()); |
| 112 | texture_cache.FillComputeImageViews(indices_span, image_view_ids); | 116 | texture_cache.FillComputeImageViews(indices_span, image_view_ids); |
| 113 | 117 | ||
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 57e2d569c..23c01f24e 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | |||
| @@ -186,6 +186,10 @@ void GraphicsPipeline::Configure(bool is_indexed) { | |||
| 186 | Sampler* const sampler{texture_cache.GetGraphicsSampler(handle.sampler)}; | 186 | Sampler* const sampler{texture_cache.GetGraphicsSampler(handle.sampler)}; |
| 187 | samplers.push_back(sampler->Handle()); | 187 | samplers.push_back(sampler->Handle()); |
| 188 | } | 188 | } |
| 189 | for (const auto& desc : info.image_descriptors) { | ||
| 190 | const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)}; | ||
| 191 | image_view_indices.push_back(handle.image); | ||
| 192 | } | ||
| 189 | } | 193 | } |
| 190 | const std::span indices_span(image_view_indices.data(), image_view_indices.size()); | 194 | const std::span indices_span(image_view_indices.data(), image_view_indices.size()); |
| 191 | texture_cache.FillGraphicsImageViews(indices_span, image_view_ids); | 195 | texture_cache.FillGraphicsImageViews(indices_span, image_view_ids); |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 0292a1b94..2ba44330f 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -494,7 +494,7 @@ bool RasterizerVulkan::AccelerateDisplay(const Tegra::FramebufferConfig& config, | |||
| 494 | if (!image_view) { | 494 | if (!image_view) { |
| 495 | return false; | 495 | return false; |
| 496 | } | 496 | } |
| 497 | screen_info.image_view = image_view->Handle(VideoCommon::ImageViewType::e2D); | 497 | screen_info.image_view = image_view->Handle(Shader::TextureType::Color2D); |
| 498 | screen_info.width = image_view->size.width; | 498 | screen_info.width = image_view->size.width; |
| 499 | screen_info.height = image_view->size.height; | 499 | screen_info.height = image_view->size.height; |
| 500 | screen_info.is_srgb = VideoCore::Surface::IsPixelFormatSRGB(image_view->format); | 500 | screen_info.is_srgb = VideoCore::Surface::IsPixelFormatSRGB(image_view->format); |
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 70328680d..8e029bcb3 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp | |||
| @@ -215,6 +215,30 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) { | |||
| 215 | return VK_COMPONENT_SWIZZLE_ZERO; | 215 | return VK_COMPONENT_SWIZZLE_ZERO; |
| 216 | } | 216 | } |
| 217 | 217 | ||
| 218 | [[nodiscard]] VkImageViewType ImageViewType(Shader::TextureType type) { | ||
| 219 | switch (type) { | ||
| 220 | case Shader::TextureType::Color1D: | ||
| 221 | return VK_IMAGE_VIEW_TYPE_1D; | ||
| 222 | case Shader::TextureType::Color2D: | ||
| 223 | return VK_IMAGE_VIEW_TYPE_2D; | ||
| 224 | case Shader::TextureType::ColorCube: | ||
| 225 | return VK_IMAGE_VIEW_TYPE_CUBE; | ||
| 226 | case Shader::TextureType::Color3D: | ||
| 227 | return VK_IMAGE_VIEW_TYPE_3D; | ||
| 228 | case Shader::TextureType::ColorArray1D: | ||
| 229 | return VK_IMAGE_VIEW_TYPE_1D_ARRAY; | ||
| 230 | case Shader::TextureType::ColorArray2D: | ||
| 231 | return VK_IMAGE_VIEW_TYPE_2D_ARRAY; | ||
| 232 | case Shader::TextureType::ColorArrayCube: | ||
| 233 | return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; | ||
| 234 | case Shader::TextureType::Buffer: | ||
| 235 | UNREACHABLE_MSG("Texture buffers can't be image views"); | ||
| 236 | return VK_IMAGE_VIEW_TYPE_1D; | ||
| 237 | } | ||
| 238 | UNREACHABLE_MSG("Invalid image view type={}", type); | ||
| 239 | return VK_IMAGE_VIEW_TYPE_2D; | ||
| 240 | } | ||
| 241 | |||
| 218 | [[nodiscard]] VkImageViewType ImageViewType(VideoCommon::ImageViewType type) { | 242 | [[nodiscard]] VkImageViewType ImageViewType(VideoCommon::ImageViewType type) { |
| 219 | switch (type) { | 243 | switch (type) { |
| 220 | case VideoCommon::ImageViewType::e1D: | 244 | case VideoCommon::ImageViewType::e1D: |
| @@ -232,7 +256,7 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) { | |||
| 232 | case VideoCommon::ImageViewType::CubeArray: | 256 | case VideoCommon::ImageViewType::CubeArray: |
| 233 | return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; | 257 | return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; |
| 234 | case VideoCommon::ImageViewType::Rect: | 258 | case VideoCommon::ImageViewType::Rect: |
| 235 | LOG_WARNING(Render_Vulkan, "Unnormalized image view type not supported"); | 259 | UNIMPLEMENTED_MSG("Rect image view"); |
| 236 | return VK_IMAGE_VIEW_TYPE_2D; | 260 | return VK_IMAGE_VIEW_TYPE_2D; |
| 237 | case VideoCommon::ImageViewType::Buffer: | 261 | case VideoCommon::ImageViewType::Buffer: |
| 238 | UNREACHABLE_MSG("Texture buffers can't be image views"); | 262 | UNREACHABLE_MSG("Texture buffers can't be image views"); |
| @@ -539,6 +563,28 @@ struct RangedBarrierRange { | |||
| 539 | } | 563 | } |
| 540 | }; | 564 | }; |
| 541 | 565 | ||
| 566 | [[nodiscard]] VkFormat Format(Shader::ImageFormat format) { | ||
| 567 | switch (format) { | ||
| 568 | case Shader::ImageFormat::Typeless: | ||
| 569 | break; | ||
| 570 | case Shader::ImageFormat::R8_SINT: | ||
| 571 | return VK_FORMAT_R8_SINT; | ||
| 572 | case Shader::ImageFormat::R8_UINT: | ||
| 573 | return VK_FORMAT_R8_UINT; | ||
| 574 | case Shader::ImageFormat::R16_UINT: | ||
| 575 | return VK_FORMAT_R16_UINT; | ||
| 576 | case Shader::ImageFormat::R16_SINT: | ||
| 577 | return VK_FORMAT_R16_SINT; | ||
| 578 | case Shader::ImageFormat::R32_UINT: | ||
| 579 | return VK_FORMAT_R32_UINT; | ||
| 580 | case Shader::ImageFormat::R32G32_UINT: | ||
| 581 | return VK_FORMAT_R32G32_UINT; | ||
| 582 | case Shader::ImageFormat::R32G32B32A32_UINT: | ||
| 583 | return VK_FORMAT_R32G32B32A32_UINT; | ||
| 584 | } | ||
| 585 | UNREACHABLE_MSG("Invalid image format={}", format); | ||
| 586 | return VK_FORMAT_R32_UINT; | ||
| 587 | } | ||
| 542 | } // Anonymous namespace | 588 | } // Anonymous namespace |
| 543 | 589 | ||
| 544 | void TextureCacheRuntime::Finish() { | 590 | void TextureCacheRuntime::Finish() { |
| @@ -577,7 +623,7 @@ void TextureCacheRuntime::BlitImage(Framebuffer* dst_framebuffer, ImageView& dst | |||
| 577 | return; | 623 | return; |
| 578 | } | 624 | } |
| 579 | } | 625 | } |
| 580 | ASSERT(src.ImageFormat() == dst.ImageFormat()); | 626 | ASSERT(src.format == dst.format); |
| 581 | ASSERT(!(is_dst_msaa && !is_src_msaa)); | 627 | ASSERT(!(is_dst_msaa && !is_src_msaa)); |
| 582 | ASSERT(operation == Fermi2D::Operation::SrcCopy); | 628 | ASSERT(operation == Fermi2D::Operation::SrcCopy); |
| 583 | 629 | ||
| @@ -915,8 +961,9 @@ void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferIm | |||
| 915 | ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, | 961 | ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, |
| 916 | ImageId image_id_, Image& image) | 962 | ImageId image_id_, Image& image) |
| 917 | : VideoCommon::ImageViewBase{info, image.info, image_id_}, device{&runtime.device}, | 963 | : VideoCommon::ImageViewBase{info, image.info, image_id_}, device{&runtime.device}, |
| 918 | image_handle{image.Handle()}, image_format{image.info.format}, samples{ConvertSampleCount( | 964 | image_handle{image.Handle()}, samples{ConvertSampleCount(image.info.num_samples)} { |
| 919 | image.info.num_samples)} { | 965 | using Shader::TextureType; |
| 966 | |||
| 920 | const VkImageAspectFlags aspect_mask = ImageViewAspectMask(info); | 967 | const VkImageAspectFlags aspect_mask = ImageViewAspectMask(info); |
| 921 | std::array<SwizzleSource, 4> swizzle{ | 968 | std::array<SwizzleSource, 4> swizzle{ |
| 922 | SwizzleSource::R, | 969 | SwizzleSource::R, |
| @@ -954,39 +1001,39 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI | |||
| 954 | }, | 1001 | }, |
| 955 | .subresourceRange = MakeSubresourceRange(aspect_mask, info.range), | 1002 | .subresourceRange = MakeSubresourceRange(aspect_mask, info.range), |
| 956 | }; | 1003 | }; |
| 957 | const auto create = [&](VideoCommon::ImageViewType view_type, std::optional<u32> num_layers) { | 1004 | const auto create = [&](TextureType tex_type, std::optional<u32> num_layers) { |
| 958 | VkImageViewCreateInfo ci{create_info}; | 1005 | VkImageViewCreateInfo ci{create_info}; |
| 959 | ci.viewType = ImageViewType(view_type); | 1006 | ci.viewType = ImageViewType(tex_type); |
| 960 | if (num_layers) { | 1007 | if (num_layers) { |
| 961 | ci.subresourceRange.layerCount = *num_layers; | 1008 | ci.subresourceRange.layerCount = *num_layers; |
| 962 | } | 1009 | } |
| 963 | vk::ImageView handle = device->GetLogical().CreateImageView(ci); | 1010 | vk::ImageView handle = device->GetLogical().CreateImageView(ci); |
| 964 | if (device->HasDebuggingToolAttached()) { | 1011 | if (device->HasDebuggingToolAttached()) { |
| 965 | handle.SetObjectNameEXT(VideoCommon::Name(*this, view_type).c_str()); | 1012 | handle.SetObjectNameEXT(VideoCommon::Name(*this).c_str()); |
| 966 | } | 1013 | } |
| 967 | image_views[static_cast<size_t>(view_type)] = std::move(handle); | 1014 | image_views[static_cast<size_t>(tex_type)] = std::move(handle); |
| 968 | }; | 1015 | }; |
| 969 | switch (info.type) { | 1016 | switch (info.type) { |
| 970 | case VideoCommon::ImageViewType::e1D: | 1017 | case VideoCommon::ImageViewType::e1D: |
| 971 | case VideoCommon::ImageViewType::e1DArray: | 1018 | case VideoCommon::ImageViewType::e1DArray: |
| 972 | create(VideoCommon::ImageViewType::e1D, 1); | 1019 | create(TextureType::Color1D, 1); |
| 973 | create(VideoCommon::ImageViewType::e1DArray, std::nullopt); | 1020 | create(TextureType::ColorArray1D, std::nullopt); |
| 974 | render_target = Handle(VideoCommon::ImageViewType::e1DArray); | 1021 | render_target = Handle(TextureType::ColorArray1D); |
| 975 | break; | 1022 | break; |
| 976 | case VideoCommon::ImageViewType::e2D: | 1023 | case VideoCommon::ImageViewType::e2D: |
| 977 | case VideoCommon::ImageViewType::e2DArray: | 1024 | case VideoCommon::ImageViewType::e2DArray: |
| 978 | create(VideoCommon::ImageViewType::e2D, 1); | 1025 | create(TextureType::Color2D, 1); |
| 979 | create(VideoCommon::ImageViewType::e2DArray, std::nullopt); | 1026 | create(TextureType::ColorArray2D, std::nullopt); |
| 980 | render_target = Handle(VideoCommon::ImageViewType::e2DArray); | 1027 | render_target = Handle(Shader::TextureType::ColorArray2D); |
| 981 | break; | 1028 | break; |
| 982 | case VideoCommon::ImageViewType::e3D: | 1029 | case VideoCommon::ImageViewType::e3D: |
| 983 | create(VideoCommon::ImageViewType::e3D, std::nullopt); | 1030 | create(TextureType::Color3D, std::nullopt); |
| 984 | render_target = Handle(VideoCommon::ImageViewType::e3D); | 1031 | render_target = Handle(Shader::TextureType::Color3D); |
| 985 | break; | 1032 | break; |
| 986 | case VideoCommon::ImageViewType::Cube: | 1033 | case VideoCommon::ImageViewType::Cube: |
| 987 | case VideoCommon::ImageViewType::CubeArray: | 1034 | case VideoCommon::ImageViewType::CubeArray: |
| 988 | create(VideoCommon::ImageViewType::Cube, 6); | 1035 | create(TextureType::ColorCube, 6); |
| 989 | create(VideoCommon::ImageViewType::CubeArray, std::nullopt); | 1036 | create(TextureType::ColorArrayCube, std::nullopt); |
| 990 | break; | 1037 | break; |
| 991 | case VideoCommon::ImageViewType::Rect: | 1038 | case VideoCommon::ImageViewType::Rect: |
| 992 | UNIMPLEMENTED(); | 1039 | UNIMPLEMENTED(); |
| @@ -1009,7 +1056,8 @@ VkImageView ImageView::DepthView() { | |||
| 1009 | if (depth_view) { | 1056 | if (depth_view) { |
| 1010 | return *depth_view; | 1057 | return *depth_view; |
| 1011 | } | 1058 | } |
| 1012 | depth_view = MakeDepthStencilView(VK_IMAGE_ASPECT_DEPTH_BIT); | 1059 | const auto& info = MaxwellToVK::SurfaceFormat(*device, FormatType::Optimal, true, format); |
| 1060 | depth_view = MakeView(info.format, VK_IMAGE_ASPECT_DEPTH_BIT); | ||
| 1013 | return *depth_view; | 1061 | return *depth_view; |
| 1014 | } | 1062 | } |
| 1015 | 1063 | ||
| @@ -1017,18 +1065,38 @@ VkImageView ImageView::StencilView() { | |||
| 1017 | if (stencil_view) { | 1065 | if (stencil_view) { |
| 1018 | return *stencil_view; | 1066 | return *stencil_view; |
| 1019 | } | 1067 | } |
| 1020 | stencil_view = MakeDepthStencilView(VK_IMAGE_ASPECT_STENCIL_BIT); | 1068 | const auto& info = MaxwellToVK::SurfaceFormat(*device, FormatType::Optimal, true, format); |
| 1069 | stencil_view = MakeView(info.format, VK_IMAGE_ASPECT_STENCIL_BIT); | ||
| 1021 | return *stencil_view; | 1070 | return *stencil_view; |
| 1022 | } | 1071 | } |
| 1023 | 1072 | ||
| 1024 | vk::ImageView ImageView::MakeDepthStencilView(VkImageAspectFlags aspect_mask) { | 1073 | VkImageView ImageView::StorageView(Shader::TextureType texture_type, |
| 1074 | Shader::ImageFormat image_format) { | ||
| 1075 | if (image_format == Shader::ImageFormat::Typeless) { | ||
| 1076 | return Handle(texture_type); | ||
| 1077 | } | ||
| 1078 | const bool is_signed{image_format == Shader::ImageFormat::R8_SINT || | ||
| 1079 | image_format == Shader::ImageFormat::R16_SINT}; | ||
| 1080 | if (!storage_views) { | ||
| 1081 | storage_views = std::make_unique<StorageViews>(); | ||
| 1082 | } | ||
| 1083 | auto& views{is_signed ? storage_views->signeds : storage_views->unsigneds}; | ||
| 1084 | auto& view{views[static_cast<size_t>(texture_type)]}; | ||
| 1085 | if (view) { | ||
| 1086 | return *view; | ||
| 1087 | } | ||
| 1088 | view = MakeView(Format(image_format), VK_IMAGE_ASPECT_COLOR_BIT); | ||
| 1089 | return *view; | ||
| 1090 | } | ||
| 1091 | |||
| 1092 | vk::ImageView ImageView::MakeView(VkFormat vk_format, VkImageAspectFlags aspect_mask) { | ||
| 1025 | return device->GetLogical().CreateImageView({ | 1093 | return device->GetLogical().CreateImageView({ |
| 1026 | .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, | 1094 | .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, |
| 1027 | .pNext = nullptr, | 1095 | .pNext = nullptr, |
| 1028 | .flags = 0, | 1096 | .flags = 0, |
| 1029 | .image = image_handle, | 1097 | .image = image_handle, |
| 1030 | .viewType = ImageViewType(type), | 1098 | .viewType = ImageViewType(type), |
| 1031 | .format = MaxwellToVK::SurfaceFormat(*device, FormatType::Optimal, true, format).format, | 1099 | .format = vk_format, |
| 1032 | .components{ | 1100 | .components{ |
| 1033 | .r = VK_COMPONENT_SWIZZLE_IDENTITY, | 1101 | .r = VK_COMPONENT_SWIZZLE_IDENTITY, |
| 1034 | .g = VK_COMPONENT_SWIZZLE_IDENTITY, | 1102 | .g = VK_COMPONENT_SWIZZLE_IDENTITY, |
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index 498e76a1c..0b73d55f8 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <compare> | 7 | #include <compare> |
| 8 | #include <span> | 8 | #include <span> |
| 9 | 9 | ||
| 10 | #include "shader_recompiler/shader_info.h" | ||
| 10 | #include "video_core/renderer_vulkan/vk_staging_buffer_pool.h" | 11 | #include "video_core/renderer_vulkan/vk_staging_buffer_pool.h" |
| 11 | #include "video_core/texture_cache/texture_cache.h" | 12 | #include "video_core/texture_cache/texture_cache.h" |
| 12 | #include "video_core/vulkan_common/vulkan_memory_allocator.h" | 13 | #include "video_core/vulkan_common/vulkan_memory_allocator.h" |
| @@ -133,8 +134,11 @@ public: | |||
| 133 | 134 | ||
| 134 | [[nodiscard]] VkImageView StencilView(); | 135 | [[nodiscard]] VkImageView StencilView(); |
| 135 | 136 | ||
| 136 | [[nodiscard]] VkImageView Handle(VideoCommon::ImageViewType query_type) const noexcept { | 137 | [[nodiscard]] VkImageView StorageView(Shader::TextureType texture_type, |
| 137 | return *image_views[static_cast<size_t>(query_type)]; | 138 | Shader::ImageFormat image_format); |
| 139 | |||
| 140 | [[nodiscard]] VkImageView Handle(Shader::TextureType texture_type) const noexcept { | ||
| 141 | return *image_views[static_cast<size_t>(texture_type)]; | ||
| 138 | } | 142 | } |
| 139 | 143 | ||
| 140 | [[nodiscard]] VkImage ImageHandle() const noexcept { | 144 | [[nodiscard]] VkImage ImageHandle() const noexcept { |
| @@ -145,10 +149,6 @@ public: | |||
| 145 | return render_target; | 149 | return render_target; |
| 146 | } | 150 | } |
| 147 | 151 | ||
| 148 | [[nodiscard]] PixelFormat ImageFormat() const noexcept { | ||
| 149 | return image_format; | ||
| 150 | } | ||
| 151 | |||
| 152 | [[nodiscard]] VkSampleCountFlagBits Samples() const noexcept { | 152 | [[nodiscard]] VkSampleCountFlagBits Samples() const noexcept { |
| 153 | return samples; | 153 | return samples; |
| 154 | } | 154 | } |
| @@ -162,15 +162,20 @@ public: | |||
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | private: | 164 | private: |
| 165 | [[nodiscard]] vk::ImageView MakeDepthStencilView(VkImageAspectFlags aspect_mask); | 165 | struct StorageViews { |
| 166 | std::array<vk::ImageView, Shader::NUM_TEXTURE_TYPES> signeds; | ||
| 167 | std::array<vk::ImageView, Shader::NUM_TEXTURE_TYPES> unsigneds; | ||
| 168 | }; | ||
| 169 | |||
| 170 | [[nodiscard]] vk::ImageView MakeView(VkFormat vk_format, VkImageAspectFlags aspect_mask); | ||
| 166 | 171 | ||
| 167 | const Device* device = nullptr; | 172 | const Device* device = nullptr; |
| 168 | std::array<vk::ImageView, VideoCommon::NUM_IMAGE_VIEW_TYPES> image_views; | 173 | std::array<vk::ImageView, Shader::NUM_TEXTURE_TYPES> image_views; |
| 174 | std::unique_ptr<StorageViews> storage_views; | ||
| 169 | vk::ImageView depth_view; | 175 | vk::ImageView depth_view; |
| 170 | vk::ImageView stencil_view; | 176 | vk::ImageView stencil_view; |
| 171 | VkImage image_handle = VK_NULL_HANDLE; | 177 | VkImage image_handle = VK_NULL_HANDLE; |
| 172 | VkImageView render_target = VK_NULL_HANDLE; | 178 | VkImageView render_target = VK_NULL_HANDLE; |
| 173 | PixelFormat image_format = PixelFormat::Invalid; | ||
| 174 | VkSampleCountFlagBits samples = VK_SAMPLE_COUNT_1_BIT; | 179 | VkSampleCountFlagBits samples = VK_SAMPLE_COUNT_1_BIT; |
| 175 | GPUVAddr gpu_addr = 0; | 180 | GPUVAddr gpu_addr = 0; |
| 176 | u32 buffer_size = 0; | 181 | u32 buffer_size = 0; |
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 5e8d99482..255b07cf8 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h | |||
| @@ -117,6 +117,9 @@ public: | |||
| 117 | /// Return a reference to the given image view id | 117 | /// Return a reference to the given image view id |
| 118 | [[nodiscard]] ImageView& GetImageView(ImageViewId id) noexcept; | 118 | [[nodiscard]] ImageView& GetImageView(ImageViewId id) noexcept; |
| 119 | 119 | ||
| 120 | /// Mark an image as modified from the GPU | ||
| 121 | void MarkModification(ImageId id) noexcept; | ||
| 122 | |||
| 120 | /// Fill image_view_ids with the graphics images in indices | 123 | /// Fill image_view_ids with the graphics images in indices |
| 121 | void FillGraphicsImageViews(std::span<const u32> indices, | 124 | void FillGraphicsImageViews(std::span<const u32> indices, |
| 122 | std::span<ImageViewId> image_view_ids); | 125 | std::span<ImageViewId> image_view_ids); |
| @@ -527,6 +530,11 @@ typename P::ImageView& TextureCache<P>::GetImageView(ImageViewId id) noexcept { | |||
| 527 | } | 530 | } |
| 528 | 531 | ||
| 529 | template <class P> | 532 | template <class P> |
| 533 | void TextureCache<P>::MarkModification(ImageId id) noexcept { | ||
| 534 | MarkModification(slot_images[id]); | ||
| 535 | } | ||
| 536 | |||
| 537 | template <class P> | ||
| 530 | void TextureCache<P>::FillGraphicsImageViews(std::span<const u32> indices, | 538 | void TextureCache<P>::FillGraphicsImageViews(std::span<const u32> indices, |
| 531 | std::span<ImageViewId> image_view_ids) { | 539 | std::span<ImageViewId> image_view_ids) { |
| 532 | FillImageViews(graphics_image_table, graphics_image_view_ids, indices, image_view_ids); | 540 | FillImageViews(graphics_image_table, graphics_image_view_ids, indices, image_view_ids); |