Merge the texture flags into the dirty flags

This commit is contained in:
Henrik Rydgard 2017-01-24 09:41:38 +01:00
parent c289a2c7bf
commit e4cb44c243
25 changed files with 241 additions and 253 deletions

View File

@ -89,6 +89,8 @@ enum : uint64_t {
// Other dirty elements that aren't uniforms!
DIRTY_FRAMEBUF = 1ULL << 40,
DIRTY_TEXTURE_IMAGE = 1ULL << 41,
DIRTY_TEXTURE_PARAMS = 1ULL << 42,
// Now we can add further dirty flags that are not uniforms.

View File

@ -313,7 +313,7 @@ void DrawEngineDX9::SubmitPrim(void *verts, void *inds, GEPrimitiveType prim, in
if (prim == GE_PRIM_RECTANGLES && (gstate.getTextureAddress(0) & 0x3FFFFFFF) == (gstate.getFrameBufAddress() & 0x3FFFFFFF)) {
// Rendertarget == texture?
if (!g_Config.bDisableSlowFramebufEffects) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
Flush();
}
}

View File

@ -390,11 +390,11 @@ namespace DX9 {
// ugly...
if (gstate_c.curRTWidth != vfb->width || gstate_c.curRTHeight != vfb->height) {
gstate_c.DirtyUniform(DIRTY_PROJTHROUGHMATRIX);
gstate_c.Dirty(DIRTY_PROJTHROUGHMATRIX);
}
if (gstate_c.curRTRenderWidth != vfb->renderWidth || gstate_c.curRTRenderHeight != vfb->renderHeight) {
gstate_c.DirtyUniform(DIRTY_PROJMATRIX);
gstate_c.DirtyUniform(DIRTY_PROJTHROUGHMATRIX);
gstate_c.Dirty(DIRTY_PROJMATRIX);
gstate_c.Dirty(DIRTY_PROJTHROUGHMATRIX);
}
}
@ -447,11 +447,11 @@ namespace DX9 {
// ugly...
if (gstate_c.curRTWidth != vfb->width || gstate_c.curRTHeight != vfb->height) {
gstate_c.DirtyUniform(DIRTY_PROJTHROUGHMATRIX);
gstate_c.Dirty(DIRTY_PROJTHROUGHMATRIX);
}
if (gstate_c.curRTRenderWidth != vfb->renderWidth || gstate_c.curRTRenderHeight != vfb->renderHeight) {
gstate_c.DirtyUniform(DIRTY_PROJMATRIX);
gstate_c.DirtyUniform(DIRTY_PROJTHROUGHMATRIX);
gstate_c.Dirty(DIRTY_PROJMATRIX);
gstate_c.Dirty(DIRTY_PROJTHROUGHMATRIX);
}
}
@ -465,11 +465,11 @@ namespace DX9 {
// ugly...
if (gstate_c.curRTWidth != vfb->width || gstate_c.curRTHeight != vfb->height) {
gstate_c.DirtyUniform(DIRTY_PROJTHROUGHMATRIX);
gstate_c.Dirty(DIRTY_PROJTHROUGHMATRIX);
}
if (gstate_c.curRTRenderWidth != vfb->renderWidth || gstate_c.curRTRenderHeight != vfb->renderHeight) {
gstate_c.DirtyUniform(DIRTY_PROJMATRIX);
gstate_c.DirtyUniform(DIRTY_PROJTHROUGHMATRIX);
gstate_c.Dirty(DIRTY_PROJMATRIX);
gstate_c.Dirty(DIRTY_PROJTHROUGHMATRIX);
}
}

View File

@ -644,7 +644,7 @@ void GPU_DX9::CopyDisplayToOutputInternal() {
// shaderManager_->EndFrame();
shaderManagerDX9_->DirtyLastShader();
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
}
// Maybe should write this in ASM...
@ -708,7 +708,7 @@ void GPU_DX9::Execute_Iaddr(u32 op, u32 diff) {
void GPU_DX9::Execute_VertexType(u32 op, u32 diff) {
if (diff & (GE_VTYPE_TC_MASK | GE_VTYPE_THROUGH_MASK)) {
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
}
@ -720,11 +720,11 @@ void GPU_DX9::Execute_VertexTypeSkinning(u32 op, u32 diff) {
Flush();
gstate.vertType ^= diff;
if (diff & (GE_VTYPE_TC_MASK | GE_VTYPE_THROUGH_MASK))
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
// In this case, we may be doing weights and morphs.
// Update any bone matrix uniforms so it uses them correctly.
if ((op & GE_VTYPE_MORPHCOUNT_MASK) != 0) {
gstate_c.DirtyUniform(gstate_c.deferredVertTypeDirty);
gstate_c.Dirty(gstate_c.deferredVertTypeDirty);
gstate_c.deferredVertTypeDirty = 0;
}
}
@ -890,97 +890,97 @@ void GPU_DX9::Execute_Spline(u32 op, u32 diff) {
void GPU_DX9::Execute_ViewportType(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_FRAMEBUF);
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
switch (op >> 24) {
case GE_CMD_VIEWPORTZSCALE:
case GE_CMD_VIEWPORTZCENTER:
gstate_c.DirtyUniform(DIRTY_PROJMATRIX | DIRTY_DEPTHRANGE);
gstate_c.Dirty(DIRTY_PROJMATRIX | DIRTY_DEPTHRANGE);
break;
}
}
void GPU_DX9::Execute_Region(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_FRAMEBUF);
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_DX9::Execute_Scissor(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_FRAMEBUF);
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_DX9::Execute_FramebufType(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_FRAMEBUF);
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_DX9::Execute_TexScaleU(u32 op, u32 diff) {
gstate_c.uv.uScale = getFloat24(op);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_DX9::Execute_TexScaleV(u32 op, u32 diff) {
gstate_c.uv.vScale = getFloat24(op);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_DX9::Execute_TexOffsetU(u32 op, u32 diff) {
gstate_c.uv.uOff = getFloat24(op);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_DX9::Execute_TexOffsetV(u32 op, u32 diff) {
gstate_c.uv.vOff = getFloat24(op);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_DX9::Execute_TexAddr0(u32 op, u32 diff) {
gstate_c.textureImageChanged = true;
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_DX9::Execute_TexAddrN(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_DX9::Execute_TexBufw0(u32 op, u32 diff) {
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
}
void GPU_DX9::Execute_TexBufwN(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_DX9::Execute_TexSize0(u32 op, u32 diff) {
// Render to texture may have overridden the width/height.
// Don't reset it unless the size is different / the texture has changed.
if (diff || (gstate_c.textureParamsChanged || gstate_c.textureImageChanged)) {
if (diff || gstate_c.IsDirty(DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS)) {
gstate_c.curTextureWidth = gstate.getTextureWidth(0);
gstate_c.curTextureHeight = gstate.getTextureHeight(0);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
// We will need to reset the texture now.
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
}
void GPU_DX9::Execute_TexSizeN(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_DX9::Execute_TexFormat(u32 op, u32 diff) {
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
}
void GPU_DX9::Execute_TexMapMode(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_DX9::Execute_TexParamType(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_DX9::Execute_TexEnvColor(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_TEXENV);
gstate_c.Dirty(DIRTY_TEXENV);
}
void GPU_DX9::Execute_TexLevel(u32 op, u32 diff) {
@ -993,79 +993,79 @@ void GPU_DX9::Execute_TexLevel(u32 op, u32 diff) {
gstate.texlevel ^= diff;
}
*/
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_DX9::Execute_LoadClut(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
textureCacheDX9_->LoadClut(gstate.getClutAddress(), gstate.getClutLoadBytes());
// This could be used to "dirty" textures with clut.
}
void GPU_DX9::Execute_ClutFormat(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
// This could be used to "dirty" textures with clut.
}
void GPU_DX9::Execute_Ambient(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_AMBIENT);
gstate_c.Dirty(DIRTY_AMBIENT);
}
void GPU_DX9::Execute_MaterialDiffuse(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_MATDIFFUSE);
gstate_c.Dirty(DIRTY_MATDIFFUSE);
}
void GPU_DX9::Execute_MaterialEmissive(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_MATEMISSIVE);
gstate_c.Dirty(DIRTY_MATEMISSIVE);
}
void GPU_DX9::Execute_MaterialAmbient(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_MATAMBIENTALPHA);
gstate_c.Dirty(DIRTY_MATAMBIENTALPHA);
}
void GPU_DX9::Execute_MaterialSpecular(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_MATSPECULAR);
gstate_c.Dirty(DIRTY_MATSPECULAR);
}
void GPU_DX9::Execute_Light0Param(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_LIGHT0);
gstate_c.Dirty(DIRTY_LIGHT0);
}
void GPU_DX9::Execute_Light1Param(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_LIGHT1);
gstate_c.Dirty(DIRTY_LIGHT1);
}
void GPU_DX9::Execute_Light2Param(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_LIGHT2);
gstate_c.Dirty(DIRTY_LIGHT2);
}
void GPU_DX9::Execute_Light3Param(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_LIGHT3);
gstate_c.Dirty(DIRTY_LIGHT3);
}
void GPU_DX9::Execute_FogColor(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_FOGCOLOR);
gstate_c.Dirty(DIRTY_FOGCOLOR);
}
void GPU_DX9::Execute_FogCoef(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_FOGCOEF);
gstate_c.Dirty(DIRTY_FOGCOEF);
}
void GPU_DX9::Execute_ColorTestMask(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_ALPHACOLORMASK);
gstate_c.Dirty(DIRTY_ALPHACOLORMASK);
}
void GPU_DX9::Execute_AlphaTest(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_ALPHACOLORREF);
gstate_c.DirtyUniform(DIRTY_ALPHACOLORMASK);
gstate_c.Dirty(DIRTY_ALPHACOLORREF);
gstate_c.Dirty(DIRTY_ALPHACOLORMASK);
}
void GPU_DX9::Execute_StencilTest(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_STENCILREPLACEVALUE);
gstate_c.Dirty(DIRTY_STENCILREPLACEVALUE);
}
void GPU_DX9::Execute_ColorRef(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_ALPHACOLORREF);
gstate_c.Dirty(DIRTY_ALPHACOLORREF);
}
void GPU_DX9::Execute_Generic(u32 op, u32 diff) {
@ -1116,7 +1116,7 @@ void GPU_DX9::Execute_Generic(u32 op, u32 diff) {
case GE_CMD_TEXTUREMAPENABLE:
if (diff)
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
break;
case GE_CMD_LIGHTINGENABLE:
@ -1124,17 +1124,17 @@ void GPU_DX9::Execute_Generic(u32 op, u32 diff) {
case GE_CMD_FOGCOLOR:
if (diff)
gstate_c.DirtyUniform(DIRTY_FOGCOLOR);
gstate_c.Dirty(DIRTY_FOGCOLOR);
break;
case GE_CMD_FOG1:
if (diff)
gstate_c.DirtyUniform(DIRTY_FOGCOEF);
gstate_c.Dirty(DIRTY_FOGCOEF);
break;
case GE_CMD_FOG2:
if (diff)
gstate_c.DirtyUniform(DIRTY_FOGCOEF);
gstate_c.Dirty(DIRTY_FOGCOEF);
break;
case GE_CMD_FOGENABLE:
@ -1254,29 +1254,29 @@ void GPU_DX9::Execute_Generic(u32 op, u32 diff) {
case GE_CMD_AMBIENTCOLOR:
case GE_CMD_AMBIENTALPHA:
if (diff)
gstate_c.DirtyUniform(DIRTY_AMBIENT);
gstate_c.Dirty(DIRTY_AMBIENT);
break;
case GE_CMD_MATERIALDIFFUSE:
if (diff)
gstate_c.DirtyUniform(DIRTY_MATDIFFUSE);
gstate_c.Dirty(DIRTY_MATDIFFUSE);
break;
case GE_CMD_MATERIALEMISSIVE:
if (diff)
gstate_c.DirtyUniform(DIRTY_MATEMISSIVE);
gstate_c.Dirty(DIRTY_MATEMISSIVE);
break;
case GE_CMD_MATERIALAMBIENT:
case GE_CMD_MATERIALALPHA:
if (diff)
gstate_c.DirtyUniform(DIRTY_MATAMBIENTALPHA);
gstate_c.Dirty(DIRTY_MATAMBIENTALPHA);
break;
case GE_CMD_MATERIALSPECULAR:
case GE_CMD_MATERIALSPECULARCOEF:
if (diff)
gstate_c.DirtyUniform(DIRTY_MATSPECULAR);
gstate_c.Dirty(DIRTY_MATSPECULAR);
break;
case GE_CMD_LIGHTTYPE0:
@ -1293,7 +1293,7 @@ void GPU_DX9::Execute_Generic(u32 op, u32 diff) {
case GE_CMD_LDC0:
case GE_CMD_LSC0:
if (diff)
gstate_c.DirtyUniform(DIRTY_LIGHT0);
gstate_c.Dirty(DIRTY_LIGHT0);
break;
case GE_CMD_LX1:case GE_CMD_LY1:case GE_CMD_LZ1:
@ -1305,7 +1305,7 @@ void GPU_DX9::Execute_Generic(u32 op, u32 diff) {
case GE_CMD_LDC1:
case GE_CMD_LSC1:
if (diff)
gstate_c.DirtyUniform(DIRTY_LIGHT1);
gstate_c.Dirty(DIRTY_LIGHT1);
break;
case GE_CMD_LX2:case GE_CMD_LY2:case GE_CMD_LZ2:
case GE_CMD_LDX2:case GE_CMD_LDY2:case GE_CMD_LDZ2:
@ -1316,7 +1316,7 @@ void GPU_DX9::Execute_Generic(u32 op, u32 diff) {
case GE_CMD_LDC2:
case GE_CMD_LSC2:
if (diff)
gstate_c.DirtyUniform(DIRTY_LIGHT2);
gstate_c.Dirty(DIRTY_LIGHT2);
break;
case GE_CMD_LX3:case GE_CMD_LY3:case GE_CMD_LZ3:
case GE_CMD_LDX3:case GE_CMD_LDY3:case GE_CMD_LDZ3:
@ -1327,7 +1327,7 @@ void GPU_DX9::Execute_Generic(u32 op, u32 diff) {
case GE_CMD_LDC3:
case GE_CMD_LSC3:
if (diff)
gstate_c.DirtyUniform(DIRTY_LIGHT3);
gstate_c.Dirty(DIRTY_LIGHT3);
break;
case GE_CMD_VIEWPORTXSCALE:
@ -1381,7 +1381,7 @@ void GPU_DX9::Execute_Generic(u32 op, u32 diff) {
case GE_CMD_COLORTEST:
case GE_CMD_COLORTESTMASK:
if (diff)
gstate_c.DirtyUniform(DIRTY_ALPHACOLORMASK);
gstate_c.Dirty(DIRTY_ALPHACOLORMASK);
break;
case GE_CMD_ALPHATEST:
@ -1390,12 +1390,12 @@ void GPU_DX9::Execute_Generic(u32 op, u32 diff) {
// Intentional fallthrough.
case GE_CMD_COLORREF:
if (diff)
gstate_c.DirtyUniform(DIRTY_ALPHACOLORREF);
gstate_c.Dirty(DIRTY_ALPHACOLORREF);
break;
case GE_CMD_TEXENVCOLOR:
if (diff)
gstate_c.DirtyUniform(DIRTY_TEXENV);
gstate_c.Dirty(DIRTY_TEXENV);
break;
case GE_CMD_TEXFUNC:
@ -1599,7 +1599,7 @@ void GPU_DX9::DoState(PointerWrap &p) {
textureCacheDX9_->Clear(true);
drawEngine_.ClearTrackedVertexArrays();
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
framebufferManagerDX9_->DestroyAllFBOs(true);
shaderManagerDX9_->ClearCache(true);
}

View File

@ -522,7 +522,7 @@ void ShaderManagerDX9::Clear() {
}
fsCache_.clear();
vsCache_.clear();
gstate_c.DirtyUniform(DIRTY_ALL_UNIFORMS);
gstate_c.Dirty(DIRTY_ALL_UNIFORMS);
lastFSID_.clear();
lastVSID_.clear();
DirtyShader();
@ -539,7 +539,7 @@ void ShaderManagerDX9::DirtyShader() {
lastVSID_.clear();
lastVShader_ = nullptr;
lastPShader_ = nullptr;
gstate_c.DirtyUniform(DIRTY_ALL_UNIFORMS);
gstate_c.Dirty(DIRTY_ALL_UNIFORMS);
}
void ShaderManagerDX9::DirtyLastShader() { // disables vertex arrays

View File

@ -111,7 +111,7 @@ bool DrawEngineDX9::ApplyShaderBlending() {
fboTexNeedBind_ = true;
gstate_c.DirtyUniform(DIRTY_SHADERBLEND);
gstate_c.Dirty(DIRTY_SHADERBLEND);
return true;
}
@ -125,14 +125,13 @@ inline void DrawEngineDX9::ResetShaderBlending() {
void DrawEngineDX9::ApplyDrawState(int prim) {
// TODO: All this setup is soon so expensive that we'll need dirty flags, or simply do it in the command writes where we detect dirty by xoring. Silly to do all this work on every drawcall.
if ((gstate_c.textureImageChanged || gstate_c.textureParamsChanged) && !gstate.isModeClear() && gstate.isTextureMapEnabled()) {
if (gstate_c.IsDirty(DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS) && !gstate.isModeClear() && gstate.isTextureMapEnabled()) {
textureCache_->SetTexture();
gstate_c.textureImageChanged = false;
gstate_c.textureParamsChanged = false;
gstate_c.Clean(DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS);
if (gstate_c.needShaderTexClamp) {
// We will rarely need to set this, so let's do it every time on use rather than in runloop.
// Most of the time non-framebuffer textures will be used which can be clamped themselves.
gstate_c.DirtyUniform(DIRTY_TEXCLAMP);
gstate_c.Dirty(DIRTY_TEXCLAMP);
}
}
@ -175,7 +174,7 @@ void DrawEngineDX9::ApplyDrawState(int prim) {
dxBlendFactorLookup[(size_t)blendState.srcColor], dxBlendFactorLookup[(size_t)blendState.dstColor],
dxBlendFactorLookup[(size_t)blendState.srcAlpha], dxBlendFactorLookup[(size_t)blendState.dstAlpha]);
if (blendState.dirtyShaderBlend) {
gstate_c.DirtyUniform(DIRTY_SHADERBLEND);
gstate_c.Dirty(DIRTY_SHADERBLEND);
}
if (blendState.useBlendColor) {
dxstate.blendColor.setDWORD(blendState.blendColor);
@ -298,10 +297,10 @@ void DrawEngineDX9::ApplyDrawState(int prim) {
dxstate.viewport.set(vpAndScissor.viewportX, vpAndScissor.viewportY, vpAndScissor.viewportW, vpAndScissor.viewportH, depthMin, depthMax);
if (vpAndScissor.dirtyProj) {
gstate_c.DirtyUniform(DIRTY_PROJMATRIX);
gstate_c.Dirty(DIRTY_PROJMATRIX);
}
if (vpAndScissor.dirtyDepth) {
gstate_c.DirtyUniform(DIRTY_DEPTHRANGE);
gstate_c.Dirty(DIRTY_DEPTHRANGE);
}
}

View File

@ -127,7 +127,7 @@ void TextureCacheDX9::DeleteTexture(TexCache::iterator it) {
void TextureCacheDX9::ForgetLastTexture() {
lastBoundTexture = INVALID_TEX;
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
// Removes old textures.
@ -931,7 +931,7 @@ void TextureCacheDX9::SetTexture(bool force) {
// Always rehash in this case, if one changed the rest all probably did.
rehash = true;
entry->status &= ~TexCacheEntry::STATUS_CLUT_RECHECK;
} else if (!gstate_c.textureImageChanged) {
} else if (!gstate_c.IsDirty(DIRTY_TEXTURE_IMAGE)) {
// Okay, just some parameter change - the data didn't change, no need to rehash.
rehash = false;
}

View File

@ -337,7 +337,7 @@ void DrawEngineGLES::SubmitPrim(void *verts, void *inds, GEPrimitiveType prim, i
if (prim == GE_PRIM_RECTANGLES && (gstate.getTextureAddress(0) & 0x3FFFFFFF) == (gstate.getFrameBufAddress() & 0x3FFFFFFF)) {
// Rendertarget == texture?
if (!g_Config.bDisableSlowFramebufEffects) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
Flush();
}
}

View File

@ -647,7 +647,7 @@ void FramebufferManagerGLES::NotifyRenderFramebufferCreated(VirtualFramebuffer *
// ugly...
if ((gstate_c.curRTWidth != vfb->width || gstate_c.curRTHeight != vfb->height) && shaderManager_) {
gstate_c.DirtyUniform(DIRTY_PROJTHROUGHMATRIX);
gstate_c.Dirty(DIRTY_PROJTHROUGHMATRIX);
}
}
@ -710,7 +710,7 @@ void FramebufferManagerGLES::NotifyRenderFramebufferSwitched(VirtualFramebuffer
// ugly...
if ((gstate_c.curRTWidth != vfb->width || gstate_c.curRTHeight != vfb->height) && shaderManager_) {
gstate_c.DirtyUniform(DIRTY_PROJTHROUGHMATRIX);
gstate_c.Dirty(DIRTY_PROJTHROUGHMATRIX);
}
}
@ -724,7 +724,7 @@ void FramebufferManagerGLES::NotifyRenderFramebufferUpdated(VirtualFramebuffer *
// ugly...
if ((gstate_c.curRTWidth != vfb->width || gstate_c.curRTHeight != vfb->height) && shaderManager_) {
gstate_c.DirtyUniform(DIRTY_PROJTHROUGHMATRIX);
gstate_c.Dirty(DIRTY_PROJTHROUGHMATRIX);
}
}

View File

@ -768,7 +768,7 @@ void GPU_GLES::BeginFrameInternal() {
shaderManagerGL_->DirtyShader();
// Not sure if this is really needed.
gstate_c.DirtyUniform(DIRTY_ALL_UNIFORMS);
gstate_c.Dirty(DIRTY_ALL_UNIFORMS);
framebufferManagerGL_->BeginFrame();
}
@ -832,7 +832,7 @@ void GPU_GLES::CopyDisplayToOutputInternal() {
#endif
// Wait, why?
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
}
// Maybe should write this in ASM...
@ -966,7 +966,7 @@ void GPU_GLES::Execute_Prim(u32 op, u32 diff) {
void GPU_GLES::Execute_VertexType(u32 op, u32 diff) {
if (diff & (GE_VTYPE_TC_MASK | GE_VTYPE_THROUGH_MASK)) {
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
}
@ -978,11 +978,11 @@ void GPU_GLES::Execute_VertexTypeSkinning(u32 op, u32 diff) {
Flush();
gstate.vertType ^= diff;
if (diff & (GE_VTYPE_TC_MASK | GE_VTYPE_THROUGH_MASK))
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
// In this case, we may be doing weights and morphs.
// Update any bone matrix uniforms so it uses them correctly.
if ((op & GE_VTYPE_MORPHCOUNT_MASK) != 0) {
gstate_c.DirtyUniform(gstate_c.deferredVertTypeDirty);
gstate_c.Dirty(gstate_c.deferredVertTypeDirty);
gstate_c.deferredVertTypeDirty = 0;
}
}
@ -1027,7 +1027,7 @@ void GPU_GLES::Execute_Bezier(u32 op, u32 diff) {
if (g_Config.bHardwareTessellation && g_Config.bHardwareTransform && !g_Config.bSoftwareRendering) {
gstate_c.bezier = true;
if (gstate_c.bezier_count_u != bz_ucount) {
gstate_c.DirtyUniform(DIRTY_BEZIERCOUNTU);
gstate_c.Dirty(DIRTY_BEZIERCOUNTU);
gstate_c.bezier_count_u = bz_ucount;
}
}
@ -1084,19 +1084,19 @@ void GPU_GLES::Execute_Spline(u32 op, u32 diff) {
if (g_Config.bHardwareTessellation && g_Config.bHardwareTransform && !g_Config.bSoftwareRendering) {
gstate_c.spline = true;
if (gstate_c.spline_count_u != sp_ucount) {
gstate_c.DirtyUniform(DIRTY_SPLINECOUNTU);
gstate_c.Dirty(DIRTY_SPLINECOUNTU);
gstate_c.spline_count_u = sp_ucount;
}
if (gstate_c.spline_count_v != sp_vcount) {
gstate_c.DirtyUniform(DIRTY_SPLINECOUNTV);
gstate_c.Dirty(DIRTY_SPLINECOUNTV);
gstate_c.spline_count_v = sp_vcount;
}
if (gstate_c.spline_type_u != sp_utype) {
gstate_c.DirtyUniform(DIRTY_SPLINETYPEU);
gstate_c.Dirty(DIRTY_SPLINETYPEU);
gstate_c.spline_type_u = sp_utype;
}
if (gstate_c.spline_type_v != sp_vtype) {
gstate_c.DirtyUniform(DIRTY_SPLINETYPEV);
gstate_c.Dirty(DIRTY_SPLINETYPEV);
gstate_c.spline_type_v = sp_vtype;
}
}
@ -1113,97 +1113,97 @@ void GPU_GLES::Execute_Spline(u32 op, u32 diff) {
void GPU_GLES::Execute_Region(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_FRAMEBUF);
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_GLES::Execute_Scissor(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_FRAMEBUF);
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_GLES::Execute_FramebufType(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_FRAMEBUF);
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_GLES::Execute_ViewportType(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_FRAMEBUF);
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_GLES::Execute_ViewportZType(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_FRAMEBUF);
gstate_c.textureParamsChanged = true;
gstate_c.DirtyUniform(DIRTY_DEPTHRANGE);
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
gstate_c.Dirty(DIRTY_DEPTHRANGE);
}
void GPU_GLES::Execute_TexScaleU(u32 op, u32 diff) {
gstate_c.uv.uScale = getFloat24(op);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_GLES::Execute_TexScaleV(u32 op, u32 diff) {
gstate_c.uv.vScale = getFloat24(op);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_GLES::Execute_TexOffsetU(u32 op, u32 diff) {
gstate_c.uv.uOff = getFloat24(op);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_GLES::Execute_TexOffsetV(u32 op, u32 diff) {
gstate_c.uv.vOff = getFloat24(op);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_GLES::Execute_TexAddr0(u32 op, u32 diff) {
gstate_c.textureImageChanged = true;
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_GLES::Execute_TexAddrN(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_GLES::Execute_TexBufw0(u32 op, u32 diff) {
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
}
void GPU_GLES::Execute_TexBufwN(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_GLES::Execute_TexSize0(u32 op, u32 diff) {
// Render to texture may have overridden the width/height.
// Don't reset it unless the size is different / the texture has changed.
if (diff || (gstate_c.textureImageChanged || gstate_c.textureParamsChanged)) {
if (diff || gstate_c.IsDirty(DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS)) {
gstate_c.curTextureWidth = gstate.getTextureWidth(0);
gstate_c.curTextureHeight = gstate.getTextureHeight(0);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
// We will need to reset the texture now.
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
}
void GPU_GLES::Execute_TexSizeN(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_GLES::Execute_TexFormat(u32 op, u32 diff) {
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
}
void GPU_GLES::Execute_TexMapMode(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_GLES::Execute_TexParamType(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_GLES::Execute_TexEnvColor(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_TEXENV);
gstate_c.Dirty(DIRTY_TEXENV);
}
void GPU_GLES::Execute_TexLevel(u32 op, u32 diff) {
@ -1216,77 +1216,76 @@ void GPU_GLES::Execute_TexLevel(u32 op, u32 diff) {
gstate.texlevel ^= diff;
}
*/
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_GLES::Execute_LoadClut(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
textureCacheGL_->LoadClut(gstate.getClutAddress(), gstate.getClutLoadBytes());
}
void GPU_GLES::Execute_ClutFormat(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_GLES::Execute_Ambient(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_AMBIENT);
gstate_c.Dirty(DIRTY_AMBIENT);
}
void GPU_GLES::Execute_MaterialDiffuse(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_MATDIFFUSE);
gstate_c.Dirty(DIRTY_MATDIFFUSE);
}
void GPU_GLES::Execute_MaterialEmissive(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_MATEMISSIVE);
gstate_c.Dirty(DIRTY_MATEMISSIVE);
}
void GPU_GLES::Execute_MaterialAmbient(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_MATAMBIENTALPHA);
gstate_c.Dirty(DIRTY_MATAMBIENTALPHA);
}
void GPU_GLES::Execute_MaterialSpecular(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_MATSPECULAR);
gstate_c.Dirty(DIRTY_MATSPECULAR);
}
void GPU_GLES::Execute_Light0Param(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_LIGHT0);
gstate_c.Dirty(DIRTY_LIGHT0);
}
void GPU_GLES::Execute_Light1Param(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_LIGHT1);
gstate_c.Dirty(DIRTY_LIGHT1);
}
void GPU_GLES::Execute_Light2Param(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_LIGHT2);
gstate_c.Dirty(DIRTY_LIGHT2);
}
void GPU_GLES::Execute_Light3Param(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_LIGHT3);
gstate_c.Dirty(DIRTY_LIGHT3);
}
void GPU_GLES::Execute_FogColor(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_FOGCOLOR);
gstate_c.Dirty(DIRTY_FOGCOLOR);
}
void GPU_GLES::Execute_FogCoef(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_FOGCOEF);
gstate_c.Dirty(DIRTY_FOGCOEF);
}
void GPU_GLES::Execute_ColorTestMask(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_ALPHACOLORMASK);
gstate_c.Dirty(DIRTY_ALPHACOLORMASK);
}
void GPU_GLES::Execute_AlphaTest(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_ALPHACOLORREF);
gstate_c.DirtyUniform(DIRTY_ALPHACOLORMASK);
gstate_c.Dirty(DIRTY_ALPHACOLORREF | DIRTY_ALPHACOLORMASK);
}
void GPU_GLES::Execute_StencilTest(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_STENCILREPLACEVALUE);
gstate_c.Dirty(DIRTY_STENCILREPLACEVALUE);
}
void GPU_GLES::Execute_ColorRef(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_ALPHACOLORREF);
gstate_c.Dirty(DIRTY_ALPHACOLORREF);
}
void GPU_GLES::Execute_Generic(u32 op, u32 diff) {
@ -1884,7 +1883,7 @@ void GPU_GLES::DoState(PointerWrap &p) {
depalShaderCache_.Clear();
drawEngine_.ClearTrackedVertexArrays();
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
framebufferManagerGL_->DestroyAllFBOs(true);
shaderManagerGL_->ClearCache(true);
}

View File

@ -772,7 +772,7 @@ void ShaderManagerGLES::Clear() {
linkedShaderCache_.clear();
fsCache_.clear();
vsCache_.clear();
gstate_c.DirtyUniform(DIRTY_ALL_UNIFORMS);
gstate_c.Dirty(DIRTY_ALL_UNIFORMS);
lastFSID_.set_invalid();
lastVSID_.set_invalid();
DirtyShader();
@ -788,7 +788,7 @@ void ShaderManagerGLES::DirtyShader() {
lastFSID_.set_invalid();
lastVSID_.set_invalid();
DirtyLastShader();
gstate_c.DirtyUniform(DIRTY_ALL_UNIFORMS);
gstate_c.Dirty(DIRTY_ALL_UNIFORMS);
shaderSwitchDirty_ = 0;
}

View File

@ -144,7 +144,7 @@ bool DrawEngineGLES::ApplyShaderBlending() {
fboTexNeedBind_ = true;
gstate_c.DirtyUniform(DIRTY_SHADERBLEND);
gstate_c.Dirty(DIRTY_SHADERBLEND);
return true;
}
@ -159,14 +159,13 @@ inline void DrawEngineGLES::ResetShaderBlending() {
// TODO: All this setup is so expensive that we'll need dirty flags, or simply do it in the command writes where we detect dirty by xoring. Silly to do all this work on every drawcall.
void DrawEngineGLES::ApplyDrawState(int prim) {
if ((gstate_c.textureImageChanged || gstate_c.textureParamsChanged) && !gstate.isModeClear() && gstate.isTextureMapEnabled()) {
if (gstate_c.IsDirty(DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS) && !gstate.isModeClear() && gstate.isTextureMapEnabled()) {
textureCache_->SetTexture();
gstate_c.textureImageChanged = false;
gstate_c.textureParamsChanged = false;
gstate_c.Clean(DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS);
if (gstate_c.needShaderTexClamp) {
// We will rarely need to set this, so let's do it every time on use rather than in runloop.
// Most of the time non-framebuffer textures will be used which can be clamped themselves.
gstate_c.DirtyUniform(DIRTY_TEXCLAMP);
gstate_c.Dirty(DIRTY_TEXCLAMP);
}
}
@ -201,7 +200,7 @@ void DrawEngineGLES::ApplyDrawState(int prim) {
glBlendFactorLookup[(size_t)blendState.srcColor], glBlendFactorLookup[(size_t)blendState.dstColor],
glBlendFactorLookup[(size_t)blendState.srcAlpha], glBlendFactorLookup[(size_t)blendState.dstAlpha]);
if (blendState.dirtyShaderBlend) {
gstate_c.DirtyUniform(DIRTY_SHADERBLEND);
gstate_c.Dirty(DIRTY_SHADERBLEND);
}
if (blendState.useBlendColor) {
uint32_t color = blendState.blendColor;
@ -368,10 +367,10 @@ void DrawEngineGLES::ApplyDrawState(int prim) {
glstate.depthRange.set(vpAndScissor.depthRangeMin, vpAndScissor.depthRangeMax);
if (vpAndScissor.dirtyProj) {
gstate_c.DirtyUniform(DIRTY_PROJMATRIX);
gstate_c.Dirty(DIRTY_PROJMATRIX);
}
if (vpAndScissor.dirtyDepth) {
gstate_c.DirtyUniform(DIRTY_DEPTHRANGE);
gstate_c.Dirty(DIRTY_DEPTHRANGE);
}
}

View File

@ -1034,7 +1034,7 @@ void TextureCacheGLES::SetTexture(bool force) {
// Always rehash in this case, if one changed the rest all probably did.
rehash = true;
entry->status &= ~TexCacheEntry::STATUS_CLUT_RECHECK;
} else if (!gstate_c.textureImageChanged) {
} else if (!gstate_c.IsDirty(DIRTY_TEXTURE_IMAGE)) {
// Okay, just some parameter change - the data didn't change, no need to rehash.
rehash = false;
}

View File

@ -75,7 +75,7 @@ public:
void ForgetLastTexture() {
lastBoundTexture = -1;
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
u32 AllocTextureName();

View File

@ -787,8 +787,8 @@ void GPUCommon::ProcessDLQueueInternal() {
UpdateTickEstimate(std::max(busyTicks, startingTicks + cyclesExecuted));
// Game might've written new texture data.
gstate_c.textureImageChanged = true;
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
// Seems to be correct behaviour to process the list anyway?
if (startingTicks < busyTicks) {
@ -1194,7 +1194,7 @@ void GPUCommon::Execute_BlockTransferStart(u32 op, u32 diff) {
DoBlockTransfer(gstate_c.skipDrawReason);
// Fixes Gran Turismo's funky text issue, since it overwrites the current texture.
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
}
void GPUCommon::Execute_WorldMtxNum(u32 op, u32 diff) {
@ -1209,7 +1209,7 @@ void GPUCommon::Execute_WorldMtxNum(u32 op, u32 diff) {
if (dst[i] != newVal) {
Flush();
dst[i] = newVal;
gstate_c.DirtyUniform(DIRTY_WORLDMATRIX);
gstate_c.Dirty(DIRTY_WORLDMATRIX);
}
if (++i >= end) {
break;
@ -1231,7 +1231,7 @@ void GPUCommon::Execute_WorldMtxData(u32 op, u32 diff) {
if (num < 12 && newVal != ((const u32 *)gstate.worldMatrix)[num]) {
Flush();
((u32 *)gstate.worldMatrix)[num] = newVal;
gstate_c.DirtyUniform(DIRTY_WORLDMATRIX);
gstate_c.Dirty(DIRTY_WORLDMATRIX);
}
num++;
gstate.worldmtxnum = (GE_CMD_WORLDMATRIXNUMBER << 24) | (num & 0xF);
@ -1249,7 +1249,7 @@ void GPUCommon::Execute_ViewMtxNum(u32 op, u32 diff) {
if (dst[i] != newVal) {
Flush();
dst[i] = newVal;
gstate_c.DirtyUniform(DIRTY_VIEWMATRIX);
gstate_c.Dirty(DIRTY_VIEWMATRIX);
}
if (++i >= end) {
break;
@ -1271,7 +1271,7 @@ void GPUCommon::Execute_ViewMtxData(u32 op, u32 diff) {
if (num < 12 && newVal != ((const u32 *)gstate.viewMatrix)[num]) {
Flush();
((u32 *)gstate.viewMatrix)[num] = newVal;
gstate_c.DirtyUniform(DIRTY_VIEWMATRIX);
gstate_c.Dirty(DIRTY_VIEWMATRIX);
}
num++;
gstate.viewmtxnum = (GE_CMD_VIEWMATRIXNUMBER << 24) | (num & 0xF);
@ -1289,7 +1289,7 @@ void GPUCommon::Execute_ProjMtxNum(u32 op, u32 diff) {
if (dst[i] != newVal) {
Flush();
dst[i] = newVal;
gstate_c.DirtyUniform(DIRTY_PROJMATRIX);
gstate_c.Dirty(DIRTY_PROJMATRIX);
}
if (++i >= end) {
break;
@ -1311,7 +1311,7 @@ void GPUCommon::Execute_ProjMtxData(u32 op, u32 diff) {
if (newVal != ((const u32 *)gstate.projMatrix)[num]) {
Flush();
((u32 *)gstate.projMatrix)[num] = newVal;
gstate_c.DirtyUniform(DIRTY_PROJMATRIX);
gstate_c.Dirty(DIRTY_PROJMATRIX);
}
num++;
gstate.projmtxnum = (GE_CMD_PROJMATRIXNUMBER << 24) | (num & 0xF);
@ -1329,7 +1329,7 @@ void GPUCommon::Execute_TgenMtxNum(u32 op, u32 diff) {
if (dst[i] != newVal) {
Flush();
dst[i] = newVal;
gstate_c.DirtyUniform(DIRTY_TEXMATRIX);
gstate_c.Dirty(DIRTY_TEXMATRIX);
}
if (++i >= end) {
break;
@ -1351,7 +1351,7 @@ void GPUCommon::Execute_TgenMtxData(u32 op, u32 diff) {
if (num < 12 && newVal != ((const u32 *)gstate.tgenMatrix)[num]) {
Flush();
((u32 *)gstate.tgenMatrix)[num] = newVal;
gstate_c.DirtyUniform(DIRTY_TEXMATRIX);
gstate_c.Dirty(DIRTY_TEXMATRIX);
}
num++;
gstate.texmtxnum = (GE_CMD_TGENMATRIXNUMBER << 24) | (num & 0xF);
@ -1379,7 +1379,7 @@ void GPUCommon::Execute_BoneMtxNum(u32 op, u32 diff) {
const int numPlusCount = (op & 0x7F) + i;
for (int num = op & 0x7F; num < numPlusCount; num += 12) {
gstate_c.DirtyUniform(DIRTY_BONEMATRIX0 << (num / 12));
gstate_c.Dirty(DIRTY_BONEMATRIX0 << (num / 12));
}
} else {
while ((src[i] >> 24) == GE_CMD_BONEMATRIXDATA) {
@ -1411,7 +1411,7 @@ void GPUCommon::Execute_BoneMtxData(u32 op, u32 diff) {
// Bone matrices should NOT flush when software skinning is enabled!
if (!g_Config.bSoftwareSkinning || (gstate.vertType & GE_VTYPE_MORPHCOUNT_MASK) != 0) {
Flush();
gstate_c.DirtyUniform(DIRTY_BONEMATRIX0 << (num / 12));
gstate_c.Dirty(DIRTY_BONEMATRIX0 << (num / 12));
} else {
gstate_c.deferredVertTypeDirty |= DIRTY_BONEMATRIX0 << (num / 12);
}
@ -1478,7 +1478,7 @@ void GPUCommon::FastLoadBoneMatrix(u32 target) {
if (!g_Config.bSoftwareSkinning || (gstate.vertType & GE_VTYPE_MORPHCOUNT_MASK) != 0) {
Flush();
gstate_c.DirtyUniform(uniformsToDirty);
gstate_c.Dirty(uniformsToDirty);
} else {
gstate_c.deferredVertTypeDirty |= uniformsToDirty;
}

View File

@ -216,8 +216,7 @@ void GPUStateCache::DoState(PointerWrap &p) {
vertexAddr = old.vertexAddr;
indexAddr = old.indexAddr;
offsetAddr = old.offsetAddr;
textureImageChanged = true;
textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS);
textureFullAlpha = old.textureFullAlpha;
vertexFullAlpha = old.vertexFullAlpha;
skipDrawReason = old.skipDrawReason;
@ -227,10 +226,9 @@ void GPUStateCache::DoState(PointerWrap &p) {
p.Do(indexAddr);
p.Do(offsetAddr);
int textureChanged = 0;
uint8_t textureChanged = 0;
p.Do(textureChanged); // legacy
textureImageChanged = true;
textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS);
p.Do(textureFullAlpha);
p.Do(vertexFullAlpha);
bool framebufChanged = false; // legacy

View File

@ -483,9 +483,6 @@ struct KnownVertexBounds {
struct GPUStateCache {
bool Supports(int flag) { return (featureFlags & flag) != 0; }
uint64_t GetDirtyUniforms() { return dirty & DIRTY_ALL_UNIFORMS; }
void DirtyUniform(u64 what) {
dirty |= what;
}
void Dirty(u64 what) {
dirty |= what;
}
@ -507,9 +504,6 @@ struct GPUStateCache {
uint64_t dirty;
bool textureImageChanged;
bool textureParamsChanged;
bool textureFullAlpha;
bool textureSimpleAlpha;
bool vertexFullAlpha;
@ -518,14 +512,6 @@ struct GPUStateCache {
UVScale uv;
bool bezier;
bool spline;
int bezier_count_u;
int spline_count_u;
int spline_count_v;
int spline_type_u;
int spline_type_v;
bool bgraTexture;
bool needShaderTexClamp;
bool allowShaderBlend;
@ -559,6 +545,14 @@ struct GPUStateCache {
u32 curRTRenderHeight;
u32 curRTOffsetX;
bool bezier;
bool spline;
int bezier_count_u;
int spline_count_u;
int spline_count_v;
int spline_type_u;
int spline_type_v;
u32 getRelativeAddress(u32 data) const;
void Reset();
void DoState(PointerWrap &p);

View File

@ -214,7 +214,7 @@ void NullGPU::ExecuteOp(u32 op, u32 diff) {
break;
case GE_CMD_TEXADDR0:
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
case GE_CMD_TEXADDR1:
case GE_CMD_TEXADDR2:
case GE_CMD_TEXADDR3:
@ -226,7 +226,7 @@ void NullGPU::ExecuteOp(u32 op, u32 diff) {
break;
case GE_CMD_TEXBUFWIDTH0:
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
case GE_CMD_TEXBUFWIDTH1:
case GE_CMD_TEXBUFWIDTH2:
case GE_CMD_TEXBUFWIDTH3:
@ -342,7 +342,7 @@ void NullGPU::ExecuteOp(u32 op, u32 diff) {
}
case GE_CMD_TEXSIZE0:
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
gstate_c.curTextureWidth = 1 << (gstate.texsize[0] & 0xf);
gstate_c.curTextureHeight = 1 << ((gstate.texsize[0]>>8) & 0xf);
//fall thru - ignoring the mipmap sizes for now

View File

@ -361,7 +361,7 @@ void DrawEngineVulkan::SubmitPrim(void *verts, void *inds, GEPrimitiveType prim,
if (prim == GE_PRIM_RECTANGLES && (gstate.getTextureAddress(0) & 0x3FFFFFFF) == (gstate.getFrameBufAddress() & 0x3FFFFFFF)) {
// Rendertarget == texture?
if (!g_Config.bDisableSlowFramebufEffects) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
Flush(cmd_);
}
}
@ -600,7 +600,7 @@ void DrawEngineVulkan::DirtyAllUBOs() {
dirtyUniforms_ = DIRTY_BASE_UNIFORMS | DIRTY_LIGHT_UNIFORMS | DIRTY_BONE_UNIFORMS;
imageView = VK_NULL_HANDLE;
sampler = VK_NULL_HANDLE;
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
}
//void DrawEngineVulkan::ApplyDrawStateLate() {
@ -630,15 +630,14 @@ void DrawEngineVulkan::DoFlush(VkCommandBuffer cmd) {
FrameData *frame = &frame_[curFrame_ & 1];
bool textureNeedsApply = false;
if ((gstate_c.textureImageChanged || gstate_c.textureParamsChanged) && !gstate.isModeClear() && gstate.isTextureMapEnabled()) {
if (gstate_c.IsDirty(DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS) && !gstate.isModeClear() && gstate.isTextureMapEnabled()) {
textureCache_->SetTexture();
gstate_c.Clean(DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS);
textureNeedsApply = true;
gstate_c.textureImageChanged = false;
gstate_c.textureParamsChanged = false;
if (gstate_c.needShaderTexClamp) {
// We will rarely need to set this, so let's do it every time on use rather than in runloop.
// Most of the time non-framebuffer textures will be used which can be clamped themselves.
gstate_c.DirtyUniform(DIRTY_TEXCLAMP);
gstate_c.Dirty(DIRTY_TEXCLAMP);
}
}

View File

@ -646,7 +646,7 @@ void FramebufferManagerVulkan::NotifyRenderFramebufferCreated(VirtualFramebuffer
textureCache_->NotifyFramebuffer(vfb->fb_address, vfb, NOTIFY_FB_CREATED);
// ugly...
if ((gstate_c.curRTWidth != vfb->width || gstate_c.curRTHeight != vfb->height) && shaderManager_) {
gstate_c.DirtyUniform(DIRTY_PROJMATRIX);
gstate_c.Dirty(DIRTY_PROJMATRIX);
}
}
@ -695,7 +695,7 @@ void FramebufferManagerVulkan::NotifyRenderFramebufferSwitched(VirtualFramebuffe
// ugly...
if ((gstate_c.curRTWidth != vfb->width || gstate_c.curRTHeight != vfb->height) && shaderManager_) {
gstate_c.DirtyUniform(DIRTY_PROJMATRIX);
gstate_c.Dirty(DIRTY_PROJMATRIX);
}
}
@ -709,7 +709,7 @@ void FramebufferManagerVulkan::NotifyRenderFramebufferUpdated(VirtualFramebuffer
// ugly...
if ((gstate_c.curRTWidth != vfb->width || gstate_c.curRTHeight != vfb->height) && shaderManager_) {
gstate_c.DirtyUniform(DIRTY_PROJMATRIX);
gstate_c.Dirty(DIRTY_PROJMATRIX);
}
}

View File

@ -507,7 +507,7 @@ void GPU_Vulkan::BeginHostFrame() {
framebufferManagerVulkan_->BeginFrameVulkan();
shaderManagerVulkan_->DirtyShader();
gstate_c.DirtyUniform(DIRTY_ALL);
gstate_c.Dirty(DIRTY_ALL);
if (dumpNextFrame_) {
NOTICE_LOG(G3D, "DUMPING THIS FRAME");
@ -690,7 +690,7 @@ void GPU_Vulkan::CopyDisplayToOutputInternal() {
framebufferManagerVulkan_->CopyDisplayToOutput();
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
}
// Maybe should write this in ASM...
@ -823,7 +823,7 @@ void GPU_Vulkan::Execute_Prim(u32 op, u32 diff) {
void GPU_Vulkan::Execute_VertexType(u32 op, u32 diff) {
if (diff & (GE_VTYPE_TC_MASK | GE_VTYPE_THROUGH_MASK)) {
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
}
@ -918,97 +918,96 @@ void GPU_Vulkan::Execute_Spline(u32 op, u32 diff) {
void GPU_Vulkan::Execute_Region(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_FRAMEBUF);
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_Vulkan::Execute_Scissor(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_FRAMEBUF);
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_Vulkan::Execute_FramebufType(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_FRAMEBUF);
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_Vulkan::Execute_ViewportType(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_FRAMEBUF);
gstate_c.textureParamsChanged = true; // Why?
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS); // Why?
}
void GPU_Vulkan::Execute_ViewportZType(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_FRAMEBUF);
gstate_c.textureParamsChanged = true;
gstate_c.DirtyUniform(DIRTY_DEPTHRANGE);
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
gstate_c.Dirty(DIRTY_DEPTHRANGE);
}
void GPU_Vulkan::Execute_TexScaleU(u32 op, u32 diff) {
gstate_c.uv.uScale = getFloat24(op);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_Vulkan::Execute_TexScaleV(u32 op, u32 diff) {
gstate_c.uv.vScale = getFloat24(op);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_Vulkan::Execute_TexOffsetU(u32 op, u32 diff) {
gstate_c.uv.uOff = getFloat24(op);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_Vulkan::Execute_TexOffsetV(u32 op, u32 diff) {
gstate_c.uv.vOff = getFloat24(op);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_Vulkan::Execute_TexAddr0(u32 op, u32 diff) {
gstate_c.textureImageChanged = true;
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_Vulkan::Execute_TexAddrN(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_Vulkan::Execute_TexBufw0(u32 op, u32 diff) {
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
}
void GPU_Vulkan::Execute_TexBufwN(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_Vulkan::Execute_TexSize0(u32 op, u32 diff) {
// Render to texture may have overridden the width/height.
// Don't reset it unless the size is different / the texture has changed.
if (diff || (gstate_c.textureImageChanged || gstate_c.textureParamsChanged)) {
if (diff || gstate_c.IsDirty(DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS)) {
gstate_c.curTextureWidth = gstate.getTextureWidth(0);
gstate_c.curTextureHeight = gstate.getTextureHeight(0);
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
// We will need to reset the texture now.
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_UVSCALEOFFSET | DIRTY_TEXTURE_PARAMS);
}
}
void GPU_Vulkan::Execute_TexSizeN(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_Vulkan::Execute_TexFormat(u32 op, u32 diff) {
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
}
void GPU_Vulkan::Execute_TexMapMode(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_UVSCALEOFFSET);
gstate_c.Dirty(DIRTY_UVSCALEOFFSET);
}
void GPU_Vulkan::Execute_TexParamType(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_Vulkan::Execute_TexEnvColor(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_TEXENV);
gstate_c.Dirty(DIRTY_TEXENV);
}
void GPU_Vulkan::Execute_TexLevel(u32 op, u32 diff) {
@ -1021,77 +1020,76 @@ void GPU_Vulkan::Execute_TexLevel(u32 op, u32 diff) {
gstate.texlevel ^= diff;
}
*/
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_Vulkan::Execute_LoadClut(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
textureCacheVulkan_->LoadClut(gstate.getClutAddress(), gstate.getClutLoadBytes());
}
void GPU_Vulkan::Execute_ClutFormat(u32 op, u32 diff) {
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void GPU_Vulkan::Execute_Ambient(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_AMBIENT);
gstate_c.Dirty(DIRTY_AMBIENT);
}
void GPU_Vulkan::Execute_MaterialDiffuse(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_MATDIFFUSE);
gstate_c.Dirty(DIRTY_MATDIFFUSE);
}
void GPU_Vulkan::Execute_MaterialEmissive(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_MATEMISSIVE);
gstate_c.Dirty(DIRTY_MATEMISSIVE);
}
void GPU_Vulkan::Execute_MaterialAmbient(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_MATAMBIENTALPHA);
gstate_c.Dirty(DIRTY_MATAMBIENTALPHA);
}
void GPU_Vulkan::Execute_MaterialSpecular(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_MATSPECULAR);
gstate_c.Dirty(DIRTY_MATSPECULAR);
}
void GPU_Vulkan::Execute_Light0Param(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_LIGHT0);
gstate_c.Dirty(DIRTY_LIGHT0);
}
void GPU_Vulkan::Execute_Light1Param(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_LIGHT1);
gstate_c.Dirty(DIRTY_LIGHT1);
}
void GPU_Vulkan::Execute_Light2Param(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_LIGHT2);
gstate_c.Dirty(DIRTY_LIGHT2);
}
void GPU_Vulkan::Execute_Light3Param(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_LIGHT3);
gstate_c.Dirty(DIRTY_LIGHT3);
}
void GPU_Vulkan::Execute_FogColor(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_FOGCOLOR);
gstate_c.Dirty(DIRTY_FOGCOLOR);
}
void GPU_Vulkan::Execute_FogCoef(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_FOGCOEF);
gstate_c.Dirty(DIRTY_FOGCOEF);
}
void GPU_Vulkan::Execute_ColorTestMask(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_ALPHACOLORMASK);
gstate_c.Dirty(DIRTY_ALPHACOLORMASK);
}
void GPU_Vulkan::Execute_AlphaTest(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_ALPHACOLORREF);
gstate_c.DirtyUniform(DIRTY_ALPHACOLORMASK);
gstate_c.Dirty(DIRTY_ALPHACOLORREF | DIRTY_ALPHACOLORMASK);
}
void GPU_Vulkan::Execute_StencilTest(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_STENCILREPLACEVALUE);
gstate_c.Dirty(DIRTY_STENCILREPLACEVALUE);
}
void GPU_Vulkan::Execute_ColorRef(u32 op, u32 diff) {
gstate_c.DirtyUniform(DIRTY_ALPHACOLORREF);
gstate_c.Dirty(DIRTY_ALPHACOLORREF);
}
void GPU_Vulkan::Execute_BoneMtxNum(u32 op, u32 diff) {
@ -1115,7 +1113,7 @@ void GPU_Vulkan::Execute_BoneMtxNum(u32 op, u32 diff) {
const int numPlusCount = (op & 0x7F) + i;
for (int num = op & 0x7F; num < numPlusCount; num += 12) {
gstate_c.DirtyUniform(DIRTY_BONEMATRIX0 << (num / 12));
gstate_c.Dirty(DIRTY_BONEMATRIX0 << (num / 12));
}
const int count = i;
@ -1133,7 +1131,7 @@ void GPU_Vulkan::Execute_BoneMtxData(u32 op, u32 diff) {
if (num < 96 && newVal != ((const u32 *)gstate.boneMatrix)[num]) {
// Bone matrices should NOT flush when software skinning is enabled!
Flush();
gstate_c.DirtyUniform(DIRTY_BONEMATRIX0 << (num / 12));
gstate_c.Dirty(DIRTY_BONEMATRIX0 << (num / 12));
((u32 *)gstate.boneMatrix)[num] = newVal;
}
num++;
@ -1679,7 +1677,7 @@ void GPU_Vulkan::FastLoadBoneMatrix(u32 target) {
uniformsToDirty |= DIRTY_BONEMATRIX0 << ((mtxNum + 1) & 7);
}
Flush();
gstate_c.DirtyUniform(uniformsToDirty);
gstate_c.Dirty(uniformsToDirty);
gstate.FastLoadBoneMatrix(target);
}
@ -1767,7 +1765,7 @@ void GPU_Vulkan::DoState(PointerWrap &p) {
textureCacheVulkan_->Clear(true);
depalShaderCache_.Clear();
gstate_c.textureImageChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
framebufferManagerVulkan_->DestroyAllFBOs(true);
shaderManagerVulkan_->ClearShaders();
pipelineManager_->Clear();

View File

@ -409,7 +409,7 @@ void ShaderManagerVulkan::Clear() {
void ShaderManagerVulkan::ClearShaders() {
Clear();
DirtyShader();
gstate_c.DirtyUniform(DIRTY_ALL_UNIFORMS);
gstate_c.Dirty(DIRTY_ALL_UNIFORMS);
}
void ShaderManagerVulkan::DirtyShader() {

View File

@ -171,7 +171,7 @@ void ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManager, ShaderManagerV
key.destColor = vkBlendFactorLookup[(size_t)blendState.dstColor];
key.destAlpha = vkBlendFactorLookup[(size_t)blendState.dstAlpha];
if (blendState.dirtyShaderBlend) {
gstate_c.DirtyUniform(DIRTY_SHADERBLEND);
gstate_c.Dirty(DIRTY_SHADERBLEND);
}
dynState.useBlendColor = blendState.useBlendColor;
if (blendState.useBlendColor) {
@ -310,7 +310,7 @@ void ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManager, ShaderManagerV
vp.minDepth = vpAndScissor.depthRangeMin;
vp.maxDepth = vpAndScissor.depthRangeMax;
if (vpAndScissor.dirtyProj) {
gstate_c.DirtyUniform(DIRTY_PROJMATRIX);
gstate_c.Dirty(DIRTY_PROJMATRIX);
}
VkRect2D &scissor = dynState.scissor;
@ -325,6 +325,6 @@ void ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManager, ShaderManagerV
if (depthMin < 0.0f) depthMin = 0.0f;
if (depthMax > 1.0f) depthMax = 1.0f;
if (vpAndScissor.dirtyDepth) {
gstate_c.DirtyUniform(DIRTY_DEPTHRANGE);
gstate_c.Dirty(DIRTY_DEPTHRANGE);
}
}

View File

@ -968,7 +968,7 @@ void TextureCacheVulkan::SetTexture() {
// Always rehash in this case, if one changed the rest all probably did.
rehash = true;
entry->status &= ~TexCacheEntry::STATUS_CLUT_RECHECK;
} else if ((gstate_c.textureChanged & TEXCHANGE_UPDATED) == 0) {
} else if (!gstate_c.IsDirty(DIRTY_TEXTURE_IMAGE)) {
// Okay, just some parameter change - the data didn't change, no need to rehash.
rehash = false;
}

View File

@ -121,7 +121,7 @@ public:
void ForgetLastTexture() {
lastBoundTexture = nullptr;
gstate_c.textureParamsChanged = true;
gstate_c.Dirty(DIRTY_TEXTURE_PARAMS);
}
void ApplyTexture(VulkanPushBuffer *uploadBuffer, VkImageView &imageView, VkSampler &sampler);