mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Merge pull request #907 from Lectem/clamp_to_border
Add GL_CLAMP_TO_BORDER support.
This commit is contained in:
		
						commit
						ae7120f5d9
					
				
					 3 changed files with 26 additions and 11 deletions
				
			
		|  | @ -114,11 +114,17 @@ struct Regs { | |||
|     struct TextureConfig { | ||||
|         enum WrapMode : u32 { | ||||
|             ClampToEdge    = 0, | ||||
|             ClampToBorder  = 1, | ||||
|             Repeat         = 2, | ||||
|             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 { | ||||
|             BitField< 0, 16, u32> height; | ||||
|  |  | |||
|  | @ -349,6 +349,9 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0, | |||
|                             val = std::min(val, (int)size - 1); | ||||
|                             return val; | ||||
| 
 | ||||
|                         case Regs::TextureConfig::ClampToBorder: | ||||
|                             return val; | ||||
| 
 | ||||
|                         case Regs::TextureConfig::Repeat: | ||||
|                             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.
 | ||||
|                 // 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); | ||||
|                 if ((texture.config.wrap_s == Regs::TextureConfig::ClampToBorder && (s < 0 || s >= texture.config.width)) | ||||
|                     || (texture.config.wrap_t == Regs::TextureConfig::ClampToBorder && (t < 0 || t >= texture.config.height))) { | ||||
|                     auto border_color = texture.config.border_color; | ||||
|                     texture_color[i] = { border_color.r, border_color.g, border_color.b, border_color.a }; | ||||
|                 } 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()); | ||||
|                 auto info = DebugUtils::TextureInfo::FromPicaRegister(texture.config, texture.format); | ||||
|                     u8* texture_data = Memory::GetPhysicalPointer(texture.config.GetPhysicalAddress()); | ||||
|                     auto info = DebugUtils::TextureInfo::FromPicaRegister(texture.config, texture.format); | ||||
| 
 | ||||
|                 texture_color[i] = DebugUtils::LookupTexture(texture_data, s, t, info); | ||||
|                 DebugUtils::DumpTexture(texture.config, texture_data); | ||||
|                     texture_color[i] = DebugUtils::LookupTexture(texture_data, s, t, info); | ||||
|                     DebugUtils::DumpTexture(texture.config, texture_data); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             // 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) { | ||||
|     static const GLenum wrap_mode_table[] = { | ||||
|         GL_CLAMP_TO_EDGE,  // WrapMode::ClampToEdge
 | ||||
|         0,                 // Unknown
 | ||||
|         GL_CLAMP_TO_BORDER,// WrapMode::ClampToBorder
 | ||||
|         GL_REPEAT,         // WrapMode::Repeat
 | ||||
|         GL_MIRRORED_REPEAT // WrapMode::MirroredRepeat
 | ||||
|     }; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue