diff options
| author | Nolan Check <Nolan.Check@gmail.com> | 2011-05-12 02:14:45 +0000 |
|---|---|---|
| committer | Nolan Check <Nolan.Check@gmail.com> | 2011-05-12 02:14:45 +0000 |
| commit | 80247835020092c598fcee519f77e7d581b4d146 (patch) | |
| tree | c147fd97251c19f401fddda32900974a3fdbf407 /Source/Core/VideoCommon | |
| parent | 8cb2443c2fe22196c26d6e15608273dbc9e6551f (diff) | |
Don't resize render target to handle out-of-bounds viewports. Instead, adjust the projection matrix.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7538 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/VideoCommon')
| -rw-r--r-- | Source/Core/VideoCommon/Src/RenderBase.cpp | 12 | ||||
| -rw-r--r-- | Source/Core/VideoCommon/Src/RenderBase.h | 20 | ||||
| -rw-r--r-- | Source/Core/VideoCommon/Src/VertexShaderManager.cpp | 16 |
3 files changed, 18 insertions, 30 deletions
diff --git a/Source/Core/VideoCommon/Src/RenderBase.cpp b/Source/Core/VideoCommon/Src/RenderBase.cpp index 237605ccf3..edb278acca 100644 --- a/Source/Core/VideoCommon/Src/RenderBase.cpp +++ b/Source/Core/VideoCommon/Src/RenderBase.cpp @@ -62,10 +62,6 @@ volatile bool Renderer::s_bScreenshot; int Renderer::s_target_width; int Renderer::s_target_height; -// The custom resolution -int Renderer::s_Fulltarget_width; -int Renderer::s_Fulltarget_height; - // TODO: Add functionality to reinit all the render targets when the window is resized. int Renderer::s_backbuffer_width; int Renderer::s_backbuffer_height; @@ -180,8 +176,8 @@ bool Renderer::CalculateTargetSize(int multiplier) if (newEFBWidth != s_target_width || newEFBHeight != s_target_height) { - s_Fulltarget_width = s_target_width = newEFBWidth; - s_Fulltarget_height = s_target_height = newEFBHeight; + s_target_width = newEFBWidth; + s_target_height = newEFBHeight; return true; } return false; @@ -375,7 +371,7 @@ void Renderer::RecordVideoMemory() FifoRecorder::GetInstance().SetVideoMemory(bpMem, cpMem, xfMem, xfRegs, sizeof(XFRegisters) / 4); } -void UpdateViewport() +void UpdateViewport(Matrix44& vpCorrection) { - g_renderer->UpdateViewport(); + g_renderer->UpdateViewport(vpCorrection); } diff --git a/Source/Core/VideoCommon/Src/RenderBase.h b/Source/Core/VideoCommon/Src/RenderBase.h index 98f32c443c..17132ebb8c 100644 --- a/Source/Core/VideoCommon/Src/RenderBase.h +++ b/Source/Core/VideoCommon/Src/RenderBase.h @@ -66,12 +66,6 @@ public: virtual void ApplyState(bool bUseDstAlpha) = 0; virtual void RestoreState() = 0; - // Real internal resolution: - // D3D doesn't support viewports larger than the target size, so we need to resize the target to the viewport size for those. - // OpenGL supports this, so GetFullTargetWidth returns the same as GetTargetWidth there. - static int GetFullTargetWidth() { return s_Fulltarget_width; } - static int GetFullTargetHeight() { return s_Fulltarget_height; } - // Ideal internal resolution - determined by display resolution (automatic scaling) and/or a multiple of the native EFB resolution static int GetTargetWidth() { return s_target_width; } static int GetTargetHeight() { return s_target_height; } @@ -99,12 +93,6 @@ public: static float EFBToScaledXf(float x) { return x * ((float)GetTargetWidth() / (float)EFB_WIDTH); } static float EFBToScaledYf(float y) { return y * ((float)GetTargetHeight() / (float)EFB_HEIGHT); } - // Returns the offset at which the EFB will be drawn onto the backbuffer - // NOTE: Never calculate this manually (e.g. to "increase accuracy"), since you might end up getting off-by-one errors. - // This is a per-frame constant, so it won't cause any issues. - static int TargetStrideX() { return (s_Fulltarget_width - s_target_width) / 2; } - static int TargetStrideY() { return (s_Fulltarget_height - s_target_height) / 2; } - // Random utilities static void SetScreenshot(const char *filename); static void DrawDebugText(); @@ -124,7 +112,7 @@ public: // Finish up the current frame, print some stats virtual void Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma = 1.0f) = 0; - virtual void UpdateViewport() = 0; + virtual void UpdateViewport(Matrix44& vpCorrection) = 0; virtual bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc) = 0; @@ -160,10 +148,6 @@ protected: static int s_target_width; static int s_target_height; - // The custom resolution - static int s_Fulltarget_width; - static int s_Fulltarget_height; - // TODO: Add functionality to reinit all the render targets when the window is resized. static int s_backbuffer_width; static int s_backbuffer_height; @@ -189,7 +173,7 @@ private: extern Renderer *g_renderer; -void UpdateViewport(); +void UpdateViewport(Matrix44& vpCorrection); template <typename R> void GetScissorRect(MathUtil::Rectangle<R> &rect) diff --git a/Source/Core/VideoCommon/Src/VertexShaderManager.cpp b/Source/Core/VideoCommon/Src/VertexShaderManager.cpp index 49b1f50ff9..a18829fde2 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderManager.cpp +++ b/Source/Core/VideoCommon/Src/VertexShaderManager.cpp @@ -43,12 +43,13 @@ static int nNormalMatricesChanged[2]; // min,max static int nPostTransformMatricesChanged[2]; // min,max static int nLightsChanged[2]; // min,max +static Matrix44 s_viewportCorrection; static Matrix33 s_viewRotationMatrix; static Matrix33 s_viewInvRotationMatrix; static float s_fViewTranslationVector[3]; static float s_fViewRotation[2]; -void UpdateViewport(); +void UpdateViewport(Matrix44& vpCorrection); inline void SetVSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4) { @@ -301,7 +302,8 @@ void VertexShaderManager::SetConstants() bViewportChanged = false; SetVSConstant4f(C_DEPTHPARAMS,xfregs.viewport.farZ / 16777216.0f,xfregs.viewport.zRange / 16777216.0f,0.0f,0.0f); // This is so implementation-dependent that we can't have it here. - UpdateViewport(); + UpdateViewport(s_viewportCorrection); + bProjectionChanged = true; } if (bProjectionChanged) @@ -421,12 +423,18 @@ void VertexShaderManager::SetConstants() Matrix44::Multiply(mtxB, mtxA, viewMtx); // view = rotation x translation Matrix44::Set(mtxB, g_fProjectionMatrix); Matrix44::Multiply(mtxB, viewMtx, mtxA); // mtxA = projection x view + Matrix44::Multiply(s_viewportCorrection, mtxA, mtxB); // mtxB = viewportCorrection x mtxA - SetMultiVSConstant4fv(C_PROJECTION, 4, &mtxA.data[0]); + SetMultiVSConstant4fv(C_PROJECTION, 4, mtxB.data); } else { - SetMultiVSConstant4fv(C_PROJECTION, 4, &g_fProjectionMatrix[0]); + Matrix44 projMtx; + Matrix44::Set(projMtx, g_fProjectionMatrix); + + Matrix44 correctedMtx; + Matrix44::Multiply(s_viewportCorrection, projMtx, correctedMtx); + SetMultiVSConstant4fv(C_PROJECTION, 4, correctedMtx.data); } } } |
