summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2013-10-14 15:16:42 +0200
committerdegasus <wickmarkus@web.de>2013-10-29 18:55:50 +0100
commit3151d8709cc23d36e1b847f24adeeb18b85af2a0 (patch)
treec719a44f7ff57a9ca1d3ca3683f3c566509a483b /Source/Core/VideoBackends
parent0002236e3e7f60c1cc0b7a9d8477a622cf6fa699 (diff)
VideoCommon: move ViewportCorrection into VideoCommon
D3D doesn't allow bigger viewports than rendertargets. But flipper does, so the viewport will be clipped and the transformation matrix will be changed. This was done in the D3D backend itself. This is now moved into VideoCommon. This don't reduce code, but in this way, VideoCommon doesn't depend on the backends.
Diffstat (limited to 'Source/Core/VideoBackends')
-rw-r--r--Source/Core/VideoBackends/D3D/Src/Render.cpp59
-rw-r--r--Source/Core/VideoBackends/D3D/Src/Render.h2
-rw-r--r--Source/Core/VideoBackends/D3D/Src/main.cpp1
-rw-r--r--Source/Core/VideoBackends/OGL/Src/Render.cpp5
-rw-r--r--Source/Core/VideoBackends/OGL/Src/Render.h2
-rw-r--r--Source/Core/VideoBackends/OGL/Src/main.cpp1
6 files changed, 20 insertions, 50 deletions
diff --git a/Source/Core/VideoBackends/D3D/Src/Render.cpp b/Source/Core/VideoBackends/D3D/Src/Render.cpp
index 7f9218de11..b1a5a0850c 100644
--- a/Source/Core/VideoBackends/D3D/Src/Render.cpp
+++ b/Source/Core/VideoBackends/D3D/Src/Render.cpp
@@ -477,30 +477,9 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data)
}
}
-// Viewport correction:
-// Say you want a viewport at (ix, iy) with size (iw, ih),
-// but your viewport must be clamped at (ax, ay) with size (aw, ah).
-// Just multiply the projection matrix with the following to get the same
-// effect:
-// [ (iw/aw) 0 0 ((iw - 2*(ax-ix)) / aw - 1) ]
-// [ 0 (ih/ah) 0 ((-ih + 2*(ay-iy)) / ah + 1) ]
-// [ 0 0 1 0 ]
-// [ 0 0 0 1 ]
-static void ViewportCorrectionMatrix(Matrix44& result,
- float ix, float iy, float iw, float ih, // Intended viewport (x, y, width, height)
- float ax, float ay, float aw, float ah) // Actual viewport (x, y, width, height)
-{
- Matrix44::LoadIdentity(result);
- if (aw == 0.f || ah == 0.f)
- return;
- result.data[4*0+0] = iw / aw;
- result.data[4*0+3] = (iw - 2.f * (ax - ix)) / aw - 1.f;
- result.data[4*1+1] = ih / ah;
- result.data[4*1+3] = (-ih + 2.f * (ay - iy)) / ah + 1.f;
-}
// Called from VertexShaderManager
-void Renderer::UpdateViewport(Matrix44& vpCorrection)
+void Renderer::UpdateViewport()
{
// reversed gxsetviewport(xorig, yorig, width, height, nearz, farz)
// [0] = width/2
@@ -513,34 +492,26 @@ void Renderer::UpdateViewport(Matrix44& vpCorrection)
int scissorXOff = bpmem.scissorOffset.x * 2;
int scissorYOff = bpmem.scissorOffset.y * 2;
- float intendedX = Renderer::EFBToScaledXf(xfregs.viewport.xOrig - xfregs.viewport.wd - scissorXOff);
- float intendedY = Renderer::EFBToScaledYf(xfregs.viewport.yOrig + xfregs.viewport.ht - scissorYOff);
- float intendedWd = Renderer::EFBToScaledXf(2.0f * xfregs.viewport.wd);
- float intendedHt = Renderer::EFBToScaledYf(-2.0f * xfregs.viewport.ht);
- if (intendedWd < 0.f)
+ float X = Renderer::EFBToScaledXf(xfregs.viewport.xOrig - xfregs.viewport.wd - scissorXOff);
+ float Y = Renderer::EFBToScaledYf(xfregs.viewport.yOrig + xfregs.viewport.ht - scissorYOff);
+ float Wd = Renderer::EFBToScaledXf(2.0f * xfregs.viewport.wd);
+ float Ht = Renderer::EFBToScaledYf(-2.0f * xfregs.viewport.ht);
+ if (Wd < 0.0f)
{
- intendedX += intendedWd;
- intendedWd = -intendedWd;
+ X += Wd;
+ Wd = -Wd;
}
- if (intendedHt < 0.f)
+ if (Ht < 0.0f)
{
- intendedY += intendedHt;
- intendedHt = -intendedHt;
+ Y += Ht;
+ Ht = -Ht;
}
// In D3D, the viewport rectangle must fit within the render target.
- float X = (intendedX >= 0.f) ? intendedX : 0.f;
- float Y = (intendedY >= 0.f) ? intendedY : 0.f;
- float Wd = (X + intendedWd <= GetTargetWidth()) ? intendedWd : (GetTargetWidth() - X);
- float Ht = (Y + intendedHt <= GetTargetHeight()) ? intendedHt : (GetTargetHeight() - Y);
-
- // If GX viewport is off the render target, we must clamp our viewport
- // within the bounds. Use the correction matrix to compensate.
- ViewportCorrectionMatrix(vpCorrection,
- intendedX, intendedY,
- intendedWd, intendedHt,
- X, Y,
- Wd, Ht);
+ X = (X >= 0.f) ? X : 0.f;
+ Y = (Y >= 0.f) ? Y : 0.f;
+ Wd = (X + Wd <= GetTargetWidth()) ? Wd : (GetTargetWidth() - X);
+ Ht = (Y + Ht <= GetTargetHeight()) ? Ht : (GetTargetHeight() - Y);
// Some games set invalid values for z-min and z-max so fix them to the max and min allowed and let the shaders do this work
D3D11_VIEWPORT vp = CD3D11_VIEWPORT(X, Y,
diff --git a/Source/Core/VideoBackends/D3D/Src/Render.h b/Source/Core/VideoBackends/D3D/Src/Render.h
index 39b5b90d81..12e5b595d3 100644
--- a/Source/Core/VideoBackends/D3D/Src/Render.h
+++ b/Source/Core/VideoBackends/D3D/Src/Render.h
@@ -46,7 +46,7 @@ public:
void ReinterpretPixelData(unsigned int convtype);
- void UpdateViewport(Matrix44& vpCorrection);
+ void UpdateViewport();
bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc);
diff --git a/Source/Core/VideoBackends/D3D/Src/main.cpp b/Source/Core/VideoBackends/D3D/Src/main.cpp
index 989fb2ef91..0514106da5 100644
--- a/Source/Core/VideoBackends/D3D/Src/main.cpp
+++ b/Source/Core/VideoBackends/D3D/Src/main.cpp
@@ -90,6 +90,7 @@ void InitBackendInfo()
g_Config.backend_info.bSupportsFormatReinterpretation = true;
g_Config.backend_info.bSupportsPixelLighting = true;
g_Config.backend_info.bSupportsPrimitiveRestart = true;
+ g_Config.backend_info.bSupportsOversizedViewports = false;
IDXGIFactory* factory;
IDXGIAdapter* ad;
diff --git a/Source/Core/VideoBackends/OGL/Src/Render.cpp b/Source/Core/VideoBackends/OGL/Src/Render.cpp
index e507fc45cd..aae7c5164f 100644
--- a/Source/Core/VideoBackends/OGL/Src/Render.cpp
+++ b/Source/Core/VideoBackends/OGL/Src/Render.cpp
@@ -1093,7 +1093,7 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data)
}
// Called from VertexShaderManager
-void Renderer::UpdateViewport(Matrix44& vpCorrection)
+void Renderer::UpdateViewport()
{
// reversed gxsetviewport(xorig, yorig, width, height, nearz, farz)
// [0] = width/2
@@ -1124,9 +1124,6 @@ void Renderer::UpdateViewport(Matrix44& vpCorrection)
Height *= -1;
}
- // OpenGL does not require any viewport correct
- Matrix44::LoadIdentity(vpCorrection);
-
// Update the view port
if(g_ogl_config.bSupportViewportFloat)
{
diff --git a/Source/Core/VideoBackends/OGL/Src/Render.h b/Source/Core/VideoBackends/OGL/Src/Render.h
index efafb8708d..e30380d627 100644
--- a/Source/Core/VideoBackends/OGL/Src/Render.h
+++ b/Source/Core/VideoBackends/OGL/Src/Render.h
@@ -78,7 +78,7 @@ public:
void ReinterpretPixelData(unsigned int convtype);
- void UpdateViewport(Matrix44& vpCorrection);
+ void UpdateViewport();
bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc);
diff --git a/Source/Core/VideoBackends/OGL/Src/main.cpp b/Source/Core/VideoBackends/OGL/Src/main.cpp
index b109fcdd8b..07c1fcfc0b 100644
--- a/Source/Core/VideoBackends/OGL/Src/main.cpp
+++ b/Source/Core/VideoBackends/OGL/Src/main.cpp
@@ -146,6 +146,7 @@ void InitBackendInfo()
g_Config.backend_info.bSupportsFormatReinterpretation = true;
g_Config.backend_info.bSupportsPixelLighting = true;
//g_Config.backend_info.bSupportsEarlyZ = true; // is gpu dependent and must be set in renderer
+ g_Config.backend_info.bSupportsOversizedViewports = true;
// aamodes
const char* caamodes[] = {_trans("None"), "2x", "4x", "8x", "8x CSAA", "8xQ CSAA", "16x CSAA", "16xQ CSAA", "4x SSAA"};