diff --git a/GPU/Common/DrawEngineCommon.cpp b/GPU/Common/DrawEngineCommon.cpp index 5ef49fb891..304e6758d0 100644 --- a/GPU/Common/DrawEngineCommon.cpp +++ b/GPU/Common/DrawEngineCommon.cpp @@ -163,47 +163,6 @@ void DrawEngineCommon::DispatchSubmitImm(GEPrimitiveType prim, TransformedVertex } } -// Gated by DIRTY_CULL_PLANES -void DrawEngineCommon::UpdatePlanes(const float viewproj[16]) { - // Next, we need to apply viewport, scissor, region, and even offset - but only for X/Y. - // Note that the PSP does not clip against the viewport. - const Vec2f baseOffset = Vec2f(gstate.getOffsetX(), gstate.getOffsetY()); - // Region1 (rate) is used as an X1/Y1 here, matching PSP behavior. - minOffset_ = baseOffset + Vec2f(std::max(gstate.getRegionRateX() - 0x100, gstate.getScissorX1()), std::max(gstate.getRegionRateY() - 0x100, gstate.getScissorY1())) - Vec2f(1.0f, 1.0f); - maxOffset_ = baseOffset + Vec2f(std::min(gstate.getRegionX2(), gstate.getScissorX2()), std::min(gstate.getRegionY2(), gstate.getScissorY2())) + Vec2f(1.0f, 1.0f); - - // Let's not handle these special cases in the fast culler. - offsetOutsideEdge_ = maxOffset_.x >= 4096.0f || minOffset_.x < 1.0f || minOffset_.y < 1.0f || maxOffset_.y >= 4096.0f; - - // Now let's apply the viewport to our scissor/region + offset range. - Vec2f inverseViewportScale = Vec2f(1.0f / gstate.getViewportXScale(), 1.0f / gstate.getViewportYScale()); - Vec2f minViewport = (minOffset_ - Vec2f(gstate.getViewportXCenter(), gstate.getViewportYCenter())) * inverseViewportScale; - Vec2f maxViewport = (maxOffset_ - Vec2f(gstate.getViewportXCenter(), gstate.getViewportYCenter())) * inverseViewportScale; - - Vec2f viewportInvSize = Vec2f(1.0f / (maxViewport.x - minViewport.x), 1.0f / (maxViewport.y - minViewport.y)); - - Lin::Matrix4x4 applyViewport{}; - // Scale to the viewport's size. - applyViewport.xx = 2.0f * viewportInvSize.x; - applyViewport.yy = 2.0f * viewportInvSize.y; - applyViewport.zz = 1.0f; - applyViewport.ww = 1.0f; - // And offset to the viewport's centers. - applyViewport.wx = -(maxViewport.x + minViewport.x) * viewportInvSize.x; - applyViewport.wy = -(maxViewport.y + minViewport.y) * viewportInvSize.y; - - float mtx[16]; - Matrix4ByMatrix4(mtx, viewproj, applyViewport.m); - // I'm sure there's some fairly optimized way to set these. If we make a version of Matrix4ByMatrix4 - // that returns a transpose, it looks like these will be more straightforward. - planes_.Set(0, mtx[3] - mtx[0], mtx[7] - mtx[4], mtx[11] - mtx[8], mtx[15] - mtx[12]); // Right - planes_.Set(1, mtx[3] + mtx[0], mtx[7] + mtx[4], mtx[11] + mtx[8], mtx[15] + mtx[12]); // Left - planes_.Set(2, mtx[3] + mtx[1], mtx[7] + mtx[5], mtx[11] + mtx[9], mtx[15] + mtx[13]); // Bottom - planes_.Set(3, mtx[3] - mtx[1], mtx[7] - mtx[5], mtx[11] - mtx[9], mtx[15] - mtx[13]); // Top - planes_.Set(4, mtx[3] + mtx[2], mtx[7] + mtx[6], mtx[11] + mtx[10], mtx[15] + mtx[14]); // Near - planes_.Set(5, mtx[3] - mtx[2], mtx[7] - mtx[6], mtx[11] - mtx[10], mtx[15] - mtx[14]); // Far -} - // This code has plenty of potential for optimization. // // It does the simplest and safest test possible: If all points of a bbox is outside a single of @@ -229,14 +188,6 @@ bool DrawEngineCommon::TestBoundingBox(const void *vdata, const void *inds, int if (gstate_c.Use(GPU_USE_VIRTUAL_REALITY)) return true; - // Due to world matrix updates per "thing", this isn't quite as effective as it could be if we did world transform - // in here as well. Though, it still does cut down on a lot of updates in Tekken 6. - if (gstate_c.IsDirty(DIRTY_CULL_PLANES)) { - UpdatePlanes(gstate_c.viewproj); - gpuStats.numPlaneUpdates++; - gstate_c.Clean(DIRTY_CULL_PLANES); - } - // Try to skip NormalizeVertices if it's pure positions. No need to bother with a vertex decoder // and a large vertex format. if ((vertType & 0xFFFFFF) == GE_VTYPE_POS_FLOAT && !inds) { @@ -301,51 +252,60 @@ bool DrawEngineCommon::TestBoundingBox(const void *vdata, const void *inds, int } } - // Pretransform the verts in-place so we don't have to do it inside the loop. - // We do this differently in the fast version below since we skip the max/minOffset checks there - // making it easier to get the whole thing ready for SIMD. + // TODO: How accurate should we be? + int insideCount[5] = {0}; for (int i = 0; i < vertexCount; i++) { - float worldpos[3]; - Vec3ByMatrix43(worldpos, &verts[i * 3], gstate.worldMatrix); - memcpy(&verts[i * 3], worldpos, 12); - } + // Complete the transform to see if the vertex should be ignored. Not sure if we need to go to these lengths... + const float *objpos = verts + i * 3; - // Note: near/far are not checked without clamp/clip enabled, so we skip those planes. - int totalPlanes = gstate.isDepthClampEnabled() ? 6 : 4; - for (int plane = 0; plane < totalPlanes; plane++) { - int inside = 0; - int out = 0; - for (int i = 0; i < vertexCount; i++) { - // Test against the frustum planes, and count. - // TODO: We should test 4 vertices at a time using SIMD. - // I guess could also test one vertex against 4 planes at a time, though a lot of waste at the common case of 6. - const float *worldpos = verts + i * 3; - float value = planes_.Test(plane, worldpos); - if (value <= -FLT_EPSILON) // Not sure why we use exactly this value. Probably '< 0' would do. - out++; - else - inside++; + float projpos[4]{}; + Vec3ByMatrix44(projpos, objpos, gstate_c.worldviewproj); + + if (projpos[2] > -projpos[3] && projpos[2] < projpos[3]) { + insideCount[4]++; } - // No vertices inside this one plane? Don't need to draw. - if (inside == 0) { - // All out - but check for X and Y if the offset was near the cullbox edge. - bool outsideEdge = false; - switch (plane) { - case 0: outsideEdge = maxOffset_.x >= 4096.0f; break; - case 1: outsideEdge = minOffset_.x < 1.0f; break; - case 2: outsideEdge = minOffset_.y < 1.0f; break; - case 3: outsideEdge = maxOffset_.y >= 4096.0f; break; - } + float invW = 1.0f / projpos[3]; + const float screenpos[3] = { + projpos[0] * gstate.getViewportXScale() * invW + gstate.getViewportXCenter(), + projpos[1] * gstate.getViewportYScale() * invW + gstate.getViewportYCenter(), + projpos[2] * gstate.getViewportZScale() * invW + gstate.getViewportZCenter(), + }; - // Only consider this outside if offset + scissor/region is fully inside the cullbox. - if (!outsideEdge) - return false; + const float drawX = screenpos[0] - gstate.getOffsetX(); + const float drawY = screenpos[1] - gstate.getOffsetY(); + + const int regionX2 = gstate.getRegionX2(); + const int regionY2 = gstate.getRegionY2(); + if (drawX > 0.0f) { + insideCount[0]++; + } + if (drawX < regionX2) { + insideCount[1]++; + } + if (drawY > 0.0f) { + insideCount[2]++; + } + if (drawY < regionY2) { + insideCount[3]++; } - - // Any out. For testing that the planes are in the right locations. - // if (out != 0) return false; } + +#if 0 + // For debugging, the exclusive check. This should make it obvious where the culling borders are in screen space. + for (int i = 0; i < ARRAY_SIZE(insideCount); i++) { + if (insideCount[i] != vertexCount) { + return false; + } + } +#endif + + for (int i = 0; i < ARRAY_SIZE(insideCount); i++) { + if (insideCount[i] == 0) { + return false; + } + } + return true; } diff --git a/GPU/Common/DrawEngineCommon.h b/GPU/Common/DrawEngineCommon.h index abf564a954..5228bc4559 100644 --- a/GPU/Common/DrawEngineCommon.h +++ b/GPU/Common/DrawEngineCommon.h @@ -169,7 +169,6 @@ public: protected: virtual bool UpdateUseHWTessellation(bool enabled) const { return enabled; } - void UpdatePlanes(const float viewproj[16]); void DecodeVerts(const VertexDecoder *dec, u8 *dest); int DecodeInds(); @@ -352,7 +351,6 @@ protected: TessellationDataTransfer *tessDataTransfer = nullptr; // Culling - Plane8 planes_{}; Vec2f minOffset_{}; Vec2f maxOffset_{}; bool offsetOutsideEdge_ = false; diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index c29fb08614..21ed7cfd7d 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -102,7 +102,7 @@ enum : uint64_t { DIRTY_VIEW_PROJ_MATRIX = 1ULL << 40, DIRTY_WORLD_VIEW_PROJ_MATRIX = 1ULL << 41, // Free non-uniform bit 42. - DIRTY_CULL_PLANES = 1ULL << 43, + // Free non-uniform bit 43. DIRTY_FRAMEBUF = 1ULL << 44, DIRTY_TEXTURE_IMAGE = 1ULL << 45, // Means that the definition of the texture image has changed (address, stride etc), and we need to look up again. DIRTY_TEXTURE_PARAMS = 1ULL << 46, diff --git a/GPU/GPU.h b/GPU/GPU.h index 6c0feccc28..107db847bd 100644 --- a/GPU/GPU.h +++ b/GPU/GPU.h @@ -90,7 +90,6 @@ struct GPUStatistics { numTextureDataBytesHashed = 0; numFlushes = 0; numBBOXJumps = 0; - numPlaneUpdates = 0; numTexturesDecoded = 0; numFramebufferEvaluations = 0; numFBOsCreated = 0; @@ -132,7 +131,6 @@ struct GPUStatistics { int numListSyncs; int numFlushes; int numBBOXJumps; - int numPlaneUpdates; int numVertsSubmitted; int numVertsDecoded; int numUncachedVertsDrawn; diff --git a/GPU/GPUCommonHW.cpp b/GPU/GPUCommonHW.cpp index dfa8b3d074..23269a8168 100644 --- a/GPU/GPUCommonHW.cpp +++ b/GPU/GPUCommonHW.cpp @@ -191,12 +191,12 @@ const CommonCommandTableEntry commonCommandTable[] = { { GE_CMD_ANTIALIASENABLE, FLAG_FLUSHBEFOREONCHANGE }, // Viewport. - { GE_CMD_OFFSETX, FLAG_FLUSHBEFOREONCHANGE, DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE | DIRTY_CULL_PLANES }, - { GE_CMD_OFFSETY, FLAG_FLUSHBEFOREONCHANGE, DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE | DIRTY_CULL_PLANES }, - { GE_CMD_VIEWPORTXSCALE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_CULLRANGE | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULL_PLANES }, - { GE_CMD_VIEWPORTYSCALE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_CULLRANGE | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULL_PLANES }, - { GE_CMD_VIEWPORTXCENTER, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_CULLRANGE | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULL_PLANES }, - { GE_CMD_VIEWPORTYCENTER, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_CULLRANGE | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULL_PLANES }, + { GE_CMD_OFFSETX, FLAG_FLUSHBEFOREONCHANGE, DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE }, + { GE_CMD_OFFSETY, FLAG_FLUSHBEFOREONCHANGE, DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE }, + { GE_CMD_VIEWPORTXSCALE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_CULLRANGE | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE }, + { GE_CMD_VIEWPORTYSCALE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_CULLRANGE | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE }, + { GE_CMD_VIEWPORTXCENTER, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_CULLRANGE | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE }, + { GE_CMD_VIEWPORTYCENTER, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_CULLRANGE | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE }, { GE_CMD_VIEWPORTZSCALE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_CULLRANGE | DIRTY_DEPTHRANGE | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE }, { GE_CMD_VIEWPORTZCENTER, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_CULLRANGE | DIRTY_DEPTHRANGE | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE }, { GE_CMD_DEPTHCLAMPENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE | DIRTY_RASTER_STATE }, @@ -206,12 +206,12 @@ const CommonCommandTableEntry commonCommandTable[] = { { GE_CMD_MAXZ, FLAG_FLUSHBEFOREONCHANGE, DIRTY_DEPTHRANGE | DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE }, // Region - { GE_CMD_REGION1, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE | DIRTY_CULL_PLANES }, - { GE_CMD_REGION2, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE | DIRTY_CULL_PLANES }, + { GE_CMD_REGION1, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE }, + { GE_CMD_REGION2, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE }, // Scissor - { GE_CMD_SCISSOR1, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE | DIRTY_CULL_PLANES }, - { GE_CMD_SCISSOR2, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE | DIRTY_CULL_PLANES }, + { GE_CMD_SCISSOR1, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE }, + { GE_CMD_SCISSOR2, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE }, // Lighting base colors { GE_CMD_AMBIENTCOLOR, FLAG_FLUSHBEFOREONCHANGE, DIRTY_AMBIENT }, @@ -1586,7 +1586,7 @@ void GPUCommonHW::Execute_ViewMtxNum(u32 op, u32 diff) { if (dst[i] != newVal) { Flush(); dst[i] = newVal; - gstate_c.Dirty(DIRTY_VIEWMATRIX | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX | DIRTY_CULL_PLANES); + gstate_c.Dirty(DIRTY_VIEWMATRIX | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); } if (++i >= end) { break; @@ -1609,7 +1609,7 @@ void GPUCommonHW::Execute_ViewMtxData(u32 op, u32 diff) { if (num < 12 && newVal != ((const u32 *)gstate.viewMatrix)[num]) { Flush(); ((u32 *)gstate.viewMatrix)[num] = newVal; - gstate_c.Dirty(DIRTY_VIEWMATRIX | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX | DIRTY_CULL_PLANES); + gstate_c.Dirty(DIRTY_VIEWMATRIX | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); } num++; gstate.viewmtxnum = (GE_CMD_VIEWMATRIXNUMBER << 24) | (num & 0x00FFFFFF); @@ -1639,7 +1639,7 @@ void GPUCommonHW::Execute_ProjMtxNum(u32 op, u32 diff) { if (dst[i] != newVal) { Flush(); dst[i] = newVal; - gstate_c.Dirty(DIRTY_PROJMATRIX | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX | DIRTY_CULL_PLANES); + gstate_c.Dirty(DIRTY_PROJMATRIX | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); } if (++i >= end) { break; @@ -1662,7 +1662,7 @@ void GPUCommonHW::Execute_ProjMtxData(u32 op, u32 diff) { if (num < 16 && newVal != ((const u32 *)gstate.projMatrix)[num]) { Flush(); ((u32 *)gstate.projMatrix)[num] = newVal; - gstate_c.Dirty(DIRTY_PROJMATRIX | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX | DIRTY_CULL_PLANES); + gstate_c.Dirty(DIRTY_PROJMATRIX | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); } num++; if (num <= 16) @@ -1822,7 +1822,7 @@ size_t GPUCommonHW::FormatGPUStatsCommon(char *buffer, size_t size) { float vertexAverageCycles = gpuStats.numVertsSubmitted > 0 ? (float)gpuStats.vertexGPUCycles / (float)gpuStats.numVertsSubmitted : 0.0f; return snprintf(buffer, size, "DL processing time: %0.2f ms, %d drawsync, %d listsync\n" - "Draw: %d (%d dec, %d culled), flushes %d, clears %d, bbox jumps %d (%d updates)\n" + "Draw: %d (%d dec, %d culled), flushes %d, clears %d, bbox jumps %d\n" "Vertices: %d dec: %d drawn: %d\n" "FBOs active: %d (evaluations: %d, created %d)\n" "Textures: %d, dec: %d, invalidated: %d, hashed: %d kB, clut %d\n" @@ -1842,7 +1842,6 @@ size_t GPUCommonHW::FormatGPUStatsCommon(char *buffer, size_t size) { gpuStats.numFlushes, gpuStats.numClears, gpuStats.numBBOXJumps, - gpuStats.numPlaneUpdates, gpuStats.numVertsSubmitted, gpuStats.numVertsDecoded, gpuStats.numUncachedVertsDrawn, diff --git a/GPU/GPUState.cpp b/GPU/GPUState.cpp index 52705a6122..b181154511 100644 --- a/GPU/GPUState.cpp +++ b/GPU/GPUState.cpp @@ -116,7 +116,7 @@ void GPUgstate::Reset() { savedContextVersion = 1; - gstate_c.Dirty(DIRTY_CULL_PLANES | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); + gstate_c.Dirty(DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); } void GPUgstate::Save(u32_le *ptr) { @@ -248,7 +248,7 @@ void GPUgstate::Restore(const u32_le *ptr) { if (gpu) gpu->ResetMatrices(); - gstate_c.Dirty(DIRTY_CULL_PLANES | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); + gstate_c.Dirty(DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); } bool vertTypeIsSkinningEnabled(u32 vertType) { @@ -359,7 +359,7 @@ void GPUStateCache::DoState(PointerWrap &p) { } if (p.GetMode() == PointerWrap::MODE_READ) - gstate_c.Dirty(DIRTY_CULL_PLANES | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); + gstate_c.Dirty(DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); } static const char *const g_gpuUseFlagNames[32] = { diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index 845271dd6d..ff0e9e7f87 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -1038,7 +1038,6 @@ void SoftGPU::Execute_FramebufFormat(u32 op, u32 diff) { } void SoftGPU::Execute_BoundingBox(u32 op, u32 diff) { - gstate_c.Dirty(DIRTY_CULL_PLANES | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); GPUCommon::Execute_BoundingBox(op, diff); } @@ -1094,7 +1093,7 @@ void SoftGPU::Execute_WorldMtxData(u32 op, u32 diff) { if (newVal != *target) { *target = newVal; dirtyFlags_ |= SoftDirty::TRANSFORM_MATRIX; - gstate_c.Dirty(DIRTY_CULL_PLANES | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); + gstate_c.Dirty(DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); } } @@ -1115,7 +1114,7 @@ void SoftGPU::Execute_ViewMtxData(u32 op, u32 diff) { if (newVal != *target) { *target = newVal; dirtyFlags_ |= SoftDirty::TRANSFORM_MATRIX; - gstate_c.Dirty(DIRTY_CULL_PLANES | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); + gstate_c.Dirty(DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); } } @@ -1136,7 +1135,7 @@ void SoftGPU::Execute_ProjMtxData(u32 op, u32 diff) { if (newVal != *target) { *target = newVal; dirtyFlags_ |= SoftDirty::TRANSFORM_MATRIX; - gstate_c.Dirty(DIRTY_CULL_PLANES | DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); + gstate_c.Dirty(DIRTY_WORLD_VIEW_PROJ_MATRIX | DIRTY_VIEW_PROJ_MATRIX); } }