diff --git a/GPU/GLES/GLES_GPU.cpp b/GPU/GLES/GLES_GPU.cpp index e41f9c3fb9a0..3ea6d88e6e6c 100644 --- a/GPU/GLES/GLES_GPU.cpp +++ b/GPU/GLES/GLES_GPU.cpp @@ -93,7 +93,7 @@ static const CommandTableEntry commandTable[] = { {GE_CMD_TEXSIZE6, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &GLES_GPU::Execute_TexSizeN}, {GE_CMD_TEXSIZE7, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &GLES_GPU::Execute_TexSizeN}, {GE_CMD_TEXFORMAT, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &GLES_GPU::Execute_TexFormat}, - {GE_CMD_TEXLEVEL, FLAG_EXECUTEONCHANGE}, + {GE_CMD_TEXLEVEL, FLAG_EXECUTEONCHANGE, &GLES_GPU::Execute_TexLevel}, {GE_CMD_TEXADDR0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &GLES_GPU::Execute_TexAddr0}, {GE_CMD_TEXADDR1, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &GLES_GPU::Execute_TexAddrN}, {GE_CMD_TEXADDR2, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &GLES_GPU::Execute_TexAddrN}, @@ -1264,6 +1264,18 @@ void GLES_GPU::Execute_BlockTransferStart(u32 op, u32 diff) { gstate_c.textureChanged = TEXCHANGE_UPDATED; } +void GLES_GPU::Execute_TexLevel(u32 op, u32 diff) { + // I had hoped that this would let us avoid excessively flushing in Gran Turismo, but not so, + // as the game switches rapidly between modes 0 and 1. + /* + if (gstate.getTexLevelMode() == GE_TEXLEVEL_MODE_CONST) { + gstate.texlevel ^= diff; + Flush(); + gstate.texlevel ^= diff; + } + */ + gstate_c.textureChanged |= TEXCHANGE_PARAMSONLY; +} void GLES_GPU::ExecuteOpInternal(u32 op, u32 diff) { u32 cmd = op >> 24; u32 data = op & 0xFFFFFF; @@ -1720,15 +1732,7 @@ void GLES_GPU::ExecuteOpInternal(u32 op, u32 diff) { #endif case GE_CMD_TEXLEVEL: - // I had hoped that this would let us avoid excessively flushing in Gran Turismo, but not so, - // as the game switches rapidly between modes 0 and 1. - /* - if ((gstate.texlevel & 0x3) == 1) { - gstate.texlevel ^= diff; - Flush(); - gstate.texlevel ^= diff; - }*/ - gstate_c.textureChanged |= TEXCHANGE_PARAMSONLY; + Execute_TexLevel(op, diff); break; ////////////////////////////////////////////////////////////////// diff --git a/GPU/GLES/GLES_GPU.h b/GPU/GLES/GLES_GPU.h index 1f44d42121be..2c7168c0ce12 100644 --- a/GPU/GLES/GLES_GPU.h +++ b/GPU/GLES/GLES_GPU.h @@ -127,6 +127,7 @@ class GLES_GPU : public GPUCommon { void Execute_BoneMtxNum(u32 op, u32 diff); void Execute_BoneMtxData(u32 op, u32 diff); void Execute_BlockTransferStart(u32 op, u32 diff); + void Execute_TexLevel(u32 op, u32 diff); protected: virtual void FastRunLoop(DisplayList &list); diff --git a/GPU/GLES/TextureCache.cpp b/GPU/GLES/TextureCache.cpp index 907641f05d72..8e4e8281c88d 100644 --- a/GPU/GLES/TextureCache.cpp +++ b/GPU/GLES/TextureCache.cpp @@ -504,15 +504,15 @@ void TextureCache::UpdateSamplingParams(TexCacheEntry &entry, bool force) { float lodBias = (float)(int)(s8)((gstate.texlevel >> 16) & 0xFF) / 16.0f; if (force || entry.lodBias != lodBias) { #ifndef USING_GLES2 - int mode = gstate.texlevel & 0x3; + GETexLevelMode mode = gstate.getTexLevelMode(); switch (mode) { - case GE_TEXBIAS_MODE_AUTO: + case GE_TEXLEVEL_MODE_AUTO: // TODO break; - case GE_TEXBIAS_MODE_CONST: + case GE_TEXLEVEL_MODE_CONST: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, lodBias); break; - case GE_TEXBIAS_MODE_SLOPE: + case GE_TEXLEVEL_MODE_SLOPE: // TODO break; } diff --git a/GPU/GLES/TextureCache.h b/GPU/GLES/TextureCache.h index aabf805b66f0..43688bd2c9a7 100644 --- a/GPU/GLES/TextureCache.h +++ b/GPU/GLES/TextureCache.h @@ -39,12 +39,6 @@ enum FramebufferNotification { NOTIFY_FB_DESTROYED, }; -enum TextureLevelMode { - GE_TEXBIAS_MODE_AUTO = 0, - GE_TEXBIAS_MODE_CONST = 1, - GE_TEXBIAS_MODE_SLOPE = 2, -}; - class TextureCache { public: TextureCache(); diff --git a/GPU/GPUState.h b/GPU/GPUState.h index 7933a91c3543..28a2a1d184af 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -292,6 +292,7 @@ struct GPUgstate int getTextureWidth(int level) const { return 1 << (texsize[level] & 0xf);} int getTextureHeight(int level) const { return 1 << ((texsize[level] >> 8) & 0xf);} u16 getTextureDimension(int level) const { return texsize[level] & 0xf0f;} + GETexLevelMode getTexLevelMode() const { return static_cast(texlevel & 0x3); } bool isTextureMapEnabled() const { return textureMapEnable & 1; } GETexFunc getTextureFunction() const { return static_cast(texfunc & 0x7); } bool isColorDoublingEnabled() const { return (texfunc & 0x10000) != 0; } diff --git a/GPU/ge_constants.h b/GPU/ge_constants.h index 677697265c3d..556da8071d06 100644 --- a/GPU/ge_constants.h +++ b/GPU/ge_constants.h @@ -414,6 +414,12 @@ enum GETextureFormat GE_TFMT_DXT5 = 10, }; +enum GETexLevelMode { + GE_TEXLEVEL_MODE_AUTO = 0, + GE_TEXLEVEL_MODE_CONST = 1, + GE_TEXLEVEL_MODE_SLOPE = 2, +}; + enum GEMaterialColorSetting { GE_MATERIALCOLOR_EMISSIVE = 0,