mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-26 15:55:31 +01:00
apply to dx9 and dx11 backends as well
This commit is contained in:
parent
6845a1596c
commit
b867c21fea
@ -54,7 +54,7 @@ public:
|
|||||||
|
|
||||||
virtual void SetColorMask() = 0;
|
virtual void SetColorMask() = 0;
|
||||||
virtual void SetBlendMode(bool forceUpdate) = 0;
|
virtual void SetBlendMode(bool forceUpdate) = 0;
|
||||||
virtual bool SetScissorRect() = 0;
|
virtual void SetScissorRect() = 0;
|
||||||
virtual void SetGenerationMode() = 0;
|
virtual void SetGenerationMode() = 0;
|
||||||
virtual void SetDepthMode() = 0;
|
virtual void SetDepthMode() = 0;
|
||||||
virtual void SetLogicOpMode() = 0;
|
virtual void SetLogicOpMode() = 0;
|
||||||
|
@ -444,51 +444,21 @@ bool Renderer::CheckForResize()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Renderer::SetScissorRect()
|
void Renderer::SetScissorRect()
|
||||||
{
|
{
|
||||||
TargetRectangle rc;
|
EFBRectangle rc;
|
||||||
GetScissorRect(rc);
|
GetScissorRect(rc);
|
||||||
|
|
||||||
if (rc.left < 0) rc.left = 0;
|
if (rc.left < 0) rc.left = 0;
|
||||||
if (rc.right < 0) rc.right = 0;
|
|
||||||
if (rc.top < 0) rc.top = 0;
|
if (rc.top < 0) rc.top = 0;
|
||||||
if (rc.bottom < 0) rc.bottom = 0;
|
|
||||||
|
|
||||||
if (rc.left > EFB_WIDTH) rc.left = EFB_WIDTH;
|
|
||||||
if (rc.right > EFB_WIDTH) rc.right = EFB_WIDTH;
|
if (rc.right > EFB_WIDTH) rc.right = EFB_WIDTH;
|
||||||
if (rc.top > EFB_HEIGHT) rc.top = EFB_HEIGHT;
|
|
||||||
if (rc.bottom > EFB_HEIGHT) rc.bottom = EFB_HEIGHT;
|
if (rc.bottom > EFB_HEIGHT) rc.bottom = EFB_HEIGHT;
|
||||||
|
|
||||||
rc.left = EFBToScaledX(rc.left);
|
if (rc.left > rc.right) rc.right = rc.left;
|
||||||
rc.right = EFBToScaledX(rc.right);
|
if (rc.top > rc.bottom) rc.bottom = rc.top;
|
||||||
rc.top = EFBToScaledY(rc.top);
|
|
||||||
rc.bottom = EFBToScaledY(rc.bottom);
|
|
||||||
|
|
||||||
if (rc.left > rc.right)
|
TargetRectangle trc = ConvertEFBRectangle(rc);
|
||||||
{
|
D3D::context->RSSetScissorRects(1, trc.AsRECT());
|
||||||
int temp = rc.right;
|
|
||||||
rc.right = rc.left;
|
|
||||||
rc.left = temp;
|
|
||||||
}
|
|
||||||
if (rc.top > rc.bottom)
|
|
||||||
{
|
|
||||||
int temp = rc.bottom;
|
|
||||||
rc.bottom = rc.top;
|
|
||||||
rc.top = temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rc.right >= rc.left && rc.bottom >= rc.top)
|
|
||||||
{
|
|
||||||
D3D::context->RSSetScissorRects(1, rc.AsRECT());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//WARN_LOG(VIDEO, "Bad scissor rectangle: %i %i %i %i", rc.left, rc.top, rc.right, rc.bottom);
|
|
||||||
*rc.AsRECT() = CD3D11_RECT(0.f, 0.f, s_target_width, s_target_height);
|
|
||||||
D3D::context->RSSetScissorRects(1, rc.AsRECT());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::SetColorMask()
|
void Renderer::SetColorMask()
|
||||||
|
@ -15,7 +15,7 @@ public:
|
|||||||
|
|
||||||
void SetColorMask();
|
void SetColorMask();
|
||||||
void SetBlendMode(bool forceUpdate);
|
void SetBlendMode(bool forceUpdate);
|
||||||
bool SetScissorRect();
|
void SetScissorRect();
|
||||||
void SetGenerationMode();
|
void SetGenerationMode();
|
||||||
void SetDepthMode();
|
void SetDepthMode();
|
||||||
void SetLogicOpMode();
|
void SetLogicOpMode();
|
||||||
|
@ -426,55 +426,21 @@ bool Renderer::CheckForResize()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Renderer::SetScissorRect()
|
void Renderer::SetScissorRect()
|
||||||
{
|
{
|
||||||
TargetRectangle rc;
|
EFBRectangle rc;
|
||||||
GetScissorRect(rc);
|
GetScissorRect(rc);
|
||||||
|
|
||||||
if (rc.left < 0) rc.left = 0;
|
if (rc.left < 0) rc.left = 0;
|
||||||
if (rc.right < 0) rc.right = 0;
|
|
||||||
if (rc.top < 0) rc.top = 0;
|
if (rc.top < 0) rc.top = 0;
|
||||||
if (rc.bottom < 0) rc.bottom = 0;
|
|
||||||
|
|
||||||
if (rc.left > EFB_WIDTH) rc.left = EFB_WIDTH;
|
|
||||||
if (rc.right > EFB_WIDTH) rc.right = EFB_WIDTH;
|
if (rc.right > EFB_WIDTH) rc.right = EFB_WIDTH;
|
||||||
if (rc.top > EFB_HEIGHT) rc.top = EFB_HEIGHT;
|
|
||||||
if (rc.bottom > EFB_HEIGHT) rc.bottom = EFB_HEIGHT;
|
if (rc.bottom > EFB_HEIGHT) rc.bottom = EFB_HEIGHT;
|
||||||
|
|
||||||
if (rc.left > rc.right)
|
if (rc.left > rc.right) rc.right = rc.left;
|
||||||
{
|
if (rc.top > rc.bottom) rc.bottom = rc.top;
|
||||||
int temp = rc.right;
|
|
||||||
rc.right = rc.left;
|
|
||||||
rc.left = temp;
|
|
||||||
}
|
|
||||||
if (rc.top > rc.bottom)
|
|
||||||
{
|
|
||||||
int temp = rc.bottom;
|
|
||||||
rc.bottom = rc.top;
|
|
||||||
rc.top = temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc.left = EFBToScaledX(rc.left);
|
TargetRectangle trc = ConvertEFBRectangle(rc);
|
||||||
rc.top = EFBToScaledY(rc.top);
|
D3D::dev->SetScissorRect(trc.AsRECT());
|
||||||
rc.right = EFBToScaledX(rc.right);
|
|
||||||
rc.bottom = EFBToScaledY(rc.bottom);
|
|
||||||
|
|
||||||
// Check that the coordinates are good
|
|
||||||
if (rc.right != rc.left && rc.bottom != rc.top)
|
|
||||||
{
|
|
||||||
D3D::dev->SetScissorRect(rc.AsRECT());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//WARN_LOG(VIDEO, "Bad scissor rectangle: %i %i %i %i", rc.left, rc.top, rc.right, rc.bottom);
|
|
||||||
rc.left = 0;
|
|
||||||
rc.top = 0;
|
|
||||||
rc.right = s_target_width;
|
|
||||||
rc.bottom = s_target_height;
|
|
||||||
D3D::dev->SetScissorRect(rc.AsRECT());
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::SetColorMask()
|
void Renderer::SetColorMask()
|
||||||
|
@ -15,7 +15,7 @@ public:
|
|||||||
|
|
||||||
void SetColorMask();
|
void SetColorMask();
|
||||||
void SetBlendMode(bool forceUpdate);
|
void SetBlendMode(bool forceUpdate);
|
||||||
bool SetScissorRect();
|
void SetScissorRect();
|
||||||
void SetGenerationMode();
|
void SetGenerationMode();
|
||||||
void SetDepthMode();
|
void SetDepthMode();
|
||||||
void SetLogicOpMode();
|
void SetLogicOpMode();
|
||||||
|
@ -642,9 +642,9 @@ TargetRectangle Renderer::ConvertEFBRectangle(const EFBRectangle& rc)
|
|||||||
// Renderer::GetTargetHeight() = the fixed ini file setting
|
// Renderer::GetTargetHeight() = the fixed ini file setting
|
||||||
// donkopunchstania - it appears scissorBR is the bottom right pixel inside the scissor box
|
// donkopunchstania - it appears scissorBR is the bottom right pixel inside the scissor box
|
||||||
// therefore the width and height are (scissorBR + 1) - scissorTL
|
// therefore the width and height are (scissorBR + 1) - scissorTL
|
||||||
bool Renderer::SetScissorRect()
|
void Renderer::SetScissorRect()
|
||||||
{
|
{
|
||||||
MathUtil::Rectangle<float> rc;
|
EFBRectangle rc;
|
||||||
GetScissorRect(rc);
|
GetScissorRect(rc);
|
||||||
|
|
||||||
if (rc.left < 0) rc.left = 0;
|
if (rc.left < 0) rc.left = 0;
|
||||||
@ -655,12 +655,8 @@ bool Renderer::SetScissorRect()
|
|||||||
if (rc.left > rc.right) rc.right = rc.left;
|
if (rc.left > rc.right) rc.right = rc.left;
|
||||||
if (rc.top > rc.bottom) rc.bottom = rc.top;
|
if (rc.top > rc.bottom) rc.bottom = rc.top;
|
||||||
|
|
||||||
glScissor(
|
TargetRectangle trc = ConvertEFBRectangle(rc);
|
||||||
EFBToScaledX(rc.left), // x = 0 for example
|
glScissor(trc.left, trc.bottom, trc.GetWidth(), trc.GetHeight());
|
||||||
EFBToScaledY(EFB_HEIGHT - rc.bottom), // y = 0 for example
|
|
||||||
EFBToScaledX(rc.right - rc.left), // width = 640 for example
|
|
||||||
EFBToScaledY(rc.bottom - rc.top)); // height = 480 for example
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::SetColorMask()
|
void Renderer::SetColorMask()
|
||||||
|
@ -15,7 +15,7 @@ public:
|
|||||||
|
|
||||||
void SetColorMask();
|
void SetColorMask();
|
||||||
void SetBlendMode(bool forceUpdate);
|
void SetBlendMode(bool forceUpdate);
|
||||||
bool SetScissorRect();
|
void SetScissorRect();
|
||||||
void SetGenerationMode();
|
void SetGenerationMode();
|
||||||
void SetDepthMode();
|
void SetDepthMode();
|
||||||
void SetLogicOpMode();
|
void SetLogicOpMode();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user