mirror of
				https://github.com/yuzu-emu/yuzu.git
				synced 2025-11-04 00:53:43 +00:00 
			
		
		
		
	GPU: Added registers for min and mag texture filters and implemented them in the hw renderer.
This commit is contained in:
		
							parent
							
								
									cd2bb2dc69
								
							
						
					
					
						commit
						009e34f08a
					
				@ -119,6 +119,11 @@ struct Regs {
 | 
				
			|||||||
            MirroredRepeat = 3,
 | 
					            MirroredRepeat = 3,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        enum TextureFilter : u32 {
 | 
				
			||||||
 | 
					            Nearest = 0,
 | 
				
			||||||
 | 
					            Linear  = 1
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        union {
 | 
					        union {
 | 
				
			||||||
            BitField< 0, 8, u32> r;
 | 
					            BitField< 0, 8, u32> r;
 | 
				
			||||||
            BitField< 8, 8, u32> g;
 | 
					            BitField< 8, 8, u32> g;
 | 
				
			||||||
@ -132,6 +137,8 @@ struct Regs {
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        union {
 | 
					        union {
 | 
				
			||||||
 | 
					            BitField< 1, 1, TextureFilter> mag_filter;
 | 
				
			||||||
 | 
					            BitField< 2, 1, TextureFilter> min_filter;
 | 
				
			||||||
            BitField< 8, 2, WrapMode> wrap_t;
 | 
					            BitField< 8, 2, WrapMode> wrap_t;
 | 
				
			||||||
            BitField<12, 2, WrapMode> wrap_s;
 | 
					            BitField<12, 2, WrapMode> wrap_s;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
				
			|||||||
@ -460,6 +460,7 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0,
 | 
				
			|||||||
                    u8* texture_data = Memory::GetPhysicalPointer(texture.config.GetPhysicalAddress());
 | 
					                    u8* texture_data = Memory::GetPhysicalPointer(texture.config.GetPhysicalAddress());
 | 
				
			||||||
                    auto info = DebugUtils::TextureInfo::FromPicaRegister(texture.config, texture.format);
 | 
					                    auto info = DebugUtils::TextureInfo::FromPicaRegister(texture.config, texture.format);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // TODO: Apply the min and mag filters to the texture
 | 
				
			||||||
                    texture_color[i] = DebugUtils::LookupTexture(texture_data, s, t, info);
 | 
					                    texture_color[i] = DebugUtils::LookupTexture(texture_data, s, t, info);
 | 
				
			||||||
                    DebugUtils::DumpTexture(texture.config, texture_data);
 | 
					                    DebugUtils::DumpTexture(texture.config, texture_data);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
				
			|||||||
@ -31,9 +31,8 @@ void RasterizerCacheOpenGL::LoadAndBindTexture(OpenGLState &state, unsigned text
 | 
				
			|||||||
        state.texture_units[texture_unit].texture_2d = new_texture->texture.handle;
 | 
					        state.texture_units[texture_unit].texture_2d = new_texture->texture.handle;
 | 
				
			||||||
        state.Apply();
 | 
					        state.Apply();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // TODO: Need to choose filters that correspond to PICA once register is declared
 | 
					        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, PicaToGL::TextureFilterMode(config.config.mag_filter));
 | 
				
			||||||
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 | 
					        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, PicaToGL::TextureFilterMode(config.config.min_filter));
 | 
				
			||||||
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, PicaToGL::WrapMode(config.config.wrap_s));
 | 
					        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, PicaToGL::WrapMode(config.config.wrap_s));
 | 
				
			||||||
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, PicaToGL::WrapMode(config.config.wrap_t));
 | 
					        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, PicaToGL::WrapMode(config.config.wrap_t));
 | 
				
			||||||
 | 
				
			|||||||
@ -12,6 +12,33 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace PicaToGL {
 | 
					namespace PicaToGL {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline GLenum TextureFilterMode(Pica::Regs::TextureConfig::TextureFilter mode) {
 | 
				
			||||||
 | 
					    static const GLenum filter_mode_table[] = {
 | 
				
			||||||
 | 
					        GL_NEAREST,  // TextureFilter::Nearest
 | 
				
			||||||
 | 
					        GL_LINEAR    // TextureFilter::Linear
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Range check table for input
 | 
				
			||||||
 | 
					    if (mode >= ARRAY_SIZE(filter_mode_table)) {
 | 
				
			||||||
 | 
					        LOG_CRITICAL(Render_OpenGL, "Unknown texture filtering mode %d", mode);
 | 
				
			||||||
 | 
					        UNREACHABLE();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return GL_LINEAR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    GLenum gl_mode = filter_mode_table[mode];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Check for dummy values indicating an unknown mode
 | 
				
			||||||
 | 
					    if (gl_mode == 0) {
 | 
				
			||||||
 | 
					        LOG_CRITICAL(Render_OpenGL, "Unknown texture filtering mode %d", mode);
 | 
				
			||||||
 | 
					        UNIMPLEMENTED();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return GL_LINEAR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return gl_mode;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline GLenum WrapMode(Pica::Regs::TextureConfig::WrapMode mode) {
 | 
					inline GLenum WrapMode(Pica::Regs::TextureConfig::WrapMode mode) {
 | 
				
			||||||
    static const GLenum wrap_mode_table[] = {
 | 
					    static const GLenum wrap_mode_table[] = {
 | 
				
			||||||
        GL_CLAMP_TO_EDGE,  // WrapMode::ClampToEdge
 | 
					        GL_CLAMP_TO_EDGE,  // WrapMode::ClampToEdge
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user