diff --git a/plugins/GSdx/GSRendererDX.h b/plugins/GSdx/GSRendererDX.h index e4c161da73..574d635811 100644 --- a/plugins/GSdx/GSRendererDX.h +++ b/plugins/GSdx/GSRendererDX.h @@ -29,8 +29,7 @@ class GSRendererDX : public GSRendererHW GSVector2 m_pixelcenter; bool m_logz; bool m_fba; - int m_pixoff_x; - int m_pixoff_y; + bool UserHacks_HalfPixelOffset; protected: int m_topology; @@ -45,8 +44,7 @@ public: { m_logz = !!theApp.GetConfig("logz", 0); m_fba = !!theApp.GetConfig("fba", 1); - m_pixoff_x = theApp.GetConfig("pixoff_x", 0); - m_pixoff_y = theApp.GetConfig("pixoff_y", 0); + UserHacks_HalfPixelOffset = !!theApp.GetConfig("UserHacks_HalfPixelOffset", 0); } virtual ~GSRendererDX() @@ -192,11 +190,25 @@ public: float sx = 2.0f * rt->GetScale().x / (rt->GetWidth() << 4); float sy = 2.0f * rt->GetScale().y / (rt->GetHeight() << 4); - float ox = (float)(int)context->XYOFFSET.OFX + m_pixoff_x; - float oy = (float)(int)context->XYOFFSET.OFY + m_pixoff_y; + float ox = (float)(int)context->XYOFFSET.OFX; + float oy = (float)(int)context->XYOFFSET.OFY; float ox2 = 2.0f * m_pixelcenter.x / rt->GetWidth(); float oy2 = 2.0f * m_pixelcenter.y / rt->GetHeight(); - + + //This hack subtracts around half a pixel from OFX and OFY. (Cannot do this directly, + //because DX10 and DX9 have a different pixel center.) + // + //The resulting shifted output aligns better with common blending / corona / blurring effects, + //but introduces a few bad pixels on the edges. + if (UserHacks_HalfPixelOffset == true) + { + //DX9 has pixelcenter set to 0.0, so give it some value here + if (m_pixelcenter.x == 0 && m_pixelcenter.y == 0) { ox2 = oy2 = -0.00035f; } + + if (ox != 0) { ox2 *= upscale_Multiplier(); } + if (oy != 0) { oy2 *= upscale_Multiplier(); } + } + vs_cb.VertexScale = GSVector4(sx, -sy, 1.0f / UINT_MAX, 0.0f); vs_cb.VertexOffset = GSVector4(ox * sx + ox2 + 1, -(oy * sy + oy2 + 1), 0.0f, -1.0f); // gs diff --git a/plugins/GSdx/GSTextureCache.cpp b/plugins/GSdx/GSTextureCache.cpp index ed336cbf69..ada538edc4 100644 --- a/plugins/GSdx/GSTextureCache.cpp +++ b/plugins/GSdx/GSTextureCache.cpp @@ -638,27 +638,6 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con GSVector4 dr(0, 0, w, h); -#ifdef USE_UPSCALE_HACKS - float multiplier = (float) m_renderer->upscale_Multiplier()-1; - //dr += a few pixels, to fight blur/brightness layers beeing more offset the more we upscale - if(w > dstsize.x) - { - scale.x = (float)dstsize.x / tw; - dr.z = (float)dstsize.x * scale.x / dst->m_texture->GetScale().x; - w = dstsize.x; - dr += GSVector4 (0.25f*multiplier, 0.0f, 0.25f*multiplier, 0.0f); - } - else dr += GSVector4 (0.500f*multiplier, 0.0f, 0.500f*multiplier, 0.0f); - - if(h > dstsize.y) - { - scale.y = (float)dstsize.y / th; - dr.w = (float)dstsize.y * scale.y / dst->m_texture->GetScale().y; - h = dstsize.y; - dr += GSVector4 (0.0f, 0.25f*multiplier, 0.0f, 0.25f*multiplier); - } - else dr += GSVector4 (0.0f, 0.5f*multiplier, 0.0f, 0.5f*multiplier); -#else if(w > dstsize.x) { scale.x = (float)dstsize.x / tw; @@ -672,7 +651,6 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con dr.w = (float)dstsize.y * scale.y / dst->m_texture->GetScale().y; h = dstsize.y; } -#endif GSVector4 sr(0, 0, w, h);