mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	texture_cache: Handle 3D texture blits with one layer
This commit is contained in:
		@@ -557,8 +557,8 @@ void TextureCacheOpenGL::ImageBlit(View& src_view, View& dst_view,
 | 
			
		||||
                                   const Tegra::Engines::Fermi2D::Config& copy_config) {
 | 
			
		||||
    const auto& src_params{src_view->GetSurfaceParams()};
 | 
			
		||||
    const auto& dst_params{dst_view->GetSurfaceParams()};
 | 
			
		||||
    UNIMPLEMENTED_IF(src_params.target == SurfaceTarget::Texture3D);
 | 
			
		||||
    UNIMPLEMENTED_IF(dst_params.target == SurfaceTarget::Texture3D);
 | 
			
		||||
    UNIMPLEMENTED_IF(src_params.depth != 1);
 | 
			
		||||
    UNIMPLEMENTED_IF(dst_params.depth != 1);
 | 
			
		||||
 | 
			
		||||
    state_tracker.NotifyScissor0();
 | 
			
		||||
    state_tracker.NotifyFramebuffer();
 | 
			
		||||
 
 | 
			
		||||
@@ -246,8 +246,8 @@ SurfaceParams SurfaceParams::CreateForFermiCopySurface(
 | 
			
		||||
    params.width = config.width;
 | 
			
		||||
    params.height = config.height;
 | 
			
		||||
    params.pitch = config.pitch;
 | 
			
		||||
    // TODO(Rodrigo): Try to guess the surface target from depth and layer parameters
 | 
			
		||||
    params.target = SurfaceTarget::Texture2D;
 | 
			
		||||
    // TODO(Rodrigo): Try to guess texture arrays from parameters
 | 
			
		||||
    params.target = params.block_depth > 0 ? SurfaceTarget::Texture3D : SurfaceTarget::Texture2D;
 | 
			
		||||
    params.depth = 1;
 | 
			
		||||
    params.num_levels = 1;
 | 
			
		||||
    params.emulated_levels = 1;
 | 
			
		||||
 
 | 
			
		||||
@@ -755,6 +755,8 @@ private:
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TSurface new_surface = GetUncachedSurface(gpu_addr, params);
 | 
			
		||||
        LoadSurface(new_surface);
 | 
			
		||||
 | 
			
		||||
        bool modified = false;
 | 
			
		||||
        for (auto& surface : overlaps) {
 | 
			
		||||
            const SurfaceParams& src_params = surface->GetSurfaceParams();
 | 
			
		||||
@@ -763,7 +765,10 @@ private:
 | 
			
		||||
                src_params.block_height != params.block_height) {
 | 
			
		||||
                return std::nullopt;
 | 
			
		||||
            }
 | 
			
		||||
            modified |= surface->IsModified();
 | 
			
		||||
            if (!surface->IsModified()) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            modified = true;
 | 
			
		||||
 | 
			
		||||
            const u32 offset = static_cast<u32>(surface->GetCpuAddr() - cpu_addr);
 | 
			
		||||
            const u32 slice = std::get<2>(params.GetBlockOffsetXYZ(offset));
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user