mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +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
					
				
					 4 changed files with 37 additions and 3 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue