mirror of
https://gitlab.com/suyu-emu/suyu.git
synced 2024-03-15 23:15:44 +00:00
gl_rasterizer_cache: Also use reserve cache for RecreateSurface.
This commit is contained in:
parent
9bc71fcc5f
commit
123c065086
|
@ -780,15 +780,9 @@ Surface RasterizerCacheOpenGL::GetSurface(const SurfaceParams& params, bool pres
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to get a previously reserved surface
|
// No cached surface found - get a new one
|
||||||
surface = TryGetReservedSurface(params);
|
surface = GetUncachedSurface(params);
|
||||||
|
|
||||||
// No surface found - create a new one
|
|
||||||
if (!surface) {
|
|
||||||
surface = std::make_shared<CachedSurface>(params);
|
|
||||||
ReserveSurface(surface);
|
|
||||||
Register(surface);
|
Register(surface);
|
||||||
}
|
|
||||||
|
|
||||||
// Only load surface from memory if we care about the contents
|
// Only load surface from memory if we care about the contents
|
||||||
if (preserve_contents) {
|
if (preserve_contents) {
|
||||||
|
@ -798,13 +792,23 @@ Surface RasterizerCacheOpenGL::GetSurface(const SurfaceParams& params, bool pres
|
||||||
return surface;
|
return surface;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Surface RasterizerCacheOpenGL::GetUncachedSurface(const SurfaceParams& params) {
|
||||||
|
Surface surface{TryGetReservedSurface(params)};
|
||||||
|
if (!surface) {
|
||||||
|
// No reserved surface available, create a new one and reserve it
|
||||||
|
surface = std::make_shared<CachedSurface>(params);
|
||||||
|
ReserveSurface(surface);
|
||||||
|
}
|
||||||
|
return surface;
|
||||||
|
}
|
||||||
|
|
||||||
Surface RasterizerCacheOpenGL::RecreateSurface(const Surface& surface,
|
Surface RasterizerCacheOpenGL::RecreateSurface(const Surface& surface,
|
||||||
const SurfaceParams& new_params) {
|
const SurfaceParams& new_params) {
|
||||||
// Verify surface is compatible for blitting
|
// Verify surface is compatible for blitting
|
||||||
const auto& params{surface->GetSurfaceParams()};
|
const auto& params{surface->GetSurfaceParams()};
|
||||||
|
|
||||||
// Create a new surface with the new parameters, and blit the previous surface to it
|
// Get a new surface with the new parameters, and blit the previous surface to it
|
||||||
Surface new_surface{std::make_shared<CachedSurface>(new_params)};
|
Surface new_surface{GetUncachedSurface(new_params)};
|
||||||
|
|
||||||
// If format is unchanged, we can do a faster blit without reinterpreting pixel data
|
// If format is unchanged, we can do a faster blit without reinterpreting pixel data
|
||||||
if (params.pixel_format == new_params.pixel_format) {
|
if (params.pixel_format == new_params.pixel_format) {
|
||||||
|
@ -887,7 +891,6 @@ Surface RasterizerCacheOpenGL::TryGetReservedSurface(const SurfaceParams& params
|
||||||
const auto& surface_reserve_key{SurfaceReserveKey::Create(params)};
|
const auto& surface_reserve_key{SurfaceReserveKey::Create(params)};
|
||||||
auto search{surface_reserve.find(surface_reserve_key)};
|
auto search{surface_reserve.find(surface_reserve_key)};
|
||||||
if (search != surface_reserve.end()) {
|
if (search != surface_reserve.end()) {
|
||||||
Register(search->second);
|
|
||||||
return search->second;
|
return search->second;
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
|
|
|
@ -650,18 +650,6 @@ struct SurfaceParams {
|
||||||
Tegra::GPUVAddr zeta_address,
|
Tegra::GPUVAddr zeta_address,
|
||||||
Tegra::DepthFormat format);
|
Tegra::DepthFormat format);
|
||||||
|
|
||||||
bool operator==(const SurfaceParams& other) const {
|
|
||||||
return std::tie(addr, is_tiled, block_height, pixel_format, component_type, type, width,
|
|
||||||
height, unaligned_height, size_in_bytes) ==
|
|
||||||
std::tie(other.addr, other.is_tiled, other.block_height, other.pixel_format,
|
|
||||||
other.component_type, other.type, other.width, other.height,
|
|
||||||
other.unaligned_height, other.size_in_bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const SurfaceParams& other) const {
|
|
||||||
return !operator==(other);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Checks if surfaces are compatible for caching
|
/// Checks if surfaces are compatible for caching
|
||||||
bool IsCompatibleSurface(const SurfaceParams& other) const {
|
bool IsCompatibleSurface(const SurfaceParams& other) const {
|
||||||
return std::tie(pixel_format, type, cache_width, cache_height) ==
|
return std::tie(pixel_format, type, cache_width, cache_height) ==
|
||||||
|
@ -767,6 +755,9 @@ private:
|
||||||
void LoadSurface(const Surface& surface);
|
void LoadSurface(const Surface& surface);
|
||||||
Surface GetSurface(const SurfaceParams& params, bool preserve_contents = true);
|
Surface GetSurface(const SurfaceParams& params, bool preserve_contents = true);
|
||||||
|
|
||||||
|
/// Gets an uncached surface, creating it if need be
|
||||||
|
Surface GetUncachedSurface(const SurfaceParams& params);
|
||||||
|
|
||||||
/// Recreates a surface with new parameters
|
/// Recreates a surface with new parameters
|
||||||
Surface RecreateSurface(const Surface& surface, const SurfaceParams& new_params);
|
Surface RecreateSurface(const Surface& surface, const SurfaceParams& new_params);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue