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( | std::optional<std::pair<u32, u32>> SurfaceBaseImpl::GetLayerMipmap( | ||||||
|     const GPUVAddr candidate_gpu_addr) const { |     const GPUVAddr candidate_gpu_addr) const { | ||||||
|  |     if (gpu_addr == candidate_gpu_addr) { | ||||||
|  |         return {{0,0}}; | ||||||
|  |     } | ||||||
|     if (candidate_gpu_addr < gpu_addr) { |     if (candidate_gpu_addr < gpu_addr) { | ||||||
|         return {}; |         return {}; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -238,6 +238,26 @@ public: | |||||||
|         return GetView(ViewParams(overview_params.target, 0, num_layers, 0, params.num_levels)); |         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, |     std::optional<TView> EmplaceView(const SurfaceParams& view_params, const GPUVAddr view_addr, | ||||||
|                                      const std::size_t candidate_size) { |                                      const std::size_t candidate_size) { | ||||||
|         if (params.target == SurfaceTarget::Texture3D || |         if (params.target == SurfaceTarget::Texture3D || | ||||||
| @@ -252,10 +272,7 @@ public: | |||||||
|         const u32 layer{layer_mipmap->first}; |         const u32 layer{layer_mipmap->first}; | ||||||
|         const u32 mipmap{layer_mipmap->second}; |         const u32 mipmap{layer_mipmap->second}; | ||||||
|         if (GetMipmapSize(mipmap) != candidate_size) { |         if (GetMipmapSize(mipmap) != candidate_size) { | ||||||
|             // TODO: The view may cover many mimaps, this case can still go on. |             return EmplaceIrregularView(view_params, view_addr, candidate_size, mipmap, layer); | ||||||
|             // This edge-case can be safely be ignored since it will just result in worse |  | ||||||
|             // performance. |  | ||||||
|             return {}; |  | ||||||
|         } |         } | ||||||
|         return GetView(ViewParams(view_params.target, layer, 1, mipmap, 1)); |         return GetView(ViewParams(view_params.target, layer, 1, mipmap, 1)); | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user