summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.cpp9
-rw-r--r--src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp1
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp10
-rw-r--r--src/video_core/texture_cache/texture_cache.h14
-rw-r--r--src/video_core/textures/decoders.cpp9
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() {
}
StagingBufferMap TextureCacheRuntime::UploadStagingBuffer(size_t size) {
- return staging_buffer_pool.RequestUploadBuffer(size);
+ static StagingBufferMap result;
+ static size_t last_size = 0;
+ if (size == last_size) {
+ return result;
+ }
+ last_size = size;
+ result = staging_buffer_pool.RequestUploadBuffer(size);
+ return result;
}
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
}
void StagingBufferPool::ReleaseCache(MemoryUsage usage) {
+ return;
ReleaseLevel(GetCache(usage), current_delete_level);
}
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() {
}
StagingBufferRef TextureCacheRuntime::UploadStagingBuffer(size_t size) {
- return staging_buffer_pool.Request(size, MemoryUsage::Upload);
+ static StagingBufferRef result;
+ static size_t last_size = 0;
+ if (size == last_size) {
+ return result;
+ }
+ LOG_ERROR(Debug, "Called");
+ last_size = size;
+ result = staging_buffer_pool.Request(size, MemoryUsage::Upload);
+ return result;
}
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)
const GPUVAddr gpu_addr = image.gpu_addr;
if (True(image.flags & ImageFlagBits::AcceleratedUpload)) {
- gpu_memory->ReadBlock(gpu_addr, mapped_span.data(), mapped_span.size_bytes(),
- VideoCommon::CacheType::NoTextureCache);
+ static u64 last_size = 0;
+ bool has_run = false;
+ if (last_size == image.unswizzled_size_bytes) {
+ has_run = true;
+ }
+ last_size = image.unswizzled_size_bytes;
+
+ if (!has_run) {
+ LOG_ERROR(Debug, "Called");
+ gpu_memory->ReadBlock(gpu_addr, mapped_span.data(), mapped_span.size_bytes(),
+ VideoCommon::CacheType::NoTextureCache);
+ }
const auto uploads = FullUploadSwizzles(image.info);
runtime.AccelerateImageUpload(image, staging, uploads);
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
}
}
+
template <bool TO_LINEAR, u32 BYTES_PER_PIXEL>
void SwizzleSubrectImpl(std::span<u8> output, std::span<const u8> input, u32 width, u32 height,
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
// The origin of the transformation can be configured here, leave it as zero as the current API
// doesn't expose it.
static constexpr u32 origin_z = 0;
+ static u32 last_width = 0;
+ static u32 last_height = 0;
+ if (last_width == width && last_height == height) {
+ return;
+ }
+ LOG_ERROR(Debug, "Called");
+ last_width = width;
+ last_height = height;
// We can configure here a custom pitch
// As it's not exposed 'width * BYTES_PER_PIXEL' will be the expected pitch.