rsx: Modify find_cached_texture to respect gcm_format. Can pass 0 for "dont care"

This commit is contained in:
kd-11 2019-09-09 19:14:57 +03:00 committed by kd-11
parent cb66d05693
commit 75fcfac00e
4 changed files with 14 additions and 15 deletions

View File

@ -10,6 +10,8 @@
extern u64 get_system_time();
#define RSX_GCM_FORMAT_IGNORED 0
namespace rsx
{
template <typename derived_type, typename _traits>
@ -1092,7 +1094,7 @@ namespace rsx
return nullptr;
}
section_storage_type* find_cached_texture(const address_range &range, bool create_if_not_found, bool confirm_dimensions, u16 width = 0, u16 height = 0, u16 depth = 0, u16 mipmaps = 0)
section_storage_type* find_cached_texture(const address_range &range, u32 gcm_format, bool create_if_not_found, bool confirm_dimensions, u16 width = 0, u16 height = 0, u16 depth = 0, u16 mipmaps = 0)
{
auto &block = m_storage.block_for(range);
@ -1110,7 +1112,7 @@ namespace rsx
{
if (!tex.is_dirty())
{
if (!confirm_dimensions || tex.matches_dimensions(width, height, depth, mipmaps))
if (!confirm_dimensions || tex.matches(gcm_format, width, height, depth, mipmaps))
{
#ifndef TEXTURE_CACHE_DEBUG
return &tex;
@ -1202,7 +1204,7 @@ namespace rsx
std::lock_guard lock(m_cache_mutex);
// Find a cached section to use
section_storage_type& region = *find_cached_texture(rsx_range, true, true, width, height);
section_storage_type& region = *find_cached_texture(rsx_range, RSX_GCM_FORMAT_IGNORED, true, true, width, height);
// Prepare and initialize fbo region
if (region.exists() && region.get_context() != texture_upload_context::framebuffer_storage)
@ -1278,7 +1280,7 @@ namespace rsx
{
std::lock_guard lock(m_cache_mutex);
auto* region_ptr = find_cached_texture(memory_range, false, false);
auto* region_ptr = find_cached_texture(memory_range, RSX_GCM_FORMAT_IGNORED, false, false);
if (region_ptr == nullptr)
{
AUDIT(m_flush_always_cache.find(memory_range) == m_flush_always_cache.end());

View File

@ -1646,11 +1646,14 @@ namespace rsx
return valid_range() && rsx::buffered_section::matches(memory_range);
}
bool matches_dimensions(u32 width, u32 height, u32 depth, u32 mipmaps)
bool matches(u32 format, u32 width, u32 height, u32 depth, u32 mipmaps)
{
if (!valid_range())
return false;
if ((gcm_format & format) != format)
return false;
if (!width && !height && !depth && !mipmaps)
return true;
@ -1677,10 +1680,7 @@ namespace rsx
if (rsx_address != get_section_base())
return false;
if ((gcm_format & format) != format)
return false;
return matches_dimensions(width, height, depth, mipmaps);
return matches(format, width, height, depth, mipmaps);
}
bool matches(const address_range& memory_range, u32 format, u32 width, u32 height, u32 depth, u32 mipmaps)
@ -1691,10 +1691,7 @@ namespace rsx
if (!rsx::buffered_section::matches(memory_range))
return false;
if ((gcm_format & format) != format)
return false;
return matches_dimensions(width, height, depth, mipmaps);
return matches(format, width, height, depth, mipmaps);
}

View File

@ -831,7 +831,7 @@ namespace gl
const auto swizzle = get_component_mapping(gcm_format, flags);
image->set_native_component_layout(swizzle);
auto& cached = *find_cached_texture(rsx_range, true, true, width, height, depth, mipmaps);
auto& cached = *find_cached_texture(rsx_range, gcm_format, true, true, width, height, depth, mipmaps);
ASSERT(!cached.is_locked());
// Prepare section

View File

@ -1020,7 +1020,7 @@ namespace vk
change_image_layout(cmd, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, { aspect_flags, 0, mipmaps, 0, layer });
cached_texture_section& region = *find_cached_texture(rsx_range, true, true, width, height, section_depth);
cached_texture_section& region = *find_cached_texture(rsx_range, gcm_format, true, true, width, height, section_depth);
ASSERT(!region.is_locked());
// New section, we must prepare it