diff --git a/GPU/Common/FramebufferCommon.cpp b/GPU/Common/FramebufferCommon.cpp index 0d85958f94..8cdbeb88bc 100644 --- a/GPU/Common/FramebufferCommon.cpp +++ b/GPU/Common/FramebufferCommon.cpp @@ -660,9 +660,9 @@ void FramebufferManagerCommon::DrawPixels(VirtualFramebuffer *vfb, int dstX, int std::swap(v0, v1); flags = g_Config.iBufFilter == SCALE_LINEAR ? DRAWTEX_LINEAR : DRAWTEX_NEAREST; flags = flags | DRAWTEX_TO_BACKBUFFER; - float x, y, w, h; - CenterDisplayOutputRect(&x, &y, &w, &h, 480.0f, 272.0f, (float)pixelWidth_, (float)pixelHeight_, ROTATION_LOCKED_HORIZONTAL); - SetViewport2D(x, y, w, h); + FRect rc; + CenterDisplayOutputRect(&rc, 480.0f, 272.0f, (float)pixelWidth_, (float)pixelHeight_, ROTATION_LOCKED_HORIZONTAL); + SetViewport2D(rc.x, rc.y, rc.w, rc.h); draw_->SetScissorRect(0, 0, pixelWidth_, pixelHeight_); } diff --git a/GPU/Common/GPUStateUtils.cpp b/GPU/Common/GPUStateUtils.cpp index 3ffc8d8038..273619042d 100644 --- a/GPU/Common/GPUStateUtils.cpp +++ b/GPU/Common/GPUStateUtils.cpp @@ -557,7 +557,12 @@ void ConvertViewportAndScissor(bool useBufferedRendering, float renderWidth, flo } else { float pixelW = PSP_CoreParameter().pixelWidth; float pixelH = PSP_CoreParameter().pixelHeight; - CenterDisplayOutputRect(&displayOffsetX, &displayOffsetY, &renderWidth, &renderHeight, 480, 272, pixelW, pixelH, ROTATION_LOCKED_HORIZONTAL); + FRect rc; + CenterDisplayOutputRect(&rc, 480, 272, pixelW, pixelH, ROTATION_LOCKED_HORIZONTAL); + displayOffsetX = rc.x; + displayOffsetY = rc.y; + renderWidth = rc.w; + renderHeight = rc.h; renderWidthFactor = renderWidth / 480.0f; renderHeightFactor = renderHeight / 272.0f; } diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index 83fffeecc0..a18dde1722 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -39,7 +39,7 @@ struct Vertex { uint32_t rgba; }; -void CenterDisplayOutputRect(float *x, float *y, float *w, float *h, float origW, float origH, float frameW, float frameH, int rotation) { +void CenterDisplayOutputRect(FRect *rc, float origW, float origH, float frameW, float frameH, int rotation) { float outW; float outH; @@ -60,16 +60,16 @@ void CenterDisplayOutputRect(float *x, float *y, float *w, float *h, float origW float smallDisplayW = origW * customZoom; float smallDisplayH = origH * customZoom; if (!rotated) { - *x = floorf(((frameW - smallDisplayW) / 2.0f) + offsetX); - *y = floorf(((frameH - smallDisplayH) / 2.0f) + offsetY); - *w = floorf(smallDisplayW); - *h = floorf(smallDisplayH); + rc->x = floorf(((frameW - smallDisplayW) / 2.0f) + offsetX); + rc->y = floorf(((frameH - smallDisplayH) / 2.0f) + offsetY); + rc->w = floorf(smallDisplayW); + rc->h = floorf(smallDisplayH); return; } else { - *x = floorf(((frameW - smallDisplayH) / 2.0f) + offsetX); - *y = floorf(((frameH - smallDisplayW) / 2.0f) + offsetY); - *w = floorf(smallDisplayH); - *h = floorf(smallDisplayW); + rc->x = floorf(((frameW - smallDisplayH) / 2.0f) + offsetX); + rc->y = floorf(((frameH - smallDisplayW) / 2.0f) + offsetY); + rc->w = floorf(smallDisplayH); + rc->h = floorf(smallDisplayW); return; } } else if (g_Config.iSmallDisplayZoomType == (int)SmallDisplayZoom::AUTO) { @@ -77,10 +77,10 @@ void CenterDisplayOutputRect(float *x, float *y, float *w, float *h, float origW float pixelCrop = frameH / 270.0f; float resCommonWidescreen = pixelCrop - floor(pixelCrop); if (!rotated && resCommonWidescreen == 0.0f && frameW >= pixelCrop * 480.0f) { - *x = floorf((frameW - pixelCrop * 480.0f) * 0.5f); - *y = floorf(-pixelCrop); - *w = floorf(pixelCrop * 480.0f); - *h = floorf(pixelCrop * 272.0f); + rc->x = floorf((frameW - pixelCrop * 480.0f) * 0.5f); + rc->y = floorf(-pixelCrop); + rc->w = floorf(pixelCrop * 480.0f); + rc->h = floorf(pixelCrop * 272.0f); return; } } @@ -104,10 +104,10 @@ void CenterDisplayOutputRect(float *x, float *y, float *w, float *h, float origW } } - *x = floorf((frameW - outW) / 2.0f); - *y = floorf((frameH - outH) / 2.0f); - *w = floorf(outW); - *h = floorf(outH); + rc->x = floorf((frameW - outW) / 2.0f); + rc->y = floorf((frameH - outH) / 2.0f); + rc->w = floorf(outW); + rc->h = floorf(outH); } PresentationCommon::PresentationCommon(Draw::DrawContext *draw) : draw_(draw) { @@ -252,10 +252,10 @@ bool PresentationCommon::BuildPostShader(const ShaderInfo *shaderInfo, const Sha nextHeight *= next->SSAAFilterLevel; } else if (shaderInfo->outputResolution) { // If the current shader uses output res (not next), we will use output res for it. - float x, y, w, h; - CenterDisplayOutputRect(&x, &y, &w, &h, 480.0f, 272.0f, (float)pixelWidth_, (float)pixelHeight_, g_Config.iInternalScreenRotation); - nextWidth = (int)w; - nextHeight = (int)h; + FRect rc; + CenterDisplayOutputRect(&rc, 480.0f, 272.0f, (float)pixelWidth_, (float)pixelHeight_, g_Config.iInternalScreenRotation); + nextWidth = (int)rc.w; + nextHeight = (int)rc.h; } // No depth/stencil for post processing @@ -499,13 +499,13 @@ void PresentationCommon::CopyToOutput(OutputFlags flags, int uvRotation, float u int lastHeight = srcHeight_; // These are the output coordinates. - float x, y, w, h; - CenterDisplayOutputRect(&x, &y, &w, &h, 480.0f, 272.0f, (float)pixelWidth_, (float)pixelHeight_, uvRotation); + FRect rc; + CenterDisplayOutputRect(&rc, 480.0f, 272.0f, (float)pixelWidth_, (float)pixelHeight_, uvRotation); if (GetGPUBackend() == GPUBackend::DIRECT3D9) { - x -= 0.5f; + rc.x -= 0.5f; // This is plus because the top is larger y. - y += 0.5f; + rc.y += 0.5f; } if ((flags & OutputFlags::BACKBUFFER_FLIPPED) || (flags & OutputFlags::POSITION_FLIPPED)) { @@ -515,10 +515,10 @@ void PresentationCommon::CopyToOutput(OutputFlags flags, int uvRotation, float u // To make buffer updates easier, we use one array of verts. int postVertsOffset = (int)sizeof(Vertex) * 4; Vertex verts[8] = { - { x, y, 0, u0, v0, 0xFFFFFFFF }, // TL - { x, y + h, 0, u0, v1, 0xFFFFFFFF }, // BL - { x + w, y + h, 0, u1, v1, 0xFFFFFFFF }, // BR - { x + w, y, 0, u1, v0, 0xFFFFFFFF }, // TR + { rc.x, rc.y, 0, u0, v0, 0xFFFFFFFF }, // TL + { rc.x, rc.y + rc.h, 0, u0, v1, 0xFFFFFFFF }, // BL + { rc.x + rc.w, rc.y + rc.h, 0, u1, v1, 0xFFFFFFFF }, // BR + { rc.x + rc.w, rc.y, 0, u1, v0, 0xFFFFFFFF }, // TR }; float invDestW = 1.0f / (pixelWidth_ * 0.5f); @@ -648,7 +648,7 @@ void PresentationCommon::CopyToOutput(OutputFlags flags, int uvRotation, float u if (isFinalAtOutputResolution) { PostShaderUniforms uniforms; - CalculatePostShaderUniforms(lastWidth, lastHeight, (int)w, (int)h, &postShaderInfo_.back(), &uniforms); + CalculatePostShaderUniforms(lastWidth, lastHeight, (int)rc.w, (int)rc.h, &postShaderInfo_.back(), &uniforms); draw_->UpdateDynamicUniformBuffer(&uniforms, sizeof(uniforms)); } else { Draw::VsTexColUB ub{}; diff --git a/GPU/Common/PresentationCommon.h b/GPU/Common/PresentationCommon.h index 919f63b42a..50f6508880 100644 --- a/GPU/Common/PresentationCommon.h +++ b/GPU/Common/PresentationCommon.h @@ -37,7 +37,15 @@ struct PostShaderUniforms { float gl_HalfPixel[4]; }; -void CenterDisplayOutputRect(float *x, float *y, float *w, float *h, float origW, float origH, float frameW, float frameH, int rotation); +// Could use UI::Bounds but don't want to depend on that here. +struct FRect { + float x; + float y; + float w; + float h; +}; + +void CenterDisplayOutputRect(FRect *rc, float origW, float origH, float frameW, float frameH, int rotation); namespace Draw { class Buffer;