mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 22:29:39 -06:00
Merge pull request #8049 from stenzek/crop
Renderer: Adjust source rectangle when crop would draw off screen
This commit is contained in:
@ -328,10 +328,12 @@ void Renderer::WaitForGPUIdle()
|
||||
D3D::context->Flush();
|
||||
}
|
||||
|
||||
void Renderer::RenderXFBToScreen(const AbstractTexture* texture, const MathUtil::Rectangle<int>& rc)
|
||||
void Renderer::RenderXFBToScreen(const MathUtil::Rectangle<int>& target_rc,
|
||||
const AbstractTexture* source_texture,
|
||||
const MathUtil::Rectangle<int>& source_rc)
|
||||
{
|
||||
if (g_ActiveConfig.stereo_mode != StereoMode::Nvidia3DVision)
|
||||
return ::Renderer::RenderXFBToScreen(texture, rc);
|
||||
return ::Renderer::RenderXFBToScreen(target_rc, source_texture, source_rc);
|
||||
|
||||
if (!m_3d_vision_texture)
|
||||
Create3DVisionTexture(m_backbuffer_width, m_backbuffer_height);
|
||||
@ -339,12 +341,11 @@ void Renderer::RenderXFBToScreen(const AbstractTexture* texture, const MathUtil:
|
||||
// Render to staging texture which is double the width of the backbuffer
|
||||
SetAndClearFramebuffer(m_3d_vision_framebuffer.get());
|
||||
|
||||
const auto target_rc = GetTargetRectangle();
|
||||
m_post_processor->BlitFromTexture(target_rc, rc, texture, 0);
|
||||
m_post_processor->BlitFromTexture(target_rc, source_rc, source_texture, 0);
|
||||
m_post_processor->BlitFromTexture(
|
||||
MathUtil::Rectangle<int>(target_rc.left + m_backbuffer_width, target_rc.top,
|
||||
target_rc.right + m_backbuffer_width, target_rc.bottom),
|
||||
rc, texture, 1);
|
||||
source_rc, source_texture, 1);
|
||||
|
||||
// Copy the left eye to the backbuffer, if Nvidia 3D Vision is enabled it should
|
||||
// recognize the signature and automatically include the right eye frame.
|
||||
|
@ -67,8 +67,9 @@ public:
|
||||
void Flush() override;
|
||||
void WaitForGPUIdle() override;
|
||||
|
||||
void RenderXFBToScreen(const AbstractTexture* texture,
|
||||
const MathUtil::Rectangle<int>& rc) override;
|
||||
void RenderXFBToScreen(const MathUtil::Rectangle<int>& target_rc,
|
||||
const AbstractTexture* source_texture,
|
||||
const MathUtil::Rectangle<int>& source_rc) override;
|
||||
void OnConfigChanged(u32 bits) override;
|
||||
|
||||
private:
|
||||
|
@ -978,19 +978,19 @@ void Renderer::ClearScreen(const MathUtil::Rectangle<int>& rc, bool colorEnable,
|
||||
BPFunctions::SetScissor();
|
||||
}
|
||||
|
||||
void Renderer::RenderXFBToScreen(const AbstractTexture* texture, const MathUtil::Rectangle<int>& rc)
|
||||
void Renderer::RenderXFBToScreen(const MathUtil::Rectangle<int>& target_rc,
|
||||
const AbstractTexture* source_texture,
|
||||
const MathUtil::Rectangle<int>& source_rc)
|
||||
{
|
||||
// Quad-buffered stereo is annoying on GL.
|
||||
if (g_ActiveConfig.stereo_mode != StereoMode::QuadBuffer)
|
||||
return ::Renderer::RenderXFBToScreen(texture, rc);
|
||||
|
||||
const auto target_rc = GetTargetRectangle();
|
||||
return ::Renderer::RenderXFBToScreen(target_rc, source_texture, source_rc);
|
||||
|
||||
glDrawBuffer(GL_BACK_LEFT);
|
||||
m_post_processor->BlitFromTexture(target_rc, rc, texture, 0);
|
||||
m_post_processor->BlitFromTexture(target_rc, source_rc, source_texture, 0);
|
||||
|
||||
glDrawBuffer(GL_BACK_RIGHT);
|
||||
m_post_processor->BlitFromTexture(target_rc, rc, texture, 1);
|
||||
m_post_processor->BlitFromTexture(target_rc, source_rc, source_texture, 1);
|
||||
|
||||
glDrawBuffer(GL_BACK);
|
||||
}
|
||||
|
@ -134,8 +134,9 @@ public:
|
||||
|
||||
void Flush() override;
|
||||
void WaitForGPUIdle() override;
|
||||
void RenderXFBToScreen(const AbstractTexture* texture,
|
||||
const MathUtil::Rectangle<int>& rc) override;
|
||||
void RenderXFBToScreen(const MathUtil::Rectangle<int>& target_rc,
|
||||
const AbstractTexture* source_texture,
|
||||
const MathUtil::Rectangle<int>& source_rc) override;
|
||||
void OnConfigChanged(u32 bits) override;
|
||||
|
||||
void ClearScreen(const MathUtil::Rectangle<int>& rc, bool colorEnable, bool alphaEnable,
|
||||
|
@ -94,11 +94,12 @@ std::unique_ptr<AbstractPipeline> SWRenderer::CreatePipeline(const AbstractPipel
|
||||
}
|
||||
|
||||
// Called on the GPU thread
|
||||
void SWRenderer::RenderXFBToScreen(const AbstractTexture* texture,
|
||||
const MathUtil::Rectangle<int>& xfb_region)
|
||||
void SWRenderer::RenderXFBToScreen(const MathUtil::Rectangle<int>& target_rc,
|
||||
const AbstractTexture* source_texture,
|
||||
const MathUtil::Rectangle<int>& source_rc)
|
||||
{
|
||||
if (!IsHeadless())
|
||||
m_window->ShowImage(texture, xfb_region);
|
||||
m_window->ShowImage(source_texture, source_rc);
|
||||
}
|
||||
|
||||
u32 SWRenderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 InputData)
|
||||
|
@ -42,8 +42,9 @@ public:
|
||||
u16 BBoxRead(int index) override;
|
||||
void BBoxWrite(int index, u16 value) override;
|
||||
|
||||
void RenderXFBToScreen(const AbstractTexture* texture,
|
||||
const MathUtil::Rectangle<int>& rc) override;
|
||||
void RenderXFBToScreen(const MathUtil::Rectangle<int>& target_rc,
|
||||
const AbstractTexture* source_texture,
|
||||
const MathUtil::Rectangle<int>& source_rc) override;
|
||||
|
||||
void ClearScreen(const MathUtil::Rectangle<int>& rc, bool colorEnable, bool alphaEnable,
|
||||
bool zEnable, u32 color, u32 z) override;
|
||||
|
Reference in New Issue
Block a user