mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-22 14:52:45 +01: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 {
|
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…
Reference in a new issue