From 8dbf3d240bda181e9db67031784911592ff762ec Mon Sep 17 00:00:00 2001 From: gibbed Date: Sun, 12 Mar 2017 01:15:43 -0600 Subject: [PATCH] Make the previous commit slightly more performant. --- src/xenia/gpu/gl4/texture_cache.cc | 7 +++---- src/xenia/gpu/texture_info.cc | 5 +++-- src/xenia/gpu/texture_info.h | 2 +- src/xenia/gpu/vulkan/texture_cache.cc | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/xenia/gpu/gl4/texture_cache.cc b/src/xenia/gpu/gl4/texture_cache.cc index af4c292af..c43c43a1d 100644 --- a/src/xenia/gpu/gl4/texture_cache.cc +++ b/src/xenia/gpu/gl4/texture_cache.cc @@ -785,13 +785,12 @@ bool TextureCache::UploadTexture2D(GLuint texture, auto allocation = scratch_buffer_->Acquire(unpack_length); if (!texture_info.is_tiled) { - if (texture_info.has_packed_mips) { + uint32_t offset_x, offset_y; + if (texture_info.has_packed_mips && + TextureInfo::GetPackedTileOffset(texture_info, &offset_x, &offset_y)) { uint32_t bytes_per_block = texture_info.format_info->block_width * texture_info.format_info->block_height * texture_info.format_info->bits_per_pixel / 8; - uint32_t offset_x; - uint32_t offset_y; - TextureInfo::GetPackedTileOffset(texture_info, &offset_x, &offset_y); const uint8_t* src = host_address; // TODO(gibbed): this needs checking src += offset_y * texture_info.size_2d.input_pitch; diff --git a/src/xenia/gpu/texture_info.cc b/src/xenia/gpu/texture_info.cc index 1f8bcab70..0d80db139 100644 --- a/src/xenia/gpu/texture_info.cc +++ b/src/xenia/gpu/texture_info.cc @@ -289,7 +289,7 @@ void TextureInfo::CalculateTextureSizesCube( output_length = size_cube.output_face_length * 6; } -void TextureInfo::GetPackedTileOffset(const TextureInfo& texture_info, +bool TextureInfo::GetPackedTileOffset(const TextureInfo& texture_info, uint32_t* out_offset_x, uint32_t* out_offset_y) { // Tile size is 32x32, and once textures go <=16 they are packed into a @@ -328,7 +328,7 @@ void TextureInfo::GetPackedTileOffset(const TextureInfo& texture_info, // Too big, not packed. *out_offset_x = 0; *out_offset_y = 0; - return; + return false; } if (xe::log2_ceil(texture_info.size_2d.logical_width) > @@ -343,6 +343,7 @@ void TextureInfo::GetPackedTileOffset(const TextureInfo& texture_info, } *out_offset_x /= texture_info.format_info->block_width; *out_offset_y /= texture_info.format_info->block_height; + return true; } // https://code.google.com/p/crunch/source/browse/trunk/inc/crn_decomp.h#4104 diff --git a/src/xenia/gpu/texture_info.h b/src/xenia/gpu/texture_info.h index d2cf11235..52b86ce18 100644 --- a/src/xenia/gpu/texture_info.h +++ b/src/xenia/gpu/texture_info.h @@ -272,7 +272,7 @@ struct TextureInfo { static bool Prepare(const xenos::xe_gpu_texture_fetch_t& fetch, TextureInfo* out_info); - static void GetPackedTileOffset(const TextureInfo& texture_info, + static bool GetPackedTileOffset(const TextureInfo& texture_info, uint32_t* out_offset_x, uint32_t* out_offset_y); static uint32_t TiledOffset2DOuter(uint32_t y, uint32_t width, diff --git a/src/xenia/gpu/vulkan/texture_cache.cc b/src/xenia/gpu/vulkan/texture_cache.cc index 48487c2e6..5fba11ead 100644 --- a/src/xenia/gpu/vulkan/texture_cache.cc +++ b/src/xenia/gpu/vulkan/texture_cache.cc @@ -986,13 +986,13 @@ void TextureCache::ConvertTexture1D(uint8_t* dest, const TextureInfo& src) { void TextureCache::ConvertTexture2D(uint8_t* dest, const TextureInfo& src) { void* host_address = memory_->TranslatePhysical(src.guest_address); if (!src.is_tiled) { - if (src.has_packed_mips) { + uint32_t offset_x, offset_y; + if (src.has_packed_mips && + TextureInfo::GetPackedTileOffset(src, &offset_x, &offset_y)) { uint32_t bytes_per_block = src.format_info->block_width * src.format_info->block_height * src.format_info->bits_per_pixel / 8; - uint32_t offset_x; - uint32_t offset_y; - TextureInfo::GetPackedTileOffset(src, &offset_x, &offset_y); + const uint8_t* src_mem = reinterpret_cast(host_address); src_mem += offset_y * src.size_2d.input_pitch; src_mem += offset_x * bytes_per_block;