From 3494fce86467878cd62a2faf54da2958b7495a17 Mon Sep 17 00:00:00 2001 From: Ameer J <52414509+ameerj@users.noreply.github.com> Date: Tue, 1 Aug 2023 19:43:22 -0400 Subject: gl --- src/video_core/renderer_opengl/util_shaders.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/video_core/renderer_opengl') diff --git a/src/video_core/renderer_opengl/util_shaders.cpp b/src/video_core/renderer_opengl/util_shaders.cpp index 544982d18..c437013e6 100644 --- a/src/video_core/renderer_opengl/util_shaders.cpp +++ b/src/video_core/renderer_opengl/util_shaders.cpp @@ -68,6 +68,7 @@ void UtilShaders::ASTCDecode(Image& image, const StagingBufferMap& map, std::span swizzles) { static constexpr GLuint BINDING_INPUT_BUFFER = 0; static constexpr GLuint BINDING_OUTPUT_IMAGE = 0; + program_manager.LocalMemoryWarmup(); const Extent2D tile_size{ .width = VideoCore::Surface::DefaultBlockWidth(image.info.format), -- cgit v1.2.3 From b18c1fb1bbbcc235e9a1cbbb2704fed2e5895e61 Mon Sep 17 00:00:00 2001 From: Ameer J <52414509+ameerj@users.noreply.github.com> Date: Sun, 6 Aug 2023 14:49:34 -0400 Subject: HACK: Avoid swizzling and reuploading ASTC image every frame --- src/video_core/renderer_opengl/gl_texture_cache.cpp | 9 ++++++++- src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp | 1 + src/video_core/renderer_vulkan/vk_texture_cache.cpp | 10 +++++++++- src/video_core/texture_cache/texture_cache.h | 14 ++++++++++++-- src/video_core/textures/decoders.cpp | 9 +++++++++ 5 files changed, 39 insertions(+), 4 deletions(-) (limited to 'src/video_core/renderer_opengl') 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

::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 output, std::span input, u32 width, u32 } } + template void SwizzleSubrectImpl(std::span output, std::span 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 output, std::span 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. -- cgit v1.2.3 From 9058486b9b9833d0554d3e3f11a582859657b21f Mon Sep 17 00:00:00 2001 From: Ameer J <52414509+ameerj@users.noreply.github.com> Date: Sun, 6 Aug 2023 14:55:05 -0400 Subject: Revert "HACK: Avoid swizzling and reuploading ASTC image every frame" This reverts commit b18c1fb1bbbcc235e9a1cbbb2704fed2e5895e61. --- src/video_core/renderer_opengl/gl_texture_cache.cpp | 9 +-------- src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp | 1 - src/video_core/renderer_vulkan/vk_texture_cache.cpp | 10 +--------- src/video_core/texture_cache/texture_cache.h | 14 ++------------ src/video_core/textures/decoders.cpp | 9 --------- 5 files changed, 4 insertions(+), 39 deletions(-) (limited to 'src/video_core/renderer_opengl') diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index 9ca544ec9..9cafd2983 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp @@ -554,14 +554,7 @@ void TextureCacheRuntime::Finish() { } StagingBufferMap TextureCacheRuntime::UploadStagingBuffer(size_t 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; + return staging_buffer_pool.RequestUploadBuffer(size); } 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 27328dab2..ce92f66ab 100644 --- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp @@ -214,7 +214,6 @@ 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 51be57b19..b3e17c332 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -846,15 +846,7 @@ void TextureCacheRuntime::Finish() { } StagingBufferRef TextureCacheRuntime::UploadStagingBuffer(size_t size) { - 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; + return staging_buffer_pool.Request(size, MemoryUsage::Upload); } 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 6b87987de..4457b366f 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -1021,18 +1021,8 @@ void TextureCache

::UploadImageContents(Image& image, StagingBuffer& staging) const GPUVAddr gpu_addr = image.gpu_addr; if (True(image.flags & ImageFlagBits::AcceleratedUpload)) { - 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); - } + 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 dde4b0904..95bcdd37b 100644 --- a/src/video_core/textures/decoders.cpp +++ b/src/video_core/textures/decoders.cpp @@ -88,7 +88,6 @@ void SwizzleImpl(std::span output, std::span input, u32 width, u32 } } - template void SwizzleSubrectImpl(std::span output, std::span input, u32 width, u32 height, u32 depth, u32 origin_x, u32 origin_y, u32 extent_x, u32 num_lines, @@ -96,14 +95,6 @@ void SwizzleSubrectImpl(std::span output, std::span 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. -- cgit v1.2.3