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
|
@ -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
|
||||||
|
|
Reference in New Issue