diff --git a/GPU/Common/GPUStateUtils.cpp b/GPU/Common/GPUStateUtils.cpp index 2c41a70568..dd197e40e2 100644 --- a/GPU/Common/GPUStateUtils.cpp +++ b/GPU/Common/GPUStateUtils.cpp @@ -518,37 +518,9 @@ ReplaceBlendType ReplaceBlendWithShader(GEBufferFormat bufferFormat) { return REPLACE_BLEND_STANDARD; } -static const float DEPTH_SLICE_FACTOR_HIGH = 4.0f; -static const float DEPTH_SLICE_FACTOR_16BIT = 256.0f; - // The supported flag combinations. TODO: Maybe they should be distilled down into an enum. -// -// 0 - "Old"-style GL depth. -// Or "Non-accurate depth" : effectively ignore minz / maxz. Map Z values based on viewport, which clamps. -// This skews depth in many instances. Depth can be inverted in this mode if viewport says. -// This is completely wrong, but works in some cases (probably because some game devs assumed it was how it worked) -// and avoids some depth clamp issues. -// -// GPU_USE_ACCURATE_DEPTH: -// Accurate depth: Z in the framebuffer matches the range of Z used on the PSP linearly in some way. We choose -// a centered range, to simulate clamping by letting otherwise out-of-range pixels survive the 0 and 1 cutoffs. -// Clip depth based on minz/maxz, and viewport is just a means to scale and center the value, not clipping or mapping to stored values. -// -// GPU_USE_ACCURATE_DEPTH | GPU_USE_DEPTH_CLAMP: -// Variant of GPU_USE_ACCURATE_DEPTH, just the range is the nice and convenient 0-1 since we can use -// hardware depth clamp. only viable in accurate depth mode, clamps depth and therefore uses the full 0-1 range. Using the full 0-1 range is not what accurate means, it's implied by depth clamp (which also means we're clamping.) -// -// GPU_USE_ACCURATE_DEPTH | GPU_SCALE_DEPTH_FROM_24BIT_TO_16BIT: -// GPU_USE_ACCURATE_DEPTH | GPU_SCALE_DEPTH_FROM_24BIT_TO_16BIT | GPU_USE_DEPTH_CLAMP: -// Only viable in accurate depth mode, means to use a range of the 24-bit depth values available -// from the GPU to represent the 16-bit values the PSP had, to try to make everything round and -// z-fight (close to) the same way as on hardware, cheaply (cheaper than rounding depth in fragment shader). -// We automatically switch to this if Z tests for equality are used. -// Depth clamp has no effect on the depth scaling here if set, though will still be enabled -// and clamp wildly out of line values. -// -// Any other combinations of these particular flags are bogus (like for example a lonely GPU_USE_DEPTH_CLAMP). - +// Currently obsolete. We may reintroduce squeezing 24-bit depth into a 16-bit range, although that +// will mess with hardware depth clamp, so likely not worth it anymore. float DepthSliceFactor(u32 useFlags) { return 1.0f; } @@ -602,12 +574,6 @@ void ConvertViewportAndScissor(const DisplayLayoutConfig &config, bool useBuffer int curRTWidth = gstate_c.curRTWidth; int curRTHeight = gstate_c.curRTHeight; - float offsetX = gstate.getOffsetX(); - float offsetY = gstate.getOffsetY(); - - // If renderX/renderY are offset to compensate for a split framebuffer, - // applying the offset to the viewport isn't enough, since the viewport clips. - // We need to apply either directly to the vertices, or to the "through" projection matrix. out.viewportX = displayOffsetX; out.viewportY = displayOffsetY; out.viewportW = curRTWidth * renderWidthFactor; diff --git a/GPU/GPUCommonHW.cpp b/GPU/GPUCommonHW.cpp index ae040ab162..b4b2c08f24 100644 --- a/GPU/GPUCommonHW.cpp +++ b/GPU/GPUCommonHW.cpp @@ -192,14 +192,14 @@ const CommonCommandTableEntry commonCommandTable[] = { { GE_CMD_ANTIALIASENABLE, FLAG_FLUSHBEFOREONCHANGE }, // Viewport. - { GE_CMD_OFFSETX, FLAG_FLUSHBEFOREONCHANGE, DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_RASTER_OFFSET }, - { GE_CMD_OFFSETY, FLAG_FLUSHBEFOREONCHANGE, DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_RASTER_OFFSET }, - { GE_CMD_VIEWPORTXSCALE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_VIEWPORT_UNIFORMS }, - { GE_CMD_VIEWPORTYSCALE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_VIEWPORT_UNIFORMS }, - { GE_CMD_VIEWPORTXCENTER, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_VIEWPORT_UNIFORMS }, - { GE_CMD_VIEWPORTYCENTER, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_VIEWPORT_UNIFORMS }, - { GE_CMD_VIEWPORTZSCALE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_VIEWPORT_UNIFORMS }, - { GE_CMD_VIEWPORTZCENTER, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_VIEWPORT_UNIFORMS }, + { GE_CMD_OFFSETX, FLAG_FLUSHBEFOREONCHANGE, DIRTY_RASTER_OFFSET }, + { GE_CMD_OFFSETY, FLAG_FLUSHBEFOREONCHANGE, DIRTY_RASTER_OFFSET }, + { GE_CMD_VIEWPORTXSCALE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_PROJMATRIX | DIRTY_VIEWPORT_UNIFORMS | DIRTY_VIEWPORTSCISSOR_STATE }, // GetFramebufferHeuristicInputs still uses viewport scale + { GE_CMD_VIEWPORTYSCALE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_PROJMATRIX | DIRTY_VIEWPORT_UNIFORMS | DIRTY_VIEWPORTSCISSOR_STATE }, + { GE_CMD_VIEWPORTXCENTER, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_PROJMATRIX | DIRTY_VIEWPORT_UNIFORMS }, + { GE_CMD_VIEWPORTYCENTER, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_PROJMATRIX | DIRTY_VIEWPORT_UNIFORMS }, + { GE_CMD_VIEWPORTZSCALE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_PROJMATRIX | DIRTY_VIEWPORT_UNIFORMS }, + { GE_CMD_VIEWPORTZCENTER, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_PROJMATRIX | DIRTY_VIEWPORT_UNIFORMS }, // Z range and clipping { GE_CMD_DEPTHCLIPENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE | DIRTY_RASTER_STATE }, @@ -854,7 +854,7 @@ void GPUCommonHW::Execute_VertexType(u32 op, u32 diff) { if (diff & GE_VTYPE_THROUGH_MASK) { // Switching between through and non-through, we need to invalidate a bunch of stuff. - gstate_c.Dirty(DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_FRAGMENTSHADER_STATE); + gstate_c.Dirty(DIRTY_RASTER_STATE | DIRTY_VERTEXSHADER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_FRAGMENTSHADER_STATE); } } } @@ -874,8 +874,9 @@ void GPUCommonHW::Execute_VertexTypeSkinning(u32 op, u32 diff) { } gstate_c.Dirty(DIRTY_VERTEXSHADER_STATE); } + if (diff & GE_VTYPE_THROUGH_MASK) - gstate_c.Dirty(DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_FRAGMENTSHADER_STATE); + gstate_c.Dirty(DIRTY_RASTER_STATE | DIRTY_VERTEXSHADER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_FRAGMENTSHADER_STATE); } void GPUCommonHW::Execute_Prim(u32 op, u32 diff) {