Files
pcsx2/plugins/GSdx/GSRendererOGL.h
T
Gregory Hainaut 61a7c747e1 gsdx-ogl: alternate implementation of half pixel offset
The previous implementation of HPO adds an offset on vertex position. It
doesn't always work beside it moves the rendering window.

The new implementation will add a texture offset so that instead to sample
the middle of the GS texel, we will sample the middle of the real texture texel.

It must be manually enabled with
* UserHacks_HalfPixelOffset_New = 1 (keep a small offset as intended by GS effect)
* UserHacks_HalfPixelOffset_New = 2 (no offset)

v2: always apply a 0.5 offset in case of float coordinates (Tales of Abyss)
Might break other games but few of them uses float coordinates to read
back the target
2016-11-29 17:22:02 +01:00

99 lines
2.8 KiB
C++

/*
* Copyright (C) 2011-2011 Gregory hainaut
* Copyright (C) 2007-2009 Gabest
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This Program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Make; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA USA.
* http://www.gnu.org/copyleft/gpl.html
*
*/
#pragma once
#include "GSRendererHW.h"
#include "GSRenderer.h"
#include "GSTextureCacheOGL.h"
#include "GSVertexHW.h"
class GSRendererOGL final : public GSRendererHW
{
enum PRIM_OVERLAP {
PRIM_OVERLAP_UNKNOW,
PRIM_OVERLAP_YES,
PRIM_OVERLAP_NO
};
enum ACC_BLEND {
ACC_BLEND_NONE = 0,
ACC_BLEND_FREE = 1,
ACC_BLEND_SPRITE = 2,
ACC_BLEND_CCLIP_DALPHA = 3,
ACC_BLEND_FULL = 4,
ACC_BLEND_ULTRA = 5
};
private:
bool m_accurate_date;
int m_sw_blending;
PRIM_OVERLAP m_prim_overlap;
vector<size_t> m_drawlist;
unsigned int UserHacks_TCOffset;
float UserHacks_TCO_x, UserHacks_TCO_y;
bool UserHacks_merge_sprite;
bool UserHacks_unscale_pt_ln;
int UserHacks_HPO;
GSDeviceOGL::VSConstantBuffer vs_cb;
GSDeviceOGL::PSConstantBuffer ps_cb;
GSVector4i ComputeBoundingBox(const GSVector2& rtscale, const GSVector2i& rtsize);
bool m_require_one_barrier;
bool m_require_full_barrier;
GSDeviceOGL::VSSelector m_vs_sel;
GSDeviceOGL::GSSelector m_gs_sel;
GSDeviceOGL::PSSelector m_ps_sel;
GSDeviceOGL::PSSamplerSelector m_ps_ssel;
GSDeviceOGL::OMColorMaskSelector m_om_csel;
GSDeviceOGL::OMDepthStencilSelector m_om_dssel;
private:
inline void ResetStates();
inline void Lines2Sprites();
inline void SetupIA(const float& sx, const float& sy);
inline void RealignTargetTextureCoordinate(const GSTextureCache::Source* tex);
inline void EmulateTextureShuffleAndFbmask();
inline void EmulateChannelShuffle(GSTexture** rt, const GSTextureCache::Source* tex);
inline void EmulateBlending(bool DATE_GL42);
inline void EmulateTextureSampler(const GSTextureCache::Source* tex);
inline void EmulateAtst(const int pass, const GSTextureCache::Source* tex);
inline void EmulateZbuffer();
public:
GSRendererOGL();
virtual ~GSRendererOGL() {};
bool CreateDevice(GSDevice* dev);
void DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* tex) final;
PRIM_OVERLAP PrimitiveOverlap();
void SendDraw();
};