texture_cache: Implement Irregular Views in surfaces
This commit is contained in:
		
							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));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user