mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	Implement Mip Filter
This commit is contained in:
		
							parent
							
								
									dc85e3bff1
								
							
						
					
					
						commit
						258f0f5c31
					
				@ -731,11 +731,15 @@ void RasterizerOpenGL::SamplerInfo::SyncWithConfig(const Tegra::Texture::TSCEntr
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (mag_filter != config.mag_filter) {
 | 
					    if (mag_filter != config.mag_filter) {
 | 
				
			||||||
        mag_filter = config.mag_filter;
 | 
					        mag_filter = config.mag_filter;
 | 
				
			||||||
        glSamplerParameteri(s, GL_TEXTURE_MAG_FILTER, MaxwellToGL::TextureFilterMode(mag_filter));
 | 
					        glSamplerParameteri(
 | 
				
			||||||
 | 
					            s, GL_TEXTURE_MAG_FILTER,
 | 
				
			||||||
 | 
					            MaxwellToGL::TextureFilterMode(mag_filter, Tegra::Texture::TextureMipmapFilter::None));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (min_filter != config.min_filter) {
 | 
					    if (min_filter != config.min_filter || mip_filter != config.mip_filter) {
 | 
				
			||||||
        min_filter = config.min_filter;
 | 
					        min_filter = config.min_filter;
 | 
				
			||||||
        glSamplerParameteri(s, GL_TEXTURE_MIN_FILTER, MaxwellToGL::TextureFilterMode(min_filter));
 | 
					        mip_filter = config.mip_filter;
 | 
				
			||||||
 | 
					        glSamplerParameteri(s, GL_TEXTURE_MIN_FILTER,
 | 
				
			||||||
 | 
					                            MaxwellToGL::TextureFilterMode(min_filter, mip_filter));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (wrap_u != config.wrap_u) {
 | 
					    if (wrap_u != config.wrap_u) {
 | 
				
			||||||
 | 
				
			|||||||
@ -93,6 +93,7 @@ private:
 | 
				
			|||||||
    private:
 | 
					    private:
 | 
				
			||||||
        Tegra::Texture::TextureFilter mag_filter;
 | 
					        Tegra::Texture::TextureFilter mag_filter;
 | 
				
			||||||
        Tegra::Texture::TextureFilter min_filter;
 | 
					        Tegra::Texture::TextureFilter min_filter;
 | 
				
			||||||
 | 
					        Tegra::Texture::TextureMipmapFilter mip_filter;
 | 
				
			||||||
        Tegra::Texture::WrapMode wrap_u;
 | 
					        Tegra::Texture::WrapMode wrap_u;
 | 
				
			||||||
        Tegra::Texture::WrapMode wrap_v;
 | 
					        Tegra::Texture::WrapMode wrap_v;
 | 
				
			||||||
        Tegra::Texture::WrapMode wrap_p;
 | 
					        Tegra::Texture::WrapMode wrap_p;
 | 
				
			||||||
 | 
				
			|||||||
@ -919,7 +919,7 @@ struct SurfaceParams {
 | 
				
			|||||||
        u32 height = MipHeight(mip_level);
 | 
					        u32 height = MipHeight(mip_level);
 | 
				
			||||||
        u32 bh = block_height;
 | 
					        u32 bh = block_height;
 | 
				
			||||||
        // Magical block resizing algorithm, needs more testing.
 | 
					        // Magical block resizing algorithm, needs more testing.
 | 
				
			||||||
        while (bh != 1 && height / bh <= 16) {
 | 
					        while (bh > 1 && (height +  bh - 1) / bh <= 16) {
 | 
				
			||||||
            bh = bh >> 1;
 | 
					            bh = bh >> 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return bh;
 | 
					        return bh;
 | 
				
			||||||
@ -929,7 +929,7 @@ struct SurfaceParams {
 | 
				
			|||||||
        u32 depth = MipDepth(mip_level);
 | 
					        u32 depth = MipDepth(mip_level);
 | 
				
			||||||
        u32 bd = block_depth;
 | 
					        u32 bd = block_depth;
 | 
				
			||||||
        // Magical block resizing algorithm, needs more testing.
 | 
					        // Magical block resizing algorithm, needs more testing.
 | 
				
			||||||
        while (bd != 1 && depth / bd <= 16) {
 | 
					        while (bd > 1 && depth / bd <= 16) {
 | 
				
			||||||
            bd = bd >> 1;
 | 
					            bd = bd >> 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return bd;
 | 
					        return bd;
 | 
				
			||||||
 | 
				
			|||||||
@ -135,12 +135,29 @@ inline GLenum PrimitiveTopology(Maxwell::PrimitiveTopology topology) {
 | 
				
			|||||||
    return {};
 | 
					    return {};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline GLenum TextureFilterMode(Tegra::Texture::TextureFilter filter_mode) {
 | 
					inline GLenum TextureFilterMode(Tegra::Texture::TextureFilter filter_mode,
 | 
				
			||||||
 | 
					                                Tegra::Texture::TextureMipmapFilter mip_filter_mode) {
 | 
				
			||||||
    switch (filter_mode) {
 | 
					    switch (filter_mode) {
 | 
				
			||||||
    case Tegra::Texture::TextureFilter::Linear:
 | 
					    case Tegra::Texture::TextureFilter::Linear: {
 | 
				
			||||||
        return GL_LINEAR;
 | 
					        switch (mip_filter_mode) {
 | 
				
			||||||
    case Tegra::Texture::TextureFilter::Nearest:
 | 
					        case Tegra::Texture::TextureMipmapFilter::None:
 | 
				
			||||||
        return GL_NEAREST;
 | 
					            return GL_LINEAR;
 | 
				
			||||||
 | 
					        case Tegra::Texture::TextureMipmapFilter::Nearest:
 | 
				
			||||||
 | 
					            return GL_NEAREST_MIPMAP_LINEAR;
 | 
				
			||||||
 | 
					        case Tegra::Texture::TextureMipmapFilter::Linear:
 | 
				
			||||||
 | 
					            return GL_LINEAR_MIPMAP_LINEAR;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case Tegra::Texture::TextureFilter::Nearest: {
 | 
				
			||||||
 | 
					        switch (mip_filter_mode) {
 | 
				
			||||||
 | 
					        case Tegra::Texture::TextureMipmapFilter::None:
 | 
				
			||||||
 | 
					            return GL_NEAREST;
 | 
				
			||||||
 | 
					        case Tegra::Texture::TextureMipmapFilter::Nearest:
 | 
				
			||||||
 | 
					            return GL_NEAREST_MIPMAP_NEAREST;
 | 
				
			||||||
 | 
					        case Tegra::Texture::TextureMipmapFilter::Linear:
 | 
				
			||||||
 | 
					            return GL_LINEAR_MIPMAP_NEAREST;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    LOG_CRITICAL(Render_OpenGL, "Unimplemented texture filter mode={}",
 | 
					    LOG_CRITICAL(Render_OpenGL, "Unimplemented texture filter mode={}",
 | 
				
			||||||
                 static_cast<u32>(filter_mode));
 | 
					                 static_cast<u32>(filter_mode));
 | 
				
			||||||
@ -148,6 +165,7 @@ inline GLenum TextureFilterMode(Tegra::Texture::TextureFilter filter_mode) {
 | 
				
			|||||||
    return {};
 | 
					    return {};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline GLenum WrapMode(Tegra::Texture::WrapMode wrap_mode) {
 | 
					inline GLenum WrapMode(Tegra::Texture::WrapMode wrap_mode) {
 | 
				
			||||||
    switch (wrap_mode) {
 | 
					    switch (wrap_mode) {
 | 
				
			||||||
    case Tegra::Texture::WrapMode::Wrap:
 | 
					    case Tegra::Texture::WrapMode::Wrap:
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user