mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-06 09:39:55 +00:00
Fix texture MAG filter and add max anisotropy
This commit is contained in:
parent
2d862da540
commit
382af8437c
@ -25,7 +25,7 @@ enum
|
||||
{
|
||||
CELL_GCM_VERTEX_S1 = 1,
|
||||
CELL_GCM_VERTEX_F = 2,
|
||||
CELL_GCM_VERTEX_S = 3,
|
||||
CELL_GCM_VERTEX_SF = 3,
|
||||
CELL_GCM_VERTEX_UB = 4,
|
||||
CELL_GCM_VERTEX_S32K = 5,
|
||||
CELL_GCM_VERTEX_CMP = 6,
|
||||
@ -89,6 +89,26 @@ enum
|
||||
// Normalization Flag
|
||||
CELL_GCM_TEXTURE_NR = 0x00,
|
||||
CELL_GCM_TEXTURE_UN = 0x40,
|
||||
|
||||
// Max Anisotropy
|
||||
CELL_GCM_TEXTURE_MAX_ANISO_1 = 0,
|
||||
CELL_GCM_TEXTURE_MAX_ANISO_2 = 1,
|
||||
CELL_GCM_TEXTURE_MAX_ANISO_4 = 2,
|
||||
CELL_GCM_TEXTURE_MAX_ANISO_6 = 3,
|
||||
CELL_GCM_TEXTURE_MAX_ANISO_8 = 4,
|
||||
CELL_GCM_TEXTURE_MAX_ANISO_10 = 5,
|
||||
CELL_GCM_TEXTURE_MAX_ANISO_12 = 6,
|
||||
CELL_GCM_TEXTURE_MAX_ANISO_16 = 7,
|
||||
|
||||
// Wrap
|
||||
CELL_GCM_TEXTURE_WRAP = 1,
|
||||
CELL_GCM_TEXTURE_MIRROR = 2,
|
||||
CELL_GCM_TEXTURE_CLAMP_TO_EDGE = 3,
|
||||
CELL_GCM_TEXTURE_BORDER = 4,
|
||||
CELL_GCM_TEXTURE_CLAMP = 5,
|
||||
CELL_GCM_TEXTURE_MIRROR_ONCE_CLAMP_TO_EDGE = 6,
|
||||
CELL_GCM_TEXTURE_MIRROR_ONCE_BORDER = 7,
|
||||
CELL_GCM_TEXTURE_MIRROR_ONCE_CLAMP = 8,
|
||||
};
|
||||
|
||||
// GCM Surface
|
||||
@ -107,7 +127,7 @@ enum
|
||||
CELL_GCM_SURFACE_Z24S8 = 2,
|
||||
|
||||
// Surface Antialias
|
||||
CELL_GCM_SURFACE_CENTER_1 = 2,
|
||||
CELL_GCM_SURFACE_CENTER_1 = 0,
|
||||
CELL_GCM_SURFACE_DIAGONAL_CENTERED_2 = 3,
|
||||
CELL_GCM_SURFACE_SQUARE_CENTERED_4 = 4,
|
||||
CELL_GCM_SURFACE_SQUARE_ROTATED_4 = 5,
|
||||
@ -117,8 +137,20 @@ enum
|
||||
CELL_GCM_SURFACE_SWIZZLE = 2,
|
||||
|
||||
// Surface format
|
||||
CELL_GCM_SURFACE_A8R8G8B8 = 8,
|
||||
CELL_GCM_SURFACE_F_W16Z16Y16X16 = 11,
|
||||
CELL_GCM_SURFACE_X1R5G5B5_Z1R5G5B5 = 1,
|
||||
CELL_GCM_SURFACE_X1R5G5B5_O1R5G5B5 = 2,
|
||||
CELL_GCM_SURFACE_R5G6B5 = 3,
|
||||
CELL_GCM_SURFACE_X8R8G8B8_Z8R8G8B8 = 4,
|
||||
CELL_GCM_SURFACE_X8R8G8B8_O8R8G8B8 = 5,
|
||||
CELL_GCM_SURFACE_A8R8G8B8 = 8,
|
||||
CELL_GCM_SURFACE_B8 = 9,
|
||||
CELL_GCM_SURFACE_G8B8 = 10,
|
||||
CELL_GCM_SURFACE_F_W16Z16Y16X16 = 11,
|
||||
CELL_GCM_SURFACE_F_W32Z32Y32X32 = 12,
|
||||
CELL_GCM_SURFACE_F_X32 = 13,
|
||||
CELL_GCM_SURFACE_X8B8G8R8_Z8B8G8R8 = 14,
|
||||
CELL_GCM_SURFACE_X8B8G8R8_O8B8G8R8 = 15,
|
||||
CELL_GCM_SURFACE_A8B8G8R8 = 16,
|
||||
|
||||
};
|
||||
|
||||
|
@ -47,20 +47,38 @@ public:
|
||||
{
|
||||
switch(wrap)
|
||||
{
|
||||
case 1: return GL_REPEAT;
|
||||
case 2: return GL_MIRRORED_REPEAT;
|
||||
case 3: return GL_CLAMP_TO_EDGE;
|
||||
case 4: return GL_CLAMP_TO_BORDER;
|
||||
case 5: return GL_CLAMP_TO_EDGE;
|
||||
case 6: return GL_MIRROR_CLAMP_TO_EDGE_EXT;
|
||||
case 7: return GL_MIRROR_CLAMP_TO_BORDER_EXT;
|
||||
case 8: return GL_MIRROR_CLAMP_EXT;
|
||||
case CELL_GCM_TEXTURE_WRAP: return GL_REPEAT;
|
||||
case CELL_GCM_TEXTURE_MIRROR: return GL_MIRRORED_REPEAT;
|
||||
case CELL_GCM_TEXTURE_CLAMP_TO_EDGE: return GL_CLAMP_TO_EDGE;
|
||||
case CELL_GCM_TEXTURE_BORDER: return GL_CLAMP_TO_BORDER;
|
||||
case CELL_GCM_TEXTURE_CLAMP: return GL_CLAMP_TO_EDGE;
|
||||
case CELL_GCM_TEXTURE_MIRROR_ONCE_CLAMP_TO_EDGE: return GL_MIRROR_CLAMP_TO_EDGE_EXT;
|
||||
case CELL_GCM_TEXTURE_MIRROR_ONCE_BORDER: return GL_MIRROR_CLAMP_TO_BORDER_EXT;
|
||||
case CELL_GCM_TEXTURE_MIRROR_ONCE_CLAMP: return GL_MIRROR_CLAMP_EXT;
|
||||
}
|
||||
|
||||
LOG_ERROR(RSX, "Texture wrap error: bad wrap (%d).", wrap);
|
||||
return GL_REPEAT;
|
||||
}
|
||||
|
||||
float GetMaxAniso(int aniso)
|
||||
{
|
||||
switch (aniso)
|
||||
{
|
||||
case CELL_GCM_TEXTURE_MAX_ANISO_1: return 1.0f;
|
||||
case CELL_GCM_TEXTURE_MAX_ANISO_2: return 2.0f;
|
||||
case CELL_GCM_TEXTURE_MAX_ANISO_4: return 4.0f;
|
||||
case CELL_GCM_TEXTURE_MAX_ANISO_6: return 6.0f;
|
||||
case CELL_GCM_TEXTURE_MAX_ANISO_8: return 8.0f;
|
||||
case CELL_GCM_TEXTURE_MAX_ANISO_10: return 10.0f;
|
||||
case CELL_GCM_TEXTURE_MAX_ANISO_12: return 12.0f;
|
||||
case CELL_GCM_TEXTURE_MAX_ANISO_16: return 16.0f;
|
||||
}
|
||||
|
||||
LOG_ERROR(RSX, "Texture anisotropy error: bad max aniso (%d).", aniso);
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
inline static u8 Convert4To8(u8 v)
|
||||
{
|
||||
// Swizzle bits: 00001234 -> 12341234
|
||||
@ -478,22 +496,36 @@ public:
|
||||
|
||||
checkForGlError("GLTexture::Init() -> lod");
|
||||
|
||||
static const int gl_tex_filter[] =
|
||||
static const int gl_tex_min_filter[] =
|
||||
{
|
||||
GL_NEAREST,
|
||||
GL_NEAREST, // unused
|
||||
GL_NEAREST,
|
||||
GL_LINEAR,
|
||||
GL_NEAREST_MIPMAP_NEAREST,
|
||||
GL_LINEAR_MIPMAP_NEAREST,
|
||||
GL_NEAREST_MIPMAP_LINEAR,
|
||||
GL_LINEAR_MIPMAP_LINEAR,
|
||||
GL_NEAREST,
|
||||
GL_NEAREST, // CELL_GCM_TEXTURE_CONVOLUTION_MIN
|
||||
};
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_tex_filter[tex.GetMinFilter()]);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_tex_filter[tex.GetMagFilter()]);
|
||||
static const int gl_tex_mag_filter[] = {
|
||||
GL_NEAREST, // unused
|
||||
GL_NEAREST,
|
||||
GL_LINEAR,
|
||||
GL_NEAREST, // unused
|
||||
GL_LINEAR // CELL_GCM_TEXTURE_CONVOLUTION_MAG
|
||||
};
|
||||
|
||||
checkForGlError("GLTexture::Init() -> filters");
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_tex_min_filter[tex.GetMinFilter()]);
|
||||
|
||||
checkForGlError("GLTexture::Init() -> min filters");
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_tex_mag_filter[tex.GetMagFilter()]);
|
||||
|
||||
checkForGlError("GLTexture::Init() -> mag filters");
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, GetMaxAniso(tex.GetMaxAniso()));
|
||||
|
||||
checkForGlError("GLTexture::Init() -> max anisotropy");
|
||||
|
||||
//Unbind();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user