mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Added GL_CLAMP_TO_BORDER support
This commit is contained in:
		
							parent
							
								
									0ef3f12c71
								
							
						
					
					
						commit
						58d1c6398e
					
				
					 3 changed files with 26 additions and 11 deletions
				
			
		|  | @ -114,11 +114,17 @@ struct Regs { | ||||||
|     struct TextureConfig { |     struct TextureConfig { | ||||||
|         enum WrapMode : u32 { |         enum WrapMode : u32 { | ||||||
|             ClampToEdge    = 0, |             ClampToEdge    = 0, | ||||||
|  |             ClampToBorder  = 1, | ||||||
|             Repeat         = 2, |             Repeat         = 2, | ||||||
|             MirroredRepeat = 3, |             MirroredRepeat = 3, | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         INSERT_PADDING_WORDS(0x1); |         union { | ||||||
|  |             BitField< 0, 8, u32> r; | ||||||
|  |             BitField< 8, 8, u32> g; | ||||||
|  |             BitField<16, 8, u32> b; | ||||||
|  |             BitField<24, 8, u32> a; | ||||||
|  |         } border_color; | ||||||
| 
 | 
 | ||||||
|         union { |         union { | ||||||
|             BitField< 0, 16, u32> height; |             BitField< 0, 16, u32> height; | ||||||
|  |  | ||||||
|  | @ -349,6 +349,9 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0, | ||||||
|                             val = std::min(val, (int)size - 1); |                             val = std::min(val, (int)size - 1); | ||||||
|                             return val; |                             return val; | ||||||
| 
 | 
 | ||||||
|  |                         case Regs::TextureConfig::ClampToBorder: | ||||||
|  |                             return val; | ||||||
|  | 
 | ||||||
|                         case Regs::TextureConfig::Repeat: |                         case Regs::TextureConfig::Repeat: | ||||||
|                             return (int)((unsigned)val % size); |                             return (int)((unsigned)val % size); | ||||||
| 
 | 
 | ||||||
|  | @ -367,17 +370,23 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0, | ||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 // Textures are laid out from bottom to top, hence we invert the t coordinate.
 |                 if ((texture.config.wrap_s == Regs::TextureConfig::ClampToBorder && (s < 0 || s >= texture.config.width)) | ||||||
|                 // NOTE: This may not be the right place for the inversion.
 |                     || (texture.config.wrap_t == Regs::TextureConfig::ClampToBorder && (t < 0 || t >= texture.config.height))) { | ||||||
|                 // TODO: Check if this applies to ETC textures, too.
 |                     auto border_color = texture.config.border_color; | ||||||
|                 s = GetWrappedTexCoord(texture.config.wrap_s, s, texture.config.width); |                     texture_color[i] = { border_color.r, border_color.g, border_color.b, border_color.a }; | ||||||
|                 t = texture.config.height - 1 - GetWrappedTexCoord(texture.config.wrap_t, t, texture.config.height); |                 } else { | ||||||
|  |                     // Textures are laid out from bottom to top, hence we invert the t coordinate.
 | ||||||
|  |                     // NOTE: This may not be the right place for the inversion.
 | ||||||
|  |                     // TODO: Check if this applies to ETC textures, too.
 | ||||||
|  |                     s = GetWrappedTexCoord(texture.config.wrap_s, s, texture.config.width); | ||||||
|  |                     t = texture.config.height - 1 - GetWrappedTexCoord(texture.config.wrap_t, t, texture.config.height); | ||||||
| 
 | 
 | ||||||
|                 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); | ||||||
| 
 | 
 | ||||||
|                 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); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             // Texture environment - consists of 6 stages of color and alpha combining.
 |             // Texture environment - consists of 6 stages of color and alpha combining.
 | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ namespace PicaToGL { | ||||||
| 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
 | ||||||
|         0,                 // Unknown
 |         GL_CLAMP_TO_BORDER,// WrapMode::ClampToBorder
 | ||||||
|         GL_REPEAT,         // WrapMode::Repeat
 |         GL_REPEAT,         // WrapMode::Repeat
 | ||||||
|         GL_MIRRORED_REPEAT // WrapMode::MirroredRepeat
 |         GL_MIRRORED_REPEAT // WrapMode::MirroredRepeat
 | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue