diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.cpp | 9 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp | 1 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 14 | ||||
| -rw-r--r-- | src/video_core/textures/decoders.cpp | 9 |
5 files changed, 39 insertions, 4 deletions
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index 9cafd2983..9ca544ec9 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp | |||
| @@ -554,7 +554,14 @@ void TextureCacheRuntime::Finish() { | |||
| 554 | } | 554 | } |
| 555 | 555 | ||
| 556 | StagingBufferMap TextureCacheRuntime::UploadStagingBuffer(size_t size) { | 556 | StagingBufferMap TextureCacheRuntime::UploadStagingBuffer(size_t size) { |
| 557 | return staging_buffer_pool.RequestUploadBuffer(size); | 557 | static StagingBufferMap result; |
| 558 | static size_t last_size = 0; | ||
| 559 | if (size == last_size) { | ||
| 560 | return result; | ||
| 561 | } | ||
| 562 | last_size = size; | ||
| 563 | result = staging_buffer_pool.RequestUploadBuffer(size); | ||
| 564 | return result; | ||
| 558 | } | 565 | } |
| 559 | 566 | ||
| 560 | StagingBufferMap TextureCacheRuntime::DownloadStagingBuffer(size_t size) { | 567 | StagingBufferMap TextureCacheRuntime::DownloadStagingBuffer(size_t size) { |
diff --git a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp index ce92f66ab..27328dab2 100644 --- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp | |||
| @@ -214,6 +214,7 @@ StagingBufferPool::StagingBuffersCache& StagingBufferPool::GetCache(MemoryUsage | |||
| 214 | } | 214 | } |
| 215 | 215 | ||
| 216 | void StagingBufferPool::ReleaseCache(MemoryUsage usage) { | 216 | void StagingBufferPool::ReleaseCache(MemoryUsage usage) { |
| 217 | return; | ||
| 217 | ReleaseLevel(GetCache(usage), current_delete_level); | 218 | ReleaseLevel(GetCache(usage), current_delete_level); |
| 218 | } | 219 | } |
| 219 | 220 | ||
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index b3e17c332..51be57b19 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp | |||
| @@ -846,7 +846,15 @@ void TextureCacheRuntime::Finish() { | |||
| 846 | } | 846 | } |
| 847 | 847 | ||
| 848 | StagingBufferRef TextureCacheRuntime::UploadStagingBuffer(size_t size) { | 848 | StagingBufferRef TextureCacheRuntime::UploadStagingBuffer(size_t size) { |
| 849 | return staging_buffer_pool.Request(size, MemoryUsage::Upload); | 849 | static StagingBufferRef result; |
| 850 | static size_t last_size = 0; | ||
| 851 | if (size == last_size) { | ||
| 852 | return result; | ||
| 853 | } | ||
| 854 | LOG_ERROR(Debug, "Called"); | ||
| 855 | last_size = size; | ||
| 856 | result = staging_buffer_pool.Request(size, MemoryUsage::Upload); | ||
| 857 | return result; | ||
| 850 | } | 858 | } |
| 851 | 859 | ||
| 852 | StagingBufferRef TextureCacheRuntime::DownloadStagingBuffer(size_t size, bool deferred) { | 860 | StagingBufferRef TextureCacheRuntime::DownloadStagingBuffer(size_t size, bool deferred) { |
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 4457b366f..6b87987de 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h | |||
| @@ -1021,8 +1021,18 @@ void TextureCache<P>::UploadImageContents(Image& image, StagingBuffer& staging) | |||
| 1021 | const GPUVAddr gpu_addr = image.gpu_addr; | 1021 | const GPUVAddr gpu_addr = image.gpu_addr; |
| 1022 | 1022 | ||
| 1023 | if (True(image.flags & ImageFlagBits::AcceleratedUpload)) { | 1023 | if (True(image.flags & ImageFlagBits::AcceleratedUpload)) { |
| 1024 | gpu_memory->ReadBlock(gpu_addr, mapped_span.data(), mapped_span.size_bytes(), | 1024 | static u64 last_size = 0; |
| 1025 | VideoCommon::CacheType::NoTextureCache); | 1025 | bool has_run = false; |
| 1026 | if (last_size == image.unswizzled_size_bytes) { | ||
| 1027 | has_run = true; | ||
| 1028 | } | ||
| 1029 | last_size = image.unswizzled_size_bytes; | ||
| 1030 | |||
| 1031 | if (!has_run) { | ||
| 1032 | LOG_ERROR(Debug, "Called"); | ||
| 1033 | gpu_memory->ReadBlock(gpu_addr, mapped_span.data(), mapped_span.size_bytes(), | ||
| 1034 | VideoCommon::CacheType::NoTextureCache); | ||
| 1035 | } | ||
| 1026 | const auto uploads = FullUploadSwizzles(image.info); | 1036 | const auto uploads = FullUploadSwizzles(image.info); |
| 1027 | runtime.AccelerateImageUpload(image, staging, uploads); | 1037 | runtime.AccelerateImageUpload(image, staging, uploads); |
| 1028 | return; | 1038 | return; |
diff --git a/src/video_core/textures/decoders.cpp b/src/video_core/textures/decoders.cpp index 95bcdd37b..dde4b0904 100644 --- a/src/video_core/textures/decoders.cpp +++ b/src/video_core/textures/decoders.cpp | |||
| @@ -88,6 +88,7 @@ void SwizzleImpl(std::span<u8> output, std::span<const u8> input, u32 width, u32 | |||
| 88 | } | 88 | } |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | |||
| 91 | template <bool TO_LINEAR, u32 BYTES_PER_PIXEL> | 92 | template <bool TO_LINEAR, u32 BYTES_PER_PIXEL> |
| 92 | void SwizzleSubrectImpl(std::span<u8> output, std::span<const u8> input, u32 width, u32 height, | 93 | void SwizzleSubrectImpl(std::span<u8> output, std::span<const u8> input, u32 width, u32 height, |
| 93 | u32 depth, u32 origin_x, u32 origin_y, u32 extent_x, u32 num_lines, | 94 | u32 depth, u32 origin_x, u32 origin_y, u32 extent_x, u32 num_lines, |
| @@ -95,6 +96,14 @@ void SwizzleSubrectImpl(std::span<u8> output, std::span<const u8> input, u32 wid | |||
| 95 | // The origin of the transformation can be configured here, leave it as zero as the current API | 96 | // The origin of the transformation can be configured here, leave it as zero as the current API |
| 96 | // doesn't expose it. | 97 | // doesn't expose it. |
| 97 | static constexpr u32 origin_z = 0; | 98 | static constexpr u32 origin_z = 0; |
| 99 | static u32 last_width = 0; | ||
| 100 | static u32 last_height = 0; | ||
| 101 | if (last_width == width && last_height == height) { | ||
| 102 | return; | ||
| 103 | } | ||
| 104 | LOG_ERROR(Debug, "Called"); | ||
| 105 | last_width = width; | ||
| 106 | last_height = height; | ||
| 98 | 107 | ||
| 99 | // We can configure here a custom pitch | 108 | // We can configure here a custom pitch |
| 100 | // As it's not exposed 'width * BYTES_PER_PIXEL' will be the expected pitch. | 109 | // As it's not exposed 'width * BYTES_PER_PIXEL' will be the expected pitch. |