mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-07 03:13:49 +00:00
Apply scissor for post-processed frame buffer area.
Fixed overexposed areas for games with black boarders.
This commit is contained in:
parent
a567a880fc
commit
05b92c11bb
|
@ -660,6 +660,7 @@ void FrameBufferList::renderBuffer(u32 _address)
|
||||||
}
|
}
|
||||||
GLint dstCoord[4] = { X0 + hOffset, vOffset + (GLint)(dstY0*dstScaleY), hOffset + X1, vOffset + (GLint)(dstY1*dstScaleY) };
|
GLint dstCoord[4] = { X0 + hOffset, vOffset + (GLint)(dstY0*dstScaleY), hOffset + X1, vOffset + (GLint)(dstY1*dstScaleY) };
|
||||||
|
|
||||||
|
ogl.getRender().updateScissor(pBuffer);
|
||||||
PostProcessor::get().process(pBuffer);
|
PostProcessor::get().process(pBuffer);
|
||||||
// glDisable(GL_SCISSOR_TEST) does not affect glBlitFramebuffer, at least on AMD
|
// glDisable(GL_SCISSOR_TEST) does not affect glBlitFramebuffer, at least on AMD
|
||||||
glScissor(0, 0, ogl.getScreenWidth(), ogl.getScreenHeight() + ogl.getHeightOffset());
|
glScissor(0, 0, ogl.getScreenWidth(), ogl.getScreenHeight() + ogl.getHeightOffset());
|
||||||
|
|
|
@ -492,23 +492,22 @@ void _adjustScissorX(f32 & _X0, f32 & _X1, float _scale)
|
||||||
_X1 = (_X1 - halfX) * _scale + halfX;
|
_X1 = (_X1 - halfX) * _scale + halfX;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OGLRender::_updateScissor() const
|
void OGLRender::updateScissor(FrameBuffer * _pBuffer) const
|
||||||
{
|
{
|
||||||
OGLVideo & ogl = video();
|
OGLVideo & ogl = video();
|
||||||
f32 scaleX, scaleY;
|
f32 scaleX, scaleY;
|
||||||
u32 heightOffset, screenHeight;
|
u32 heightOffset, screenHeight;
|
||||||
FrameBuffer * pCurrentBuffer = frameBufferList().getCurrent();
|
if (_pBuffer == NULL) {
|
||||||
if (pCurrentBuffer == NULL) {
|
|
||||||
scaleX = ogl.getScaleX();
|
scaleX = ogl.getScaleX();
|
||||||
scaleY = ogl.getScaleY();
|
scaleY = ogl.getScaleY();
|
||||||
heightOffset = ogl.getHeightOffset();
|
heightOffset = ogl.getHeightOffset();
|
||||||
screenHeight = VI.height;
|
screenHeight = VI.height;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
scaleX = pCurrentBuffer->m_scaleX;
|
scaleX = _pBuffer->m_scaleX;
|
||||||
scaleY = pCurrentBuffer->m_scaleY;
|
scaleY = _pBuffer->m_scaleY;
|
||||||
heightOffset = 0;
|
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;
|
float SX0 = gDP.scissor.ulx;
|
||||||
|
@ -589,7 +588,7 @@ void OGLRender::_updateStates(RENDER_STATE _renderState) const
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gDP.changed & CHANGED_SCISSOR)
|
if (gDP.changed & CHANGED_SCISSOR)
|
||||||
_updateScissor();
|
updateScissor(frameBufferList().getCurrent());
|
||||||
|
|
||||||
if (gSP.changed & CHANGED_VIEWPORT)
|
if (gSP.changed & CHANGED_VIEWPORT)
|
||||||
_updateViewport();
|
_updateViewport();
|
||||||
|
|
|
@ -71,6 +71,7 @@ public:
|
||||||
SPVertex & getVertex(u32 _v) {return triangles.vertices[_v];}
|
SPVertex & getVertex(u32 _v) {return triangles.vertices[_v];}
|
||||||
void setDMAVerticesSize(u32 _size) { if (triangles.dmaVertices.size() < _size) triangles.dmaVertices.resize(_size); }
|
void setDMAVerticesSize(u32 _size) { if (triangles.dmaVertices.size() < _size) triangles.dmaVertices.resize(_size); }
|
||||||
SPVertex * getDMAVerticesData() { return triangles.dmaVertices.data(); }
|
SPVertex * getDMAVerticesData() { return triangles.dmaVertices.data(); }
|
||||||
|
void updateScissor(FrameBuffer * _pBuffer) const;
|
||||||
|
|
||||||
enum RENDER_STATE {
|
enum RENDER_STATE {
|
||||||
rsNone = 0,
|
rsNone = 0,
|
||||||
|
@ -100,7 +101,6 @@ private:
|
||||||
void _setBlendMode() const;
|
void _setBlendMode() const;
|
||||||
void _updateCullFace() const;
|
void _updateCullFace() const;
|
||||||
void _updateViewport() const;
|
void _updateViewport() const;
|
||||||
void _updateScissor() const;
|
|
||||||
void _updateDepthUpdate() const;
|
void _updateDepthUpdate() const;
|
||||||
void _updateStates(RENDER_STATE _renderState) const;
|
void _updateStates(RENDER_STATE _renderState) const;
|
||||||
void _prepareDrawTriangle(bool _dma);
|
void _prepareDrawTriangle(bool _dma);
|
||||||
|
|
|
@ -332,7 +332,6 @@ PostProcessor & PostProcessor::get()
|
||||||
void _setGLState(FrameBuffer * _pBuffer) {
|
void _setGLState(FrameBuffer * _pBuffer) {
|
||||||
glDisable(GL_DEPTH_TEST);
|
glDisable(GL_DEPTH_TEST);
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
glScissor(0, 0, _pBuffer->m_pTexture->realWidth, _pBuffer->m_pTexture->realHeight);
|
|
||||||
|
|
||||||
static const float vert[] =
|
static const float vert[] =
|
||||||
{
|
{
|
||||||
|
@ -351,7 +350,7 @@ void _setGLState(FrameBuffer * _pBuffer) {
|
||||||
glDisableVertexAttribArray(SC_NUMLIGHTS);
|
glDisableVertexAttribArray(SC_NUMLIGHTS);
|
||||||
glViewport(0, 0, video().getWidth(), video().getHeight());
|
glViewport(0, 0, video().getWidth(), video().getHeight());
|
||||||
gSP.changed |= CHANGED_VIEWPORT | CHANGED_TEXTURE;
|
gSP.changed |= CHANGED_VIEWPORT | CHANGED_TEXTURE;
|
||||||
gDP.changed |= CHANGED_RENDERMODE | CHANGED_SCISSOR;
|
gDP.changed |= CHANGED_RENDERMODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PostProcessor::process(FrameBuffer * _pBuffer)
|
void PostProcessor::process(FrameBuffer * _pBuffer)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user