|
|
|
@ -656,19 +656,19 @@ private: |
|
|
|
if (params.target == SurfaceTarget::Texture3D) { |
|
|
|
return std::nullopt; |
|
|
|
} |
|
|
|
const auto test_modified = [](TSurface& surface) { return surface->IsModified(); }; |
|
|
|
TSurface new_surface = GetUncachedSurface(gpu_addr, params); |
|
|
|
std::size_t passed_tests = 0; |
|
|
|
bool modified = false; |
|
|
|
|
|
|
|
u32 num_resources = 0; |
|
|
|
for (auto& surface : overlaps) { |
|
|
|
const SurfaceParams& src_params = surface->GetSurfaceParams(); |
|
|
|
num_resources += src_params.depth * src_params.num_levels; |
|
|
|
} |
|
|
|
if (num_resources != params.depth * params.num_levels) { |
|
|
|
if (std::none_of(overlaps.begin(), overlaps.end(), test_modified)) { |
|
|
|
LoadSurface(new_surface); |
|
|
|
for (const auto& surface : overlaps) { |
|
|
|
Unregister(surface); |
|
|
|
} |
|
|
|
Register(new_surface); |
|
|
|
return {{new_surface, new_surface->GetMainView()}}; |
|
|
|
} |
|
|
|
|
|
|
|
std::size_t passed_tests = 0; |
|
|
|
for (auto& surface : overlaps) { |
|
|
|
const SurfaceParams& src_params = surface->GetSurfaceParams(); |
|
|
|
const auto mipmap_layer{new_surface->GetLayerMipmap(surface->GetGpuAddr())}; |
|
|
|
@ -681,11 +681,6 @@ private: |
|
|
|
} |
|
|
|
++passed_tests; |
|
|
|
|
|
|
|
if (!surface->IsModified()) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
modified = true; |
|
|
|
|
|
|
|
// Copy all mipmaps and layers |
|
|
|
const u32 block_width = params.GetDefaultBlockWidth(); |
|
|
|
const u32 block_height = params.GetDefaultBlockHeight(); |
|
|
|
@ -709,6 +704,7 @@ private: |
|
|
|
return std::nullopt; |
|
|
|
} |
|
|
|
|
|
|
|
const bool modified = std::any_of(overlaps.begin(), overlaps.end(), test_modified); |
|
|
|
for (const auto& surface : overlaps) { |
|
|
|
Unregister(surface); |
|
|
|
} |
|
|
|
|