mirror of https://github.com/PCSX2/pcsx2.git
GSdx: Move BoundingBox to HW render and update d3d11 code to use the gl bounding box as well.
hdr colclip and date uses it.
This commit is contained in:
parent
86327b52a9
commit
7e6c325210
|
@ -465,11 +465,10 @@ void GSRendererDX::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc
|
||||||
|
|
||||||
if (DATE)
|
if (DATE)
|
||||||
{
|
{
|
||||||
GSVector4 s = GSVector4(rtscale.x / rtsize.x, rtscale.y / rtsize.y);
|
GSVector4i dRect = ComputeBoundingBox(rtscale, rtsize);
|
||||||
GSVector4 off = GSVector4(-1.0f, 1.0f);
|
|
||||||
|
|
||||||
GSVector4 src = ((m_vt.m_min.p.xyxy(m_vt.m_max.p) + off.xxyy()) * s.xyxy()).sat(off.zzyy());
|
GSVector4 src = GSVector4(dRect) / GSVector4(rtsize.x, rtsize.y).xyxy();
|
||||||
GSVector4 dst = src * 2.0f + off.xxxx();
|
GSVector4 dst = src * 2.0f - 1.0f;
|
||||||
|
|
||||||
GSVertexPT1 vertices[] =
|
GSVertexPT1 vertices[] =
|
||||||
{
|
{
|
||||||
|
@ -488,8 +487,8 @@ void GSRendererDX::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc
|
||||||
if (hdr_colclip)
|
if (hdr_colclip)
|
||||||
{
|
{
|
||||||
// fprintf(stderr, "COLCLIP HDR mode ENABLED\n");
|
// fprintf(stderr, "COLCLIP HDR mode ENABLED\n");
|
||||||
GSVector4 sRect(0, 0, 1, 1);
|
GSVector4 dRect(ComputeBoundingBox(rtscale, rtsize));
|
||||||
GSVector4 dRect(0, 0, rtsize.x, rtsize.y);
|
GSVector4 sRect = dRect / GSVector4(rtsize.x, rtsize.y).xyxy();
|
||||||
hdr_rt = dev->CreateRenderTarget(rtsize.x, rtsize.y, false, DXGI_FORMAT_R32G32B32A32_FLOAT);
|
hdr_rt = dev->CreateRenderTarget(rtsize.x, rtsize.y, false, DXGI_FORMAT_R32G32B32A32_FLOAT);
|
||||||
// Warning: StretchRect must be called before BeginScene otherwise
|
// Warning: StretchRect must be called before BeginScene otherwise
|
||||||
// vertices will be overwritten. Trust me you don't want to do that.
|
// vertices will be overwritten. Trust me you don't want to do that.
|
||||||
|
@ -674,7 +673,7 @@ void GSRendererDX::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc
|
||||||
const GSVector4& hacked_scissor = m_channel_shuffle ? GSVector4(0, 0, 1024, 1024) : m_context->scissor.in;
|
const GSVector4& hacked_scissor = m_channel_shuffle ? GSVector4(0, 0, 1024, 1024) : m_context->scissor.in;
|
||||||
GSVector4i scissor = GSVector4i(GSVector4(rtscale).xyxy() * hacked_scissor).rintersect(GSVector4i(rtsize).zwxy());
|
GSVector4i scissor = GSVector4i(GSVector4(rtscale).xyxy() * hacked_scissor).rintersect(GSVector4i(rtsize).zwxy());
|
||||||
|
|
||||||
if (hdr_colclip)
|
if (hdr_rt)
|
||||||
dev->OMSetRenderTargets(hdr_rt, ds, &scissor);
|
dev->OMSetRenderTargets(hdr_rt, ds, &scissor);
|
||||||
else
|
else
|
||||||
dev->OMSetRenderTargets(rt, ds, &scissor);
|
dev->OMSetRenderTargets(rt, ds, &scissor);
|
||||||
|
@ -764,8 +763,8 @@ void GSRendererDX::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc
|
||||||
// vertices will be overwritten. Trust me you don't want to do that.
|
// vertices will be overwritten. Trust me you don't want to do that.
|
||||||
if (hdr_rt)
|
if (hdr_rt)
|
||||||
{
|
{
|
||||||
GSVector4 sRect(0, 0, 1, 1);
|
GSVector4 dRect(ComputeBoundingBox(rtscale, rtsize));
|
||||||
GSVector4 dRect(0, 0, rtsize.x, rtsize.y);
|
GSVector4 sRect = dRect / GSVector4(rtsize.x, rtsize.y).xyxy();
|
||||||
dev->StretchRect(hdr_rt, sRect, rt, dRect, ShaderConvert_MOD_256, false);
|
dev->StretchRect(hdr_rt, sRect, rt, dRect, ShaderConvert_MOD_256, false);
|
||||||
|
|
||||||
dev->Recycle(hdr_rt);
|
dev->Recycle(hdr_rt);
|
||||||
|
|
|
@ -489,6 +489,14 @@ GSVector4 GSRendererHW::RealignTargetTextureCoordinate(const GSTextureCache::Sou
|
||||||
return half_offset;
|
return half_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GSVector4i GSRendererHW::ComputeBoundingBox(const GSVector2& rtscale, const GSVector2i& rtsize)
|
||||||
|
{
|
||||||
|
GSVector4 scale = GSVector4(rtscale.x, rtscale.y);
|
||||||
|
GSVector4 offset = GSVector4(-1.0f, 1.0f); // Round value
|
||||||
|
GSVector4 box = m_vt.m_min.p.xyxy(m_vt.m_max.p) + offset.xxyy();
|
||||||
|
return GSVector4i(box * scale.xyxy()).rintersect(GSVector4i(0, 0, rtsize.x, rtsize.y));
|
||||||
|
}
|
||||||
|
|
||||||
void GSRendererHW::MergeSprite(GSTextureCache::Source* tex)
|
void GSRendererHW::MergeSprite(GSTextureCache::Source* tex)
|
||||||
{
|
{
|
||||||
// Upscaling hack to avoid various line/grid issues
|
// Upscaling hack to avoid various line/grid issues
|
||||||
|
|
|
@ -169,6 +169,7 @@ public:
|
||||||
void SetScaling();
|
void SetScaling();
|
||||||
void Lines2Sprites();
|
void Lines2Sprites();
|
||||||
GSVector4 RealignTargetTextureCoordinate(const GSTextureCache::Source* tex);
|
GSVector4 RealignTargetTextureCoordinate(const GSTextureCache::Source* tex);
|
||||||
|
GSVector4i ComputeBoundingBox(const GSVector2& rtscale, const GSVector2i& rtsize);
|
||||||
void MergeSprite(GSTextureCache::Source* tex);
|
void MergeSprite(GSTextureCache::Source* tex);
|
||||||
|
|
||||||
void Reset();
|
void Reset();
|
||||||
|
|
|
@ -964,14 +964,6 @@ GSRendererOGL::PRIM_OVERLAP GSRendererOGL::PrimitiveOverlap()
|
||||||
return overlap;
|
return overlap;
|
||||||
}
|
}
|
||||||
|
|
||||||
GSVector4i GSRendererOGL::ComputeBoundingBox(const GSVector2& rtscale, const GSVector2i& rtsize)
|
|
||||||
{
|
|
||||||
GSVector4 scale = GSVector4(rtscale.x, rtscale.y);
|
|
||||||
GSVector4 offset = GSVector4(-1.0f, 1.0f); // Round value
|
|
||||||
GSVector4 box = m_vt.m_min.p.xyxy(m_vt.m_max.p) + offset.xxyy();
|
|
||||||
return GSVector4i(box * scale.xyxy()).rintersect(GSVector4i(0, 0, rtsize.x, rtsize.y));
|
|
||||||
}
|
|
||||||
|
|
||||||
void GSRendererOGL::SendDraw()
|
void GSRendererOGL::SendDraw()
|
||||||
{
|
{
|
||||||
GSDeviceOGL* dev = (GSDeviceOGL*)m_dev;
|
GSDeviceOGL* dev = (GSDeviceOGL*)m_dev;
|
||||||
|
|
|
@ -59,8 +59,6 @@ class GSRendererOGL final : public GSRendererHW
|
||||||
GSDeviceOGL::VSConstantBuffer vs_cb;
|
GSDeviceOGL::VSConstantBuffer vs_cb;
|
||||||
GSDeviceOGL::PSConstantBuffer ps_cb;
|
GSDeviceOGL::PSConstantBuffer ps_cb;
|
||||||
|
|
||||||
GSVector4i ComputeBoundingBox(const GSVector2& rtscale, const GSVector2i& rtsize);
|
|
||||||
|
|
||||||
bool m_require_one_barrier;
|
bool m_require_one_barrier;
|
||||||
bool m_require_full_barrier;
|
bool m_require_full_barrier;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue