diff options
Diffstat (limited to 'src')
4 files changed, 33 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h index 3676eaaa9..e71b87e99 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.h +++ b/src/video_core/renderer_opengl/gl_texture_cache.h | |||
| @@ -118,6 +118,8 @@ public: | |||
| 118 | 118 | ||
| 119 | void InsertUploadMemoryBarrier(); | 119 | void InsertUploadMemoryBarrier(); |
| 120 | 120 | ||
| 121 | void TransitionImageLayout(Image& image) {} | ||
| 122 | |||
| 121 | FormatProperties FormatInfo(VideoCommon::ImageType type, GLenum internal_format) const; | 123 | FormatProperties FormatInfo(VideoCommon::ImageType type, GLenum internal_format) const; |
| 122 | 124 | ||
| 123 | bool HasNativeBgr() const noexcept { | 125 | bool HasNativeBgr() const noexcept { |
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 1b8bb9662..93773a69f 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp | |||
| @@ -2013,4 +2013,32 @@ void TextureCacheRuntime::AccelerateImageUpload( | |||
| 2013 | ASSERT(false); | 2013 | ASSERT(false); |
| 2014 | } | 2014 | } |
| 2015 | 2015 | ||
| 2016 | void TextureCacheRuntime::TransitionImageLayout(Image& image) { | ||
| 2017 | if (!image.ExchangeInitialization()) { | ||
| 2018 | VkImageMemoryBarrier barrier{ | ||
| 2019 | .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, | ||
| 2020 | .pNext = nullptr, | ||
| 2021 | .srcAccessMask = VK_ACCESS_NONE, | ||
| 2022 | .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, | ||
| 2023 | .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED, | ||
| 2024 | .newLayout = VK_IMAGE_LAYOUT_GENERAL, | ||
| 2025 | .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||
| 2026 | .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||
| 2027 | .image = image.Handle(), | ||
| 2028 | .subresourceRange{ | ||
| 2029 | .aspectMask = image.AspectMask(), | ||
| 2030 | .baseMipLevel = 0, | ||
| 2031 | .levelCount = VK_REMAINING_MIP_LEVELS, | ||
| 2032 | .baseArrayLayer = 0, | ||
| 2033 | .layerCount = VK_REMAINING_ARRAY_LAYERS, | ||
| 2034 | }, | ||
| 2035 | }; | ||
| 2036 | scheduler.RequestOutsideRenderPassOperationContext(); | ||
| 2037 | scheduler.Record([barrier = barrier](vk::CommandBuffer cmdbuf) { | ||
| 2038 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, | ||
| 2039 | VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, barrier); | ||
| 2040 | }); | ||
| 2041 | } | ||
| 2042 | } | ||
| 2043 | |||
| 2016 | } // namespace Vulkan | 2044 | } // namespace Vulkan |
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index d6c5a15cc..7a0807709 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h | |||
| @@ -92,6 +92,8 @@ public: | |||
| 92 | 92 | ||
| 93 | void InsertUploadMemoryBarrier() {} | 93 | void InsertUploadMemoryBarrier() {} |
| 94 | 94 | ||
| 95 | void TransitionImageLayout(Image& image); | ||
| 96 | |||
| 95 | bool HasBrokenTextureViewFormats() const noexcept { | 97 | bool HasBrokenTextureViewFormats() const noexcept { |
| 96 | // No known Vulkan driver has broken image views | 98 | // No known Vulkan driver has broken image views |
| 97 | return false; | 99 | return false; |
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 1bdb0def5..d575c57ca 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h | |||
| @@ -1016,6 +1016,7 @@ void TextureCache<P>::RefreshContents(Image& image, ImageId image_id) { | |||
| 1016 | 1016 | ||
| 1017 | if (image.info.num_samples > 1 && !runtime.CanUploadMSAA()) { | 1017 | if (image.info.num_samples > 1 && !runtime.CanUploadMSAA()) { |
| 1018 | LOG_WARNING(HW_GPU, "MSAA image uploads are not implemented"); | 1018 | LOG_WARNING(HW_GPU, "MSAA image uploads are not implemented"); |
| 1019 | runtime.TransitionImageLayout(image); | ||
| 1019 | return; | 1020 | return; |
| 1020 | } | 1021 | } |
| 1021 | if (True(image.flags & ImageFlagBits::AsynchronousDecode)) { | 1022 | if (True(image.flags & ImageFlagBits::AsynchronousDecode)) { |