diff --git a/GPU/Directx9/GPU_DX9.cpp b/GPU/Directx9/GPU_DX9.cpp index 14782aa235..2a7493458d 100644 --- a/GPU/Directx9/GPU_DX9.cpp +++ b/GPU/Directx9/GPU_DX9.cpp @@ -199,12 +199,12 @@ static const CommandTableEntry commandTable[] = { {GE_CMD_PATCHCULLENABLE, FLAG_FLUSHBEFOREONCHANGE}, // Viewport. - {GE_CMD_VIEWPORTX1, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &DIRECTX9_GPU::Execute_ViewportType}, - {GE_CMD_VIEWPORTY1, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &DIRECTX9_GPU::Execute_ViewportType}, - {GE_CMD_VIEWPORTX2, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &DIRECTX9_GPU::Execute_ViewportType}, - {GE_CMD_VIEWPORTY2, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &DIRECTX9_GPU::Execute_ViewportType}, - {GE_CMD_VIEWPORTZ1, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &DIRECTX9_GPU::Execute_ViewportType}, - {GE_CMD_VIEWPORTZ2, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &DIRECTX9_GPU::Execute_ViewportType}, + {GE_CMD_VIEWPORTXSCALE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &DIRECTX9_GPU::Execute_ViewportType}, + {GE_CMD_VIEWPORTYSCALE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &DIRECTX9_GPU::Execute_ViewportType}, + {GE_CMD_VIEWPORTZSCALE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &DIRECTX9_GPU::Execute_ViewportType}, + {GE_CMD_VIEWPORTXCENTER, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &DIRECTX9_GPU::Execute_ViewportType}, + {GE_CMD_VIEWPORTYCENTER, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &DIRECTX9_GPU::Execute_ViewportType}, + {GE_CMD_VIEWPORTZCENTER, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &DIRECTX9_GPU::Execute_ViewportType}, // Region {GE_CMD_REGION1, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &DIRECTX9_GPU::Execute_Region}, @@ -903,8 +903,8 @@ void DIRECTX9_GPU::Execute_ViewportType(u32 op, u32 diff) { gstate_c.framebufChanged = true; gstate_c.textureChanged |= TEXCHANGE_PARAMSONLY; switch (op >> 24) { - case GE_CMD_VIEWPORTZ1: - case GE_CMD_VIEWPORTZ2: + case GE_CMD_VIEWPORTZSCALE: + case GE_CMD_VIEWPORTZCENTER: shaderManager_->DirtyUniform(DIRTY_PROJMATRIX | DIRTY_DEPTHRANGE); break; } @@ -1598,12 +1598,12 @@ void DIRECTX9_GPU::Execute_Generic(u32 op, u32 diff) { shaderManager_->DirtyUniform(DIRTY_LIGHT3); break; - case GE_CMD_VIEWPORTX1: - case GE_CMD_VIEWPORTY1: - case GE_CMD_VIEWPORTX2: - case GE_CMD_VIEWPORTY2: - case GE_CMD_VIEWPORTZ1: - case GE_CMD_VIEWPORTZ2: + case GE_CMD_VIEWPORTXSCALE: + case GE_CMD_VIEWPORTYSCALE: + case GE_CMD_VIEWPORTXCENTER: + case GE_CMD_VIEWPORTYCENTER: + case GE_CMD_VIEWPORTZSCALE: + case GE_CMD_VIEWPORTZCENTER: Execute_ViewportType(op, diff); break; diff --git a/GPU/GLES/GLES_GPU.cpp b/GPU/GLES/GLES_GPU.cpp index dd5c4f75a6..d5b42eb66a 100644 --- a/GPU/GLES/GLES_GPU.cpp +++ b/GPU/GLES/GLES_GPU.cpp @@ -208,12 +208,12 @@ static const CommandTableEntry commandTable[] = { {GE_CMD_PATCHCULLENABLE, FLAG_FLUSHBEFOREONCHANGE}, // Viewport. - {GE_CMD_VIEWPORTX1, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GLES_GPU::Execute_ViewportType}, - {GE_CMD_VIEWPORTY1, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GLES_GPU::Execute_ViewportType}, - {GE_CMD_VIEWPORTX2, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GLES_GPU::Execute_ViewportType}, - {GE_CMD_VIEWPORTY2, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GLES_GPU::Execute_ViewportType}, - {GE_CMD_VIEWPORTZ1, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, DIRTY_DEPTHRANGE, &GLES_GPU::Execute_ViewportZType}, - {GE_CMD_VIEWPORTZ2, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, DIRTY_DEPTHRANGE, &GLES_GPU::Execute_ViewportZType}, + {GE_CMD_VIEWPORTXSCALE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GLES_GPU::Execute_ViewportType}, + {GE_CMD_VIEWPORTYSCALE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GLES_GPU::Execute_ViewportType}, + {GE_CMD_VIEWPORTXCENTER, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GLES_GPU::Execute_ViewportType}, + {GE_CMD_VIEWPORTYCENTER, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GLES_GPU::Execute_ViewportType}, + {GE_CMD_VIEWPORTZSCALE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, DIRTY_DEPTHRANGE, &GLES_GPU::Execute_ViewportZType}, + {GE_CMD_VIEWPORTZCENTER, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, DIRTY_DEPTHRANGE, &GLES_GPU::Execute_ViewportZType}, // Region {GE_CMD_REGION1, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GLES_GPU::Execute_Region}, @@ -1778,12 +1778,12 @@ void GLES_GPU::Execute_Generic(u32 op, u32 diff) { Execute_Light3Param(op, diff); break; - case GE_CMD_VIEWPORTX1: - case GE_CMD_VIEWPORTY1: - case GE_CMD_VIEWPORTX2: - case GE_CMD_VIEWPORTY2: - case GE_CMD_VIEWPORTZ1: - case GE_CMD_VIEWPORTZ2: + case GE_CMD_VIEWPORTXSCALE: + case GE_CMD_VIEWPORTYSCALE: + case GE_CMD_VIEWPORTXCENTER: + case GE_CMD_VIEWPORTYCENTER: + case GE_CMD_VIEWPORTZSCALE: + case GE_CMD_VIEWPORTZCENTER: Execute_ViewportType(op, diff); break; diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index e39536a5a8..29470c1fe8 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -829,6 +829,10 @@ void TransformDrawEngine::ApplyDrawState(int prim) { // Yscreen = -offsetY + vpYCenter + vpYScale * Yview // Zscreen = vpZCenter + vpZScale * Zview + // The viewport is normally centered at 2048,2048 but can also be centered at other locations. + // Offset is subtracted from the viewport center and is also set to values in those ranges, and is set so that the viewport will cover + // the desired screen area ([0-480)x[0-272)), so 1808,1912. + // This means that to get the analogue glViewport we must: float vpX0 = vpXCenter - offsetX - fabsf(vpXScale); float vpY0 = vpYCenter - offsetY + fabsf(vpYScale); // Need to account for sign of Y @@ -860,6 +864,10 @@ void TransformDrawEngine::ApplyDrawState(int prim) { float hScale = 1.0f; float yOffset = 0.0f; + if (vpWidth < 200 && vpWidth != vpHeight) { + vpWidth++; + } + // If we're within the bounds, we want clipping the viewport way. So leave it be. if (left < 0.0f || right > renderWidth) { float overageLeft = std::max(-left, 0.0f); diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index 263e222d42..9d62079d04 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -645,7 +645,7 @@ void GPUCommon::ReapplyGfxStateInternal() { // There are a few here in the middle that we shouldn't execute... - for (int i = GE_CMD_VIEWPORTX1; i < GE_CMD_TRANSFERSTART; i++) { + for (int i = GE_CMD_VIEWPORTXSCALE; i < GE_CMD_TRANSFERSTART; i++) { ExecuteOp(gstate.cmdmem[i], 0xFFFFFFFF); } diff --git a/GPU/GeDisasm.cpp b/GPU/GeDisasm.cpp index 12c5eb5d50..2e33d664a3 100644 --- a/GPU/GeDisasm.cpp +++ b/GPU/GeDisasm.cpp @@ -653,19 +653,19 @@ void GeDisassembleOp(u32 pc, u32 op, u32 prev, char *buffer, int bufsize) { } break; - case GE_CMD_VIEWPORTX1: - case GE_CMD_VIEWPORTY1: - case GE_CMD_VIEWPORTX2: - case GE_CMD_VIEWPORTY2: - snprintf(buffer, bufsize, "Viewport param %i: %f", cmd-GE_CMD_VIEWPORTX1, getFloat24(data)); + case GE_CMD_VIEWPORTXSCALE: + case GE_CMD_VIEWPORTYSCALE: + case GE_CMD_VIEWPORTXCENTER: + case GE_CMD_VIEWPORTYCENTER: + snprintf(buffer, bufsize, "Viewport param %i: %f", cmd-GE_CMD_VIEWPORTXSCALE, getFloat24(data)); break; - case GE_CMD_VIEWPORTZ1: + case GE_CMD_VIEWPORTZSCALE: { float zScale = getFloat24(data) / 65535.f; snprintf(buffer, bufsize, "Viewport Z scale: %f", zScale); } break; - case GE_CMD_VIEWPORTZ2: + case GE_CMD_VIEWPORTZCENTER: { float zOff = getFloat24(data) / 65535.f; snprintf(buffer, bufsize, "Viewport Z pos: %f", zOff); diff --git a/GPU/Null/NullGpu.cpp b/GPU/Null/NullGpu.cpp index 3e361fc080..9f6b881163 100644 --- a/GPU/Null/NullGpu.cpp +++ b/GPU/Null/NullGpu.cpp @@ -459,13 +459,13 @@ void NullGPU::ExecuteOp(u32 op, u32 diff) { } break; - case GE_CMD_VIEWPORTX1: - case GE_CMD_VIEWPORTY1: - case GE_CMD_VIEWPORTZ1: - case GE_CMD_VIEWPORTX2: - case GE_CMD_VIEWPORTY2: - case GE_CMD_VIEWPORTZ2: - DEBUG_LOG(G3D,"DL Viewport param %i: %f", cmd-GE_CMD_VIEWPORTX1, getFloat24(data)); + case GE_CMD_VIEWPORTXSCALE: + case GE_CMD_VIEWPORTYSCALE: + case GE_CMD_VIEWPORTZSCALE: + case GE_CMD_VIEWPORTXCENTER: + case GE_CMD_VIEWPORTYCENTER: + case GE_CMD_VIEWPORTZCENTER: + DEBUG_LOG(G3D,"DL Viewport param %i: %f", cmd-GE_CMD_VIEWPORTXSCALE, getFloat24(data)); break; case GE_CMD_LIGHTENABLE0: case GE_CMD_LIGHTENABLE1: diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index 727d574694..aeb116a016 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -678,12 +678,12 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) case GE_CMD_LSC0:case GE_CMD_LSC1:case GE_CMD_LSC2:case GE_CMD_LSC3: break; - case GE_CMD_VIEWPORTX1: - case GE_CMD_VIEWPORTY1: - case GE_CMD_VIEWPORTZ1: - case GE_CMD_VIEWPORTX2: - case GE_CMD_VIEWPORTY2: - case GE_CMD_VIEWPORTZ2: + case GE_CMD_VIEWPORTXSCALE: + case GE_CMD_VIEWPORTYSCALE: + case GE_CMD_VIEWPORTZSCALE: + case GE_CMD_VIEWPORTXCENTER: + case GE_CMD_VIEWPORTYCENTER: + case GE_CMD_VIEWPORTZCENTER: break; case GE_CMD_LIGHTENABLE0: diff --git a/GPU/ge_constants.h b/GPU/ge_constants.h index 0efec9065f..50eceb7704 100644 --- a/GPU/ge_constants.h +++ b/GPU/ge_constants.h @@ -78,12 +78,12 @@ enum GECommand GE_CMD_PROJMATRIXDATA, GE_CMD_TGENMATRIXNUMBER = 0x40, GE_CMD_TGENMATRIXDATA = 0x41, - GE_CMD_VIEWPORTX1, - GE_CMD_VIEWPORTY1, - GE_CMD_VIEWPORTZ1, - GE_CMD_VIEWPORTX2, - GE_CMD_VIEWPORTY2, - GE_CMD_VIEWPORTZ2, + GE_CMD_VIEWPORTXSCALE, + GE_CMD_VIEWPORTYSCALE, + GE_CMD_VIEWPORTZSCALE, + GE_CMD_VIEWPORTXCENTER, + GE_CMD_VIEWPORTYCENTER, + GE_CMD_VIEWPORTZCENTER, GE_CMD_TEXSCALEU = 0x48, GE_CMD_TEXSCALEV = 0x49, GE_CMD_TEXOFFSETU = 0x4A, diff --git a/Windows/GEDebugger/TabState.cpp b/Windows/GEDebugger/TabState.cpp index 252194d3e1..47dfaf14fa 100644 --- a/Windows/GEDebugger/TabState.cpp +++ b/Windows/GEDebugger/TabState.cpp @@ -208,8 +208,8 @@ static const TabStateRow stateSettingsRows[] = { { L"Scissor", GE_CMD_SCISSOR1, CMD_FMT_XYXY, 0, GE_CMD_SCISSOR2 }, { L"Min Z", GE_CMD_MINZ, CMD_FMT_HEX }, { L"Max Z", GE_CMD_MAXZ, CMD_FMT_HEX }, - { L"Viewport 1", GE_CMD_VIEWPORTX1, CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTY1, GE_CMD_VIEWPORTZ1 }, - { L"Viewport 2", GE_CMD_VIEWPORTX2, CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTY2, GE_CMD_VIEWPORTZ2 }, + { L"Viewport Scale", GE_CMD_VIEWPORTXSCALE, CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTYSCALE, GE_CMD_VIEWPORTZSCALE }, + { L"Viewport Offset", GE_CMD_VIEWPORTXCENTER, CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTYCENTER, GE_CMD_VIEWPORTZCENTER }, { L"Offset", GE_CMD_OFFSETX, CMD_FMT_F16_XY, 0, GE_CMD_OFFSETY }, // TODO: Format. { L"Cull mode", GE_CMD_CULL, CMD_FMT_NUM, GE_CMD_CULLFACEENABLE },