diff --git a/src/video_core/rasterizer_cache/custom_tex_manager.cpp b/src/video_core/rasterizer_cache/custom_tex_manager.cpp index a3ef82cd5..45816fd6f 100644 --- a/src/video_core/rasterizer_cache/custom_tex_manager.cpp +++ b/src/video_core/rasterizer_cache/custom_tex_manager.cpp @@ -42,7 +42,11 @@ CustomPixelFormat ToCustomPixelFormat(ddsktx_format format) { case DDSKTX_FORMAT_BC7: return CustomPixelFormat::BC7; case DDSKTX_FORMAT_ASTC4x4: - return CustomPixelFormat::ASTC; + return CustomPixelFormat::ASTC4; + case DDSKTX_FORMAT_ASTC6x6: + return CustomPixelFormat::ASTC6; + case DDSKTX_FORMAT_ASTC8x6: + return CustomPixelFormat::ASTC8; default: LOG_ERROR(Common, "Unknown dds/ktx pixel format {}", format); return CustomPixelFormat::RGBA8; @@ -83,8 +87,8 @@ void CustomTexManager::FindCustomTextures() { u32 width{}; u32 height{}; - u64 hash{}; u32 format{}; + unsigned long long hash{}; std::string ext(3, ' '); for (const FSTEntry& file : textures) { diff --git a/src/video_core/rasterizer_cache/pixel_format.cpp b/src/video_core/rasterizer_cache/pixel_format.cpp index dd9d7180c..1d1bde449 100644 --- a/src/video_core/rasterizer_cache/pixel_format.cpp +++ b/src/video_core/rasterizer_cache/pixel_format.cpp @@ -59,8 +59,12 @@ std::string_view CustomPixelFormatAsString(CustomPixelFormat format) { return "BC5"; case CustomPixelFormat::BC7: return "BC7"; - case CustomPixelFormat::ASTC: - return "ASTC"; + case CustomPixelFormat::ASTC4: + return "ASTC4"; + case CustomPixelFormat::ASTC6: + return "ASTC6"; + case CustomPixelFormat::ASTC8: + return "ASTC8"; } } diff --git a/src/video_core/rasterizer_cache/pixel_format.h b/src/video_core/rasterizer_cache/pixel_format.h index 6c19e7358..a75904752 100644 --- a/src/video_core/rasterizer_cache/pixel_format.h +++ b/src/video_core/rasterizer_cache/pixel_format.h @@ -41,7 +41,9 @@ enum class CustomPixelFormat : u32 { BC3 = 2, BC5 = 3, BC7 = 4, - ASTC = 5, + ASTC4 = 5, + ASTC6 = 6, + ASTC8 = 7, }; enum class SurfaceType : u32 { diff --git a/src/video_core/renderer_opengl/gl_driver.cpp b/src/video_core/renderer_opengl/gl_driver.cpp index f263fcf3e..5b6982de6 100644 --- a/src/video_core/renderer_opengl/gl_driver.cpp +++ b/src/video_core/renderer_opengl/gl_driver.cpp @@ -107,7 +107,9 @@ bool Driver::IsCustomFormatSupported(VideoCore::CustomPixelFormat format) const return ext_texture_compression_s3tc; case VideoCore::CustomPixelFormat::BC7: return arb_texture_compression_bptc; - case VideoCore::CustomPixelFormat::ASTC: + case VideoCore::CustomPixelFormat::ASTC4: + case VideoCore::CustomPixelFormat::ASTC6: + case VideoCore::CustomPixelFormat::ASTC8: return is_gles; } } diff --git a/src/video_core/renderer_opengl/gl_texture_runtime.cpp b/src/video_core/renderer_opengl/gl_texture_runtime.cpp index 0b93ee750..e6ba83648 100644 --- a/src/video_core/renderer_opengl/gl_texture_runtime.cpp +++ b/src/video_core/renderer_opengl/gl_texture_runtime.cpp @@ -2,7 +2,6 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#include "common/microprofile.h" #include "common/scope_exit.h" #include "common/settings.h" #include "video_core/rasterizer_cache/utils.h" @@ -53,6 +52,8 @@ static constexpr std::array CUSTOM_TUPLES = { FormatTuple{GL_COMPRESSED_RGBA_BPTC_UNORM_ARB, GL_COMPRESSED_RGBA_BPTC_UNORM_ARB, GL_UNSIGNED_BYTE}, FormatTuple{GL_COMPRESSED_RGBA_ASTC_4x4, GL_COMPRESSED_RGBA_ASTC_4x4, GL_UNSIGNED_BYTE}, + FormatTuple{GL_COMPRESSED_RGBA_ASTC_6x6, GL_COMPRESSED_RGBA_ASTC_6x6, GL_UNSIGNED_BYTE}, + FormatTuple{GL_COMPRESSED_RGBA_ASTC_8x6, GL_COMPRESSED_RGBA_ASTC_8x6, GL_UNSIGNED_BYTE}, }; [[nodiscard]] GLbitfield MakeBufferMask(VideoCore::SurfaceType type) { @@ -72,15 +73,10 @@ static constexpr std::array CUSTOM_TUPLES = { return GL_COLOR_BUFFER_BIT; } -constexpr std::size_t UPLOAD_BUFFER_SIZE = 32 * 1024 * 1024; -constexpr std::size_t DOWNLOAD_BUFFER_SIZE = 4 * 1024 * 1024; - TextureRuntime::TextureRuntime(Driver& driver) : driver{driver}, filterer{Settings::values.texture_filter_name.GetValue(), - VideoCore::GetResolutionScaleFactor()}, - upload_buffer{GL_PIXEL_UNPACK_BUFFER, UPLOAD_BUFFER_SIZE} { + VideoCore::GetResolutionScaleFactor()} { - download_buffer.resize(DOWNLOAD_BUFFER_SIZE); read_fbo.Create(); draw_fbo.Create(); @@ -102,22 +98,13 @@ void TextureRuntime::Clear() { } StagingData TextureRuntime::FindStaging(u32 size, bool upload) { - if (!upload) { - if (size > download_buffer.size()) { - download_buffer.resize(size); - } - return StagingData{ - .size = size, - .mapped = std::span{download_buffer.data(), size}, - .buffer_offset = 0, - }; + if (size > staging_buffer.size()) { + staging_buffer.resize(size); } - - auto [data, offset, invalidate] = upload_buffer.Map(size, 4); return StagingData{ .size = size, - .mapped = std::span{data, size}, - .buffer_offset = offset, + .mapped = std::span{staging_buffer.data(), size}, + .buffer_offset = 0, }; } @@ -378,10 +365,6 @@ void Surface::Upload(const VideoCore::BufferTextureCopy& upload, const StagingDa } else { const VideoCore::Rect2D rect = upload.texture_rect; glPixelStorei(GL_UNPACK_ROW_LENGTH, static_cast(rect.GetWidth())); - glBindBuffer(GL_PIXEL_UNPACK_BUFFER, runtime.upload_buffer.Handle()); - - // Unmap the buffer FindStaging mapped beforehand - runtime.upload_buffer.Unmap(staging.size); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Handle()); @@ -390,11 +373,11 @@ void Surface::Upload(const VideoCore::BufferTextureCopy& upload, const StagingDa if (is_custom && custom_format != VideoCore::CustomPixelFormat::RGBA8) { glCompressedTexSubImage2D(GL_TEXTURE_2D, upload.texture_level, rect.left, rect.bottom, rect.GetWidth(), rect.GetHeight(), tuple.format, staging.size, - reinterpret_cast(staging.buffer_offset)); + staging.mapped.data()); } else { glTexSubImage2D(GL_TEXTURE_2D, upload.texture_level, rect.left, rect.bottom, rect.GetWidth(), rect.GetHeight(), tuple.format, tuple.type, - reinterpret_cast(staging.buffer_offset)); + staging.mapped.data()); } glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); diff --git a/src/video_core/renderer_opengl/gl_texture_runtime.h b/src/video_core/renderer_opengl/gl_texture_runtime.h index 5ea726f9c..3083eeba2 100644 --- a/src/video_core/renderer_opengl/gl_texture_runtime.h +++ b/src/video_core/renderer_opengl/gl_texture_runtime.h @@ -147,8 +147,7 @@ private: std::array reinterpreters; std::unordered_multimap texture_recycler; std::unordered_map> framebuffer_cache; - StreamBuffer upload_buffer; - std::vector download_buffer; + std::vector staging_buffer; OGLFramebuffer read_fbo, draw_fbo; }; diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index f28960b00..fdfe47176 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -121,8 +121,12 @@ vk::Format MakeCustomFormat(VideoCore::CustomPixelFormat format) { return vk::Format::eBc5UnormBlock; case VideoCore::CustomPixelFormat::BC7: return vk::Format::eBc7UnormBlock; - case VideoCore::CustomPixelFormat::ASTC: + case VideoCore::CustomPixelFormat::ASTC4: return vk::Format::eAstc4x4UnormBlock; + case VideoCore::CustomPixelFormat::ASTC6: + return vk::Format::eAstc6x6UnormBlock; + case VideoCore::CustomPixelFormat::ASTC8: + return vk::Format::eAstc8x6UnormBlock; } LOG_ERROR(Render_Vulkan, "Unknown custom format {}", format); return vk::Format::eR8G8B8A8Unorm; @@ -518,9 +522,10 @@ void Instance::CreateCustomFormatTable() { custom_format_table[0] = format_table[static_cast(VideoCore::PixelFormat::RGBA8)]; constexpr std::array custom_formats = { - VideoCore::CustomPixelFormat::BC1, VideoCore::CustomPixelFormat::BC3, - VideoCore::CustomPixelFormat::BC5, VideoCore::CustomPixelFormat::BC7, - VideoCore::CustomPixelFormat::ASTC, + VideoCore::CustomPixelFormat::BC1, VideoCore::CustomPixelFormat::BC3, + VideoCore::CustomPixelFormat::BC5, VideoCore::CustomPixelFormat::BC7, + VideoCore::CustomPixelFormat::ASTC4, VideoCore::CustomPixelFormat::ASTC6, + VideoCore::CustomPixelFormat::ASTC8, }; for (const auto& custom_format : custom_formats) {