diff --git a/Common/GPU/D3D11/thin3d_d3d11.cpp b/Common/GPU/D3D11/thin3d_d3d11.cpp index c0fcb9afbb..120f8db5ea 100644 --- a/Common/GPU/D3D11/thin3d_d3d11.cpp +++ b/Common/GPU/D3D11/thin3d_d3d11.cpp @@ -112,7 +112,7 @@ public: // Raster state void SetScissorRect(int left, int top, int width, int height) override; - void SetViewports(int count, Viewport *viewports) override; + void SetViewport(const Viewport &viewport) override; void SetBlendFactor(float color[4]) override { if (memcmp(blendFactor_, color, sizeof(float) * 4)) { memcpy(blendFactor_, color, sizeof(float) * 4); @@ -420,20 +420,18 @@ void D3D11DrawContext::EndFrame() { curPipeline_ = nullptr; } -void D3D11DrawContext::SetViewports(int count, Viewport *viewports) { - D3D11_VIEWPORT vp[4]; - for (int i = 0; i < count; i++) { - DisplayRect rc{ viewports[i].TopLeftX , viewports[i].TopLeftY, viewports[i].Width, viewports[i].Height }; - if (curRenderTargetView_ == bbRenderTargetView_) // Only the backbuffer is actually rotated wrong! - RotateRectToDisplay(rc, curRTWidth_, curRTHeight_); - vp[i].TopLeftX = rc.x; - vp[i].TopLeftY = rc.y; - vp[i].Width = rc.w; - vp[i].Height = rc.h; - vp[i].MinDepth = viewports[i].MinDepth; - vp[i].MaxDepth = viewports[i].MaxDepth; - } - context_->RSSetViewports(count, vp); +void D3D11DrawContext::SetViewport(const Viewport &viewport) { + DisplayRect rc{ viewport.TopLeftX , viewport.TopLeftY, viewport.Width, viewport.Height }; + if (curRenderTargetView_ == bbRenderTargetView_) // Only the backbuffer is actually rotated wrong! + RotateRectToDisplay(rc, curRTWidth_, curRTHeight_); + D3D11_VIEWPORT vp; + vp.TopLeftX = rc.x; + vp.TopLeftY = rc.y; + vp.Width = rc.w; + vp.Height = rc.h; + vp.MinDepth = viewport.MinDepth; + vp.MaxDepth = viewport.MaxDepth; + context_->RSSetViewports(1, &vp); } void D3D11DrawContext::SetScissorRect(int left, int top, int width, int height) { diff --git a/Common/GPU/D3D9/thin3d_d3d9.cpp b/Common/GPU/D3D9/thin3d_d3d9.cpp index b0116c875a..b130aae436 100644 --- a/Common/GPU/D3D9/thin3d_d3d9.cpp +++ b/Common/GPU/D3D9/thin3d_d3d9.cpp @@ -573,7 +573,7 @@ public: // Raster state void SetScissorRect(int left, int top, int width, int height) override; - void SetViewports(int count, Viewport *viewports) override; + void SetViewport(const Viewport &viewport) override; void SetBlendFactor(float color[4]) override; void SetStencilParams(uint8_t refValue, uint8_t writeMask, uint8_t compareMask) override; @@ -1173,12 +1173,12 @@ void D3D9Context::SetScissorRect(int left, int top, int width, int height) { dxstate.scissorTest.set(true); } -void D3D9Context::SetViewports(int count, Viewport *viewports) { - int x = (int)viewports[0].TopLeftX; - int y = (int)viewports[0].TopLeftY; - int w = (int)viewports[0].Width; - int h = (int)viewports[0].Height; - dxstate.viewport.set(x, y, w, h, viewports[0].MinDepth, viewports[0].MaxDepth); +void D3D9Context::SetViewport(const Viewport &viewport) { + int x = (int)viewport.TopLeftX; + int y = (int)viewport.TopLeftY; + int w = (int)viewport.Width; + int h = (int)viewport.Height; + dxstate.viewport.set(x, y, w, h, viewport.MinDepth, viewport.MaxDepth); } void D3D9Context::SetBlendFactor(float color[4]) { diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index ca539f1f17..5cb85ac9c7 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -385,9 +385,9 @@ public: renderManager_.SetScissor({ left, top, width, height }); } - void SetViewports(int count, Viewport *viewports) override { + void SetViewport(const Viewport &viewport) override { // Same structure, different name. - renderManager_.SetViewport((GLRViewport &)*viewports); + renderManager_.SetViewport((GLRViewport &)viewport); } void SetBlendFactor(float color[4]) override { diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index 14c1c0e502..b0c74c5c76 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -425,7 +425,7 @@ public: void GetFramebufferDimensions(Framebuffer *fbo, int *w, int *h) override; void SetScissorRect(int left, int top, int width, int height) override; - void SetViewports(int count, Viewport *viewports) override; + void SetViewport(const Viewport &viewport) override; void SetBlendFactor(float color[4]) override; void SetStencilParams(uint8_t refValue, uint8_t writeMask, uint8_t compareMask) override; @@ -1237,18 +1237,16 @@ void VKContext::SetScissorRect(int left, int top, int width, int height) { renderManager_.SetScissor(left, top, width, height); } -void VKContext::SetViewports(int count, Viewport *viewports) { - if (count > 0) { - // Ignore viewports more than the first. - VkViewport viewport; - viewport.x = viewports[0].TopLeftX; - viewport.y = viewports[0].TopLeftY; - viewport.width = viewports[0].Width; - viewport.height = viewports[0].Height; - viewport.minDepth = viewports[0].MinDepth; - viewport.maxDepth = viewports[0].MaxDepth; - renderManager_.SetViewport(viewport); - } +void VKContext::SetViewport(const Viewport &viewport) { + // Ignore viewports more than the first. + VkViewport vkViewport; + vkViewport.x = viewport.TopLeftX; + vkViewport.y = viewport.TopLeftY; + vkViewport.width = viewport.Width; + vkViewport.height = viewport.Height; + vkViewport.minDepth = viewport.MinDepth; + vkViewport.maxDepth = viewport.MaxDepth; + renderManager_.SetViewport(vkViewport); } void VKContext::SetBlendFactor(float color[4]) { diff --git a/Common/GPU/thin3d.h b/Common/GPU/thin3d.h index 3db2d7b8db..9a427027a9 100644 --- a/Common/GPU/thin3d.h +++ b/Common/GPU/thin3d.h @@ -733,7 +733,7 @@ public: // Dynamic state virtual void SetScissorRect(int left, int top, int width, int height) = 0; - virtual void SetViewports(int count, Viewport *viewports) = 0; + virtual void SetViewport(const Viewport &viewport) = 0; virtual void SetBlendFactor(float color[4]) = 0; virtual void SetStencilParams(uint8_t refValue, uint8_t writeMask, uint8_t compareMask) = 0; diff --git a/Common/UI/UIScreen.cpp b/Common/UI/UIScreen.cpp index 768fc88b16..d1fc99595f 100644 --- a/Common/UI/UIScreen.cpp +++ b/Common/UI/UIScreen.cpp @@ -102,7 +102,7 @@ void UIScreen::preRender() { viewport.Height = pixel_yres; viewport.MaxDepth = 1.0; viewport.MinDepth = 0.0; - draw->SetViewports(1, &viewport); + draw->SetViewport(viewport); draw->SetTargetSize(pixel_xres, pixel_yres); } diff --git a/GPU/Common/DepthBufferCommon.cpp b/GPU/Common/DepthBufferCommon.cpp index 3c78362352..46a2ecfb6f 100644 --- a/GPU/Common/DepthBufferCommon.cpp +++ b/GPU/Common/DepthBufferCommon.cpp @@ -207,7 +207,7 @@ bool FramebufferManagerCommon::ReadbackDepthbuffer(Draw::Framebuffer *fbo, int x auto *blitFBO = GetTempFBO(TempFBO::COPY, fbo->Width() * scaleX, fbo->Height() * scaleY); draw_->BindFramebufferAsRenderTarget(blitFBO, { RPAction::DONT_CARE, RPAction::DONT_CARE, RPAction::DONT_CARE }, "ReadbackDepthbufferSync"); Draw::Viewport viewport = { 0.0f, 0.0f, (float)destW, (float)destH, 0.0f, 1.0f }; - draw_->SetViewports(1, &viewport); + draw_->SetViewport(viewport); draw_->SetScissorRect(0, 0, fbo->Width() * scaleX, fbo->Height() * scaleY); draw_->BindFramebufferAsTexture(fbo, TEX_SLOT_PSP_TEXTURE, FB_DEPTH_BIT, 0); diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index a126bb7fb2..4c0c4dea0b 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -1429,8 +1429,8 @@ void FramebufferManagerCommon::DrawFramebufferToOutput(const u8 *srcPixels, int } void FramebufferManagerCommon::SetViewport2D(int x, int y, int w, int h) { - Draw::Viewport vp{ (float)x, (float)y, (float)w, (float)h, 0.0f, 1.0f }; - draw_->SetViewports(1, &vp); + Draw::Viewport viewport{ (float)x, (float)y, (float)w, (float)h, 0.0f, 1.0f }; + draw_->SetViewport(viewport); } void FramebufferManagerCommon::CopyDisplayToOutput(bool reallyDirty) { @@ -3235,8 +3235,8 @@ void FramebufferManagerCommon::BlitUsingRaster( draw_->InvalidateFramebuffer(Draw::FB_INVALIDATION_LOAD, pipeline->info.writeChannel == RASTER_COLOR ? Draw::FB_COLOR_BIT : Draw::FB_DEPTH_BIT); } - Draw::Viewport vp{ 0.0f, 0.0f, (float)dest->Width(), (float)dest->Height(), 0.0f, 1.0f }; - draw_->SetViewports(1, &vp); + Draw::Viewport viewport{ 0.0f, 0.0f, (float)dest->Width(), (float)dest->Height(), 0.0f, 1.0f }; + draw_->SetViewport(viewport); draw_->SetScissorRect(0, 0, (int)dest->Width(), (int)dest->Height()); draw2D_.Blit(pipeline, srcX1, srcY1, srcX2, srcY2, destX1, destY1, destX2, destY2, (float)srcW, (float)srcH, (float)destW, (float)destH, linearFilter, scaleFactor); diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index 4341961214..0c027ae796 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -734,7 +734,7 @@ void PresentationCommon::CopyToOutput(OutputFlags flags, int uvRotation, float u int nextWidth, nextHeight; draw_->GetFramebufferDimensions(postShaderFramebuffer, &nextWidth, &nextHeight); Draw::Viewport viewport{ 0, 0, (float)nextWidth, (float)nextHeight, 0.0f, 1.0f }; - draw_->SetViewports(1, &viewport); + draw_->SetViewport(viewport); draw_->SetScissorRect(0, 0, nextWidth, nextHeight); CalculatePostShaderUniforms(lastWidth, lastHeight, nextWidth, nextHeight, shaderInfo, &uniforms); @@ -853,7 +853,7 @@ void PresentationCommon::CopyToOutput(OutputFlags flags, int uvRotation, float u auto setViewport = [&](float x, float y, float w, float h) { Draw::Viewport viewport{ x, y, w, h, 0.0f, 1.0f }; - draw_->SetViewports(1, &viewport); + draw_->SetViewport(viewport); }; CardboardSettings cardboardSettings; diff --git a/GPU/Common/StencilCommon.cpp b/GPU/Common/StencilCommon.cpp index 9bf141756c..00e81b19d1 100644 --- a/GPU/Common/StencilCommon.cpp +++ b/GPU/Common/StencilCommon.cpp @@ -304,7 +304,7 @@ bool FramebufferManagerCommon::PerformWriteStencilFromMemory(u32 addr, int size, } Draw::Viewport viewport = { 0.0f, 0.0f, (float)w, (float)h, 0.0f, 1.0f }; - draw_->SetViewports(1, &viewport); + draw_->SetViewport(viewport); // TODO: Switch the format to a single channel format? Draw::Texture *tex = MakePixelTexture(src, dstBuffer->fb_format, dstBuffer->fb_stride, dstBuffer->width, dstBuffer->height); diff --git a/GPU/Common/TextureCacheCommon.cpp b/GPU/Common/TextureCacheCommon.cpp index 6178df18b8..6611c21156 100644 --- a/GPU/Common/TextureCacheCommon.cpp +++ b/GPU/Common/TextureCacheCommon.cpp @@ -2247,8 +2247,8 @@ void TextureCacheCommon::ApplyTextureFramebuffer(VirtualFramebuffer *framebuffer draw_->BindFramebufferAsRenderTarget(depalFBO, { Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE }, "Depal"); draw_->InvalidateFramebuffer(Draw::FB_INVALIDATION_STORE, Draw::FB_DEPTH_BIT | Draw::FB_STENCIL_BIT); draw_->SetScissorRect(u1, v1, u2 - u1, v2 - v1); - Draw::Viewport vp{ 0.0f, 0.0f, (float)depalWidth, (float)framebuffer->renderHeight, 0.0f, 1.0f }; - draw_->SetViewports(1, &vp); + Draw::Viewport viewport{ 0.0f, 0.0f, (float)depalWidth, (float)framebuffer->renderHeight, 0.0f, 1.0f }; + draw_->SetViewport(viewport); draw_->BindFramebufferAsTexture(framebuffer->fbo, 0, depth ? Draw::FB_DEPTH_BIT : Draw::FB_COLOR_BIT, Draw::ALL_LAYERS); if (clutRenderAddress_ == 0xFFFFFFFF) { @@ -2352,8 +2352,8 @@ void TextureCacheCommon::ApplyTextureDepal(TexCacheEntry *entry) { draw_->BindFramebufferAsRenderTarget(depalFBO, { Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE }, "Depal"); draw_->InvalidateFramebuffer(Draw::FB_INVALIDATION_STORE, Draw::FB_DEPTH_BIT | Draw::FB_STENCIL_BIT); draw_->SetScissorRect(u1, v1, u2 - u1, v2 - v1); - Draw::Viewport vp{ 0.0f, 0.0f, (float)texWidth, (float)texHeight, 0.0f, 1.0f }; - draw_->SetViewports(1, &vp); + Draw::Viewport viewport{ 0.0f, 0.0f, (float)texWidth, (float)texHeight, 0.0f, 1.0f }; + draw_->SetViewport(viewport); draw_->BindNativeTexture(0, GetNativeTextureView(entry)); draw_->BindFramebufferAsTexture(dynamicClutFbo_, 1, Draw::FB_COLOR_BIT, 0); diff --git a/GPU/D3D11/StateMappingD3D11.cpp b/GPU/D3D11/StateMappingD3D11.cpp index ac80c9627a..1d00bfb46d 100644 --- a/GPU/D3D11/StateMappingD3D11.cpp +++ b/GPU/D3D11/StateMappingD3D11.cpp @@ -442,7 +442,7 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { void DrawEngineD3D11::ApplyDrawStateLate(bool applyStencilRef, uint8_t stencilRef) { // we go through Draw here because it automatically handles screen rotation, as needed in UWP on mobiles. if (gstate_c.IsDirty(DIRTY_VIEWPORTSCISSOR_STATE)) { - draw_->SetViewports(1, &dynState_.viewport); + draw_->SetViewport(dynState_.viewport); draw_->SetScissorRect(dynState_.scissor.left, dynState_.scissor.top, dynState_.scissor.right - dynState_.scissor.left, dynState_.scissor.bottom - dynState_.scissor.top); } if (gstate_c.IsDirty(DIRTY_RASTER_STATE)) { diff --git a/GPU/GLES/StencilBufferGLES.cpp b/GPU/GLES/StencilBufferGLES.cpp index 110d2d94f7..763e5a95fe 100644 --- a/GPU/GLES/StencilBufferGLES.cpp +++ b/GPU/GLES/StencilBufferGLES.cpp @@ -133,7 +133,7 @@ bool FramebufferManagerGLES::ReadbackStencilbuffer(Draw::Framebuffer *fbo, int x auto *blitFBO = GetTempFBO(TempFBO::COPY, fbo->Width(), fbo->Height()); draw_->BindFramebufferAsRenderTarget(blitFBO, { RPAction::DONT_CARE, RPAction::DONT_CARE, RPAction::DONT_CARE }, "ReadbackStencilbufferSync"); Draw::Viewport viewport = { 0.0f, 0.0f, (float)fbo->Width(), (float)fbo->Height(), 0.0f, 1.0f }; - draw_->SetViewports(1, &viewport); + draw_->SetViewport(viewport); draw_->BindFramebufferAsTexture(fbo, TEX_SLOT_PSP_TEXTURE, FB_STENCIL_BIT, 0); draw_->BindSamplerStates(TEX_SLOT_PSP_TEXTURE, 1, &stencilReadbackSampler_); diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 28287cc786..b95b41de36 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -1375,7 +1375,7 @@ void EmuScreen::preRender() { viewport.Height = pixel_yres; viewport.MaxDepth = 1.0; viewport.MinDepth = 0.0; - draw->SetViewports(1, &viewport); + draw->SetViewport(viewport); } draw->SetTargetSize(pixel_xres, pixel_yres); } @@ -1523,7 +1523,7 @@ void EmuScreen::renderUI() { viewport.Height = pixel_yres; viewport.MaxDepth = 1.0; viewport.MinDepth = 0.0; - thin3d->SetViewports(1, &viewport); + thin3d->SetViewport(viewport); if (root_) { UI::LayoutViewHierarchy(*ctx, root_, false); diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index c1bb989b01..7a8984dfef 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -375,7 +375,7 @@ void DrawGameBackground(UIContext &dc, const Path &gamePath, float x, float y, f viewport.Height = pixel_yres; viewport.MaxDepth = 1.0; viewport.MinDepth = 0.0; - draw->SetViewports(1, &viewport); + draw->SetViewport(viewport); dc.BeginFrame(); dc.RebindTexture(); dc.Begin(); diff --git a/UWP/PPSSPP_UWPMain.cpp b/UWP/PPSSPP_UWPMain.cpp index b734f6e3d2..0438575d7c 100644 --- a/UWP/PPSSPP_UWPMain.cpp +++ b/UWP/PPSSPP_UWPMain.cpp @@ -201,7 +201,7 @@ bool PPSSPP_UWPMain::Render() { dp_xres = pixel_xres * g_dpi_scale_x; dp_yres = pixel_yres * g_dpi_scale_y; - context->RSSetViewports(1, &viewport); + context->RSSetViewport(viewport); NativeRender(ctx_.get()); return true;