diff --git a/rpcs3/Emu/GS/GCM.h b/rpcs3/Emu/GS/GCM.h index 8d57541ff6..25997ac12e 100644 --- a/rpcs3/Emu/GS/GCM.h +++ b/rpcs3/Emu/GS/GCM.h @@ -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, }; diff --git a/rpcs3/Emu/GS/GL/GLGSRender.h b/rpcs3/Emu/GS/GL/GLGSRender.h index 9f3b3e28f0..b3bca78d01 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.h +++ b/rpcs3/Emu/GS/GL/GLGSRender.h @@ -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();