1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00

Apply scissor for post-processed frame buffer area.

Fixed overexposed areas for games with black boarders.
This commit is contained in:
Sergey Lipskiy 2015-04-30 15:13:40 +06:00
parent a567a880fc
commit 05b92c11bb
4 changed files with 9 additions and 10 deletions

View File

@ -660,6 +660,7 @@ void FrameBufferList::renderBuffer(u32 _address)
}
GLint dstCoord[4] = { X0 + hOffset, vOffset + (GLint)(dstY0*dstScaleY), hOffset + X1, vOffset + (GLint)(dstY1*dstScaleY) };
ogl.getRender().updateScissor(pBuffer);
PostProcessor::get().process(pBuffer);
// glDisable(GL_SCISSOR_TEST) does not affect glBlitFramebuffer, at least on AMD
glScissor(0, 0, ogl.getScreenWidth(), ogl.getScreenHeight() + ogl.getHeightOffset());

View File

@ -492,23 +492,22 @@ void _adjustScissorX(f32 & _X0, f32 & _X1, float _scale)
_X1 = (_X1 - halfX) * _scale + halfX;
}
void OGLRender::_updateScissor() const
void OGLRender::updateScissor(FrameBuffer * _pBuffer) const
{
OGLVideo & ogl = video();
f32 scaleX, scaleY;
u32 heightOffset, screenHeight;
FrameBuffer * pCurrentBuffer = frameBufferList().getCurrent();
if (pCurrentBuffer == NULL) {
if (_pBuffer == NULL) {
scaleX = ogl.getScaleX();
scaleY = ogl.getScaleY();
heightOffset = ogl.getHeightOffset();
screenHeight = VI.height;
}
else {
scaleX = pCurrentBuffer->m_scaleX;
scaleY = pCurrentBuffer->m_scaleY;
scaleX = _pBuffer->m_scaleX;
scaleY = _pBuffer->m_scaleY;
heightOffset = 0;
screenHeight = (pCurrentBuffer->m_height == 0) ? VI.height : pCurrentBuffer->m_height;
screenHeight = (_pBuffer->m_height == 0) ? VI.height : _pBuffer->m_height;
}
float SX0 = gDP.scissor.ulx;
@ -589,7 +588,7 @@ void OGLRender::_updateStates(RENDER_STATE _renderState) const
}
if (gDP.changed & CHANGED_SCISSOR)
_updateScissor();
updateScissor(frameBufferList().getCurrent());
if (gSP.changed & CHANGED_VIEWPORT)
_updateViewport();

View File

@ -71,6 +71,7 @@ public:
SPVertex & getVertex(u32 _v) {return triangles.vertices[_v];}
void setDMAVerticesSize(u32 _size) { if (triangles.dmaVertices.size() < _size) triangles.dmaVertices.resize(_size); }
SPVertex * getDMAVerticesData() { return triangles.dmaVertices.data(); }
void updateScissor(FrameBuffer * _pBuffer) const;
enum RENDER_STATE {
rsNone = 0,
@ -100,7 +101,6 @@ private:
void _setBlendMode() const;
void _updateCullFace() const;
void _updateViewport() const;
void _updateScissor() const;
void _updateDepthUpdate() const;
void _updateStates(RENDER_STATE _renderState) const;
void _prepareDrawTriangle(bool _dma);

View File

@ -332,7 +332,6 @@ PostProcessor & PostProcessor::get()
void _setGLState(FrameBuffer * _pBuffer) {
glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glScissor(0, 0, _pBuffer->m_pTexture->realWidth, _pBuffer->m_pTexture->realHeight);
static const float vert[] =
{
@ -351,7 +350,7 @@ void _setGLState(FrameBuffer * _pBuffer) {
glDisableVertexAttribArray(SC_NUMLIGHTS);
glViewport(0, 0, video().getWidth(), video().getHeight());
gSP.changed |= CHANGED_VIEWPORT | CHANGED_TEXTURE;
gDP.changed |= CHANGED_RENDERMODE | CHANGED_SCISSOR;
gDP.changed |= CHANGED_RENDERMODE;
}
void PostProcessor::process(FrameBuffer * _pBuffer)