mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-22 10:49:05 +02:00
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:
1 parent
7af7b2bc6d
commit
5ff3e6a5e7
5 files changed
+47
-17
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user