mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	Merge pull request #1295 from bunnei/accurate-copies
gl_rasterizer_cache: Improve accuracy of caching and copies.
This commit is contained in:
		
						commit
						522a11a11f
					
				| @ -53,8 +53,6 @@ static VAddr TryGetCpuAddr(Tegra::GPUVAddr gpu_addr) { | |||||||
|     params.width = Common::AlignUp(config.tic.Width(), GetCompressionFactor(params.pixel_format)); |     params.width = Common::AlignUp(config.tic.Width(), GetCompressionFactor(params.pixel_format)); | ||||||
|     params.height = Common::AlignUp(config.tic.Height(), GetCompressionFactor(params.pixel_format)); |     params.height = Common::AlignUp(config.tic.Height(), GetCompressionFactor(params.pixel_format)); | ||||||
|     params.unaligned_height = config.tic.Height(); |     params.unaligned_height = config.tic.Height(); | ||||||
|     params.cache_width = Common::AlignUp(params.width, 8); |  | ||||||
|     params.cache_height = Common::AlignUp(params.height, 8); |  | ||||||
|     params.target = SurfaceTargetFromTextureType(config.tic.texture_type); |     params.target = SurfaceTargetFromTextureType(config.tic.texture_type); | ||||||
| 
 | 
 | ||||||
|     switch (params.target) { |     switch (params.target) { | ||||||
| @ -89,8 +87,6 @@ static VAddr TryGetCpuAddr(Tegra::GPUVAddr gpu_addr) { | |||||||
|     params.width = config.width; |     params.width = config.width; | ||||||
|     params.height = config.height; |     params.height = config.height; | ||||||
|     params.unaligned_height = config.height; |     params.unaligned_height = config.height; | ||||||
|     params.cache_width = Common::AlignUp(params.width, 8); |  | ||||||
|     params.cache_height = Common::AlignUp(params.height, 8); |  | ||||||
|     params.target = SurfaceTarget::Texture2D; |     params.target = SurfaceTarget::Texture2D; | ||||||
|     params.depth = 1; |     params.depth = 1; | ||||||
|     params.size_in_bytes = params.SizeInBytes(); |     params.size_in_bytes = params.SizeInBytes(); | ||||||
| @ -110,8 +106,6 @@ static VAddr TryGetCpuAddr(Tegra::GPUVAddr gpu_addr) { | |||||||
|     params.width = zeta_width; |     params.width = zeta_width; | ||||||
|     params.height = zeta_height; |     params.height = zeta_height; | ||||||
|     params.unaligned_height = zeta_height; |     params.unaligned_height = zeta_height; | ||||||
|     params.cache_width = Common::AlignUp(params.width, 8); |  | ||||||
|     params.cache_height = Common::AlignUp(params.height, 8); |  | ||||||
|     params.target = SurfaceTarget::Texture2D; |     params.target = SurfaceTarget::Texture2D; | ||||||
|     params.depth = 1; |     params.depth = 1; | ||||||
|     params.size_in_bytes = params.SizeInBytes(); |     params.size_in_bytes = params.SizeInBytes(); | ||||||
| @ -814,16 +808,20 @@ Surface RasterizerCacheOpenGL::RecreateSurface(const Surface& surface, | |||||||
|     // Get 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{GetUncachedSurface(new_params)}; |     Surface new_surface{GetUncachedSurface(new_params)}; | ||||||
| 
 | 
 | ||||||
|     // 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) { |         !Settings::values.use_accurate_framebuffers) { | ||||||
|  |         // If the format is the same, just do a framebuffer blit. This is significantly faster than
 | ||||||
|  |         // using PBOs. The is also likely less accurate, as textures will be converted rather than
 | ||||||
|  |         // reinterpreted.
 | ||||||
|  | 
 | ||||||
|         BlitTextures(surface->Texture().handle, params.GetRect(), new_surface->Texture().handle, |         BlitTextures(surface->Texture().handle, params.GetRect(), new_surface->Texture().handle, | ||||||
|                      params.GetRect(), params.type, read_framebuffer.handle, |                      params.GetRect(), params.type, read_framebuffer.handle, | ||||||
|                      draw_framebuffer.handle); |                      draw_framebuffer.handle); | ||||||
|         return new_surface; |     } else { | ||||||
|     } |         // When use_accurate_framebuffers setting is enabled, perform a more accurate surface copy,
 | ||||||
|  |         // where pixels are reinterpreted as a new format (without conversion). This code path uses
 | ||||||
|  |         // OpenGL PBOs and is quite slow.
 | ||||||
| 
 | 
 | ||||||
|     // When using accurate framebuffers, always copy old data to new surface, regardless of format
 |  | ||||||
|     if (Settings::values.use_accurate_framebuffers) { |  | ||||||
|         auto source_format = GetFormatTuple(params.pixel_format, params.component_type); |         auto source_format = GetFormatTuple(params.pixel_format, params.component_type); | ||||||
|         auto dest_format = GetFormatTuple(new_params.pixel_format, new_params.component_type); |         auto dest_format = GetFormatTuple(new_params.pixel_format, new_params.component_type); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -680,8 +680,8 @@ struct SurfaceParams { | |||||||
| 
 | 
 | ||||||
|     /// 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, width, height) == | ||||||
|                std::tie(other.pixel_format, other.type, other.cache_width, other.cache_height); |                std::tie(other.pixel_format, other.type, other.width, other.height); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     VAddr addr; |     VAddr addr; | ||||||
| @ -696,10 +696,6 @@ struct SurfaceParams { | |||||||
|     u32 unaligned_height; |     u32 unaligned_height; | ||||||
|     size_t size_in_bytes; |     size_t size_in_bytes; | ||||||
|     SurfaceTarget target; |     SurfaceTarget target; | ||||||
| 
 |  | ||||||
|     // Parameters used for caching only
 |  | ||||||
|     u32 cache_width; |  | ||||||
|     u32 cache_height; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| }; // namespace OpenGL
 | }; // namespace OpenGL
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei