Merge pull request #907 from Lectem/clamp_to_border

Add GL_CLAMP_TO_BORDER support.
This commit is contained in:
Tony Wasserka 2015-07-12 03:19:46 +02:00
commit ae7120f5d9
3 changed files with 26 additions and 11 deletions

View file

@ -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;

View file

@ -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.

View file

@ -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
}; };