Avoid polluting glstate in GetTempFBO().

Since we do this "late", we might overwrite important settings, such as
stencil, color masks, etc.

This affects both depal and fbo shader blending.

Didn't do it for all ClearBuffer()s, since I'm worried some might be
intentionally resetting state.
This commit is contained in:
Unknown W. Brackets committed 2015-11-03 22:37:19 -08:00
1 parent 7af7b2bc6d
commit 5ff3e6a5e7
5 files changed
+47 -17

No files matched your search

+1 -1
View File
@@ -214,7 +214,7 @@ protected:
void UpdateSize();
virtual void DisableState() = 0;
virtual void ClearBuffer() = 0;
virtual void ClearBuffer(bool keepState = false) = 0;
virtual void ClearDepthBuffer() = 0;
virtual void FlushBeforeCopy() = 0;
virtual void DecimateFBOs() = 0;
+22 -7
View File
@@ -44,13 +44,28 @@ void ShowScreenResolution();
namespace DX9 {
static void ConvertFromRGBA8888(u8 *dst, u8 *src, u32 dstStride, u32 srcStride, u32 width, u32 height, GEBufferFormat format);
void FramebufferManagerDX9::ClearBuffer() {
dxstate.scissorTest.disable();
dxstate.depthWrite.set(TRUE);
dxstate.colorMask.set(true, true, true, true);
dxstate.stencilFunc.set(D3DCMP_ALWAYS, 0, 0);
dxstate.stencilMask.set(0xFF);
void FramebufferManagerDX9::ClearBuffer(bool keepState) {
if (keepState) {
dxstate.scissorTest.force(false);
dxstate.depthWrite.force(TRUE);
dxstate.colorMask.force(true, true, true, true);
dxstate.stencilFunc.force(D3DCMP_ALWAYS, 0, 0);
dxstate.stencilMask.force(0xFF);
} else {
dxstate.scissorTest.disable();
dxstate.depthWrite.set(TRUE);
dxstate.colorMask.set(true, true, true, true);
dxstate.stencilFunc.set(D3DCMP_ALWAYS, 0, 0);
dxstate.stencilMask.set(0xFF);
}
pD3Ddevice->Clear(0, NULL, D3DCLEAR_STENCIL|D3DCLEAR_TARGET |D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 0, 0, 0), 0, 0);
if (keepState) {
dxstate.scissorTest.restore();
dxstate.depthWrite.restore();
dxstate.colorMask.restore();
dxstate.stencilFunc.restore();
dxstate.stencilMask.restore();
}
}
void FramebufferManagerDX9::ClearDepthBuffer() {
@@ -577,7 +592,7 @@ namespace DX9 {
if (!fbo)
return fbo;
fbo_bind_as_render_target(fbo);
ClearBuffer();
ClearBuffer(true);
const TempFBO info = {fbo, gpuStats.numFlips};
tempFBOs_[key] = info;
return fbo;
+1 -1
View File
@@ -94,7 +94,7 @@ public:
protected:
virtual void DisableState() override;
virtual void ClearBuffer() override;
virtual void ClearBuffer(bool keepState = false) override;
virtual void ClearDepthBuffer() override;
virtual void FlushBeforeCopy() override;
virtual void DecimateFBOs() override;
+22 -7
View File
@@ -86,12 +86,20 @@ static const char color_vs[] =
void ConvertFromRGBA8888(u8 *dst, const u8 *src, u32 dstStride, u32 srcStride, u32 width, u32 height, GEBufferFormat format);
void FramebufferManager::ClearBuffer() {
glstate.scissorTest.disable();
glstate.depthWrite.set(GL_TRUE);
glstate.colorMask.set(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glstate.stencilFunc.set(GL_ALWAYS, 0, 0);
glstate.stencilMask.set(0xFF);
void FramebufferManager::ClearBuffer(bool keepState) {
if (keepState) {
glstate.scissorTest.force(false);
glstate.depthWrite.force(GL_TRUE);
glstate.colorMask.force(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glstate.stencilFunc.force(GL_ALWAYS, 0, 0);
glstate.stencilMask.force(0xFF);
} else {
glstate.scissorTest.disable();
glstate.depthWrite.set(GL_TRUE);
glstate.colorMask.set(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glstate.stencilFunc.set(GL_ALWAYS, 0, 0);
glstate.stencilMask.set(0xFF);
}
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearStencil(0);
#ifdef USING_GLES2
@@ -100,6 +108,13 @@ void FramebufferManager::ClearBuffer() {
glClearDepth(0.0);
#endif
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
if (keepState) {
glstate.scissorTest.restore();
glstate.depthWrite.restore();
glstate.colorMask.restore();
glstate.stencilFunc.restore();
glstate.stencilMask.restore();
}
}
void FramebufferManager::ClearDepthBuffer() {
@@ -859,7 +874,7 @@ FBO *FramebufferManager::GetTempFBO(u16 w, u16 h, FBOColorDepth depth) {
if (!fbo)
return fbo;
fbo_bind_as_render_target(fbo);
ClearBuffer();
ClearBuffer(true);
const TempFBO info = {fbo, gpuStats.numFlips};
tempFBOs_[key] = info;
return fbo;
+1 -1
View File
@@ -124,7 +124,7 @@ public:
protected:
virtual void DisableState() override;
virtual void ClearBuffer() override;
virtual void ClearBuffer(bool keepState = false) override;
virtual void ClearDepthBuffer() override;
virtual void FlushBeforeCopy() override;
virtual void DecimateFBOs() override;