summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-04-09 01:45:39 -0300
committerGravatar ameerj2021-07-22 21:51:26 -0400
commit7cb2ab358517d95ebcd35c94c72b9e91762906c3 (patch)
tree3f75959e255026665a4dde406cb8c4cc34fb45a0 /src/video_core
parentshader: Fix Windows build issues (diff)
downloadyuzu-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.cpp4
-rw-r--r--src/video_core/renderer_vulkan/pipeline_helper.h43
-rw-r--r--src/video_core/renderer_vulkan/vk_compute_pipeline.cpp4
-rw-r--r--src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp4
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp2
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp112
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.h23
-rw-r--r--src/video_core/texture_cache/texture_cache.h8
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,
435void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer, 435void 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
102private: 105private:
@@ -127,36 +130,6 @@ private:
127 size_t offset{}; 130 size_t offset{};
128}; 131};
129 132
130inline 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
160inline void PushImageDescriptors(const Shader::Info& info, const VkSampler*& samplers, 133inline 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
544void TextureCacheRuntime::Finish() { 590void 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
915ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, 961ImageView::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
1024vk::ImageView ImageView::MakeDepthStencilView(VkImageAspectFlags aspect_mask) { 1073VkImageView 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
1092vk::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
164private: 164private:
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
529template <class P> 532template <class P>
533void TextureCache<P>::MarkModification(ImageId id) noexcept {
534 MarkModification(slot_images[id]);
535}
536
537template <class P>
530void TextureCache<P>::FillGraphicsImageViews(std::span<const u32> indices, 538void 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);