texture_cache: Implement Irregular Views in surfaces
This commit is contained in:
		
				
					committed by
					
						 ReinUsesLisp
						ReinUsesLisp
					
				
			
			
				
	
			
			
			
						parent
						
							082740d34d
						
					
				
				
					commit
					fed773a86c
				
			| @@ -100,6 +100,9 @@ MatchStructureResult SurfaceBaseImpl::MatchesStructure(const SurfaceParams& rhs) | ||||
|  | ||||
| std::optional<std::pair<u32, u32>> SurfaceBaseImpl::GetLayerMipmap( | ||||
|     const GPUVAddr candidate_gpu_addr) const { | ||||
|     if (gpu_addr == candidate_gpu_addr) { | ||||
|         return {{0,0}}; | ||||
|     } | ||||
|     if (candidate_gpu_addr < gpu_addr) { | ||||
|         return {}; | ||||
|     } | ||||
|   | ||||
| @@ -238,6 +238,26 @@ public: | ||||
|         return GetView(ViewParams(overview_params.target, 0, num_layers, 0, params.num_levels)); | ||||
|     } | ||||
|  | ||||
|     std::optional<TView> EmplaceIrregularView(const SurfaceParams& view_params, | ||||
|                                               const GPUVAddr view_addr, | ||||
|                                               const std::size_t candidate_size, const u32 mipmap, | ||||
|                                               const u32 layer) { | ||||
|         const auto layer_mipmap{GetLayerMipmap(view_addr + candidate_size)}; | ||||
|         if (!layer_mipmap) { | ||||
|             return {}; | ||||
|         } | ||||
|         const u32 end_layer{layer_mipmap->first}; | ||||
|         const u32 end_mipmap{layer_mipmap->second}; | ||||
|         if (layer != end_layer) { | ||||
|             if (mipmap == 0 && end_mipmap == 0) { | ||||
|                 return GetView(ViewParams(view_params.target, layer, end_layer - layer + 1, 0, 1)); | ||||
|             } | ||||
|             return {}; | ||||
|         } else { | ||||
|             return GetView(ViewParams(view_params.target, layer, 1, mipmap, end_mipmap - mipmap + 1)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     std::optional<TView> EmplaceView(const SurfaceParams& view_params, const GPUVAddr view_addr, | ||||
|                                      const std::size_t candidate_size) { | ||||
|         if (params.target == SurfaceTarget::Texture3D || | ||||
| @@ -252,10 +272,7 @@ public: | ||||
|         const u32 layer{layer_mipmap->first}; | ||||
|         const u32 mipmap{layer_mipmap->second}; | ||||
|         if (GetMipmapSize(mipmap) != candidate_size) { | ||||
|             // TODO: The view may cover many mimaps, this case can still go on. | ||||
|             // This edge-case can be safely be ignored since it will just result in worse | ||||
|             // performance. | ||||
|             return {}; | ||||
|             return EmplaceIrregularView(view_params, view_addr, candidate_size, mipmap, layer); | ||||
|         } | ||||
|         return GetView(ViewParams(view_params.target, layer, 1, mipmap, 1)); | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user