Grok EFB pixel format to determine whether render target has alpha, thus fixing the "Stage Clear" screen in SSBM.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3588 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
07a767691d
commit
5717f1f15b
|
@ -358,7 +358,7 @@ void BPWritten(const Bypass& bp)
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BPMEM_ZCOMPARE: // Set the Z-Compare
|
case BPMEM_ZCOMPARE: // Set the Z-Compare and EFB pixel format
|
||||||
case BPMEM_TEXINVALIDATE: // Used, if game has manual control the Texture Cache, which we don't allow
|
case BPMEM_TEXINVALIDATE: // Used, if game has manual control the Texture Cache, which we don't allow
|
||||||
case BPMEM_MIPMAP_STRIDE: // MipMap Stride Channel
|
case BPMEM_MIPMAP_STRIDE: // MipMap Stride Channel
|
||||||
case BPMEM_COPYYSCALE: // Display Copy Y Scale
|
case BPMEM_COPYYSCALE: // Display Copy Y Scale
|
||||||
|
|
|
@ -156,10 +156,15 @@ void ClearScreen(const Bypass &bp, const TRectangle &multirc)
|
||||||
if (bpmem.blendmode.colorupdate || bpmem.blendmode.alphaupdate)
|
if (bpmem.blendmode.colorupdate || bpmem.blendmode.alphaupdate)
|
||||||
{
|
{
|
||||||
u32 clearColor = (bpmem.clearcolorAR << 16) | bpmem.clearcolorGB;
|
u32 clearColor = (bpmem.clearcolorAR << 16) | bpmem.clearcolorGB;
|
||||||
|
|
||||||
|
// Alpha may or may not be present depending on the EFB pixel format.
|
||||||
|
GLclampf clearAlpha = (bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24) ?
|
||||||
|
((clearColor>>24) & 0xff)*(1/255.0f) : 1.0f;
|
||||||
|
|
||||||
glClearColor(((clearColor>>16) & 0xff)*(1/255.0f),
|
glClearColor(((clearColor>>16) & 0xff)*(1/255.0f),
|
||||||
((clearColor>>8 ) & 0xff)*(1/255.0f),
|
((clearColor>>8 ) & 0xff)*(1/255.0f),
|
||||||
((clearColor>>0 ) & 0xff)*(1/255.0f),
|
((clearColor>>0 ) & 0xff)*(1/255.0f),
|
||||||
((clearColor>>24) & 0xff)*(1/255.0f));
|
clearAlpha);
|
||||||
bits |= GL_COLOR_BUFFER_BIT;
|
bits |= GL_COLOR_BUFFER_BIT;
|
||||||
}
|
}
|
||||||
if (bpmem.zmode.updateenable)
|
if (bpmem.zmode.updateenable)
|
||||||
|
|
|
@ -25,6 +25,17 @@ void FramebufferManager::Init(int targetWidth, int targetHeight, int msaaSamples
|
||||||
m_msaaSamples = msaaSamples;
|
m_msaaSamples = msaaSamples;
|
||||||
m_msaaCoverageSamples = msaaCoverageSamples;
|
m_msaaCoverageSamples = msaaCoverageSamples;
|
||||||
|
|
||||||
|
// The EFB can be set to different pixel formats by the game through the
|
||||||
|
// BPMEM_ZCOMPARE register (which should probably have a different name).
|
||||||
|
// They are:
|
||||||
|
// - 24-bit RGB (8-bit components) with 24-bit Z
|
||||||
|
// - 24-bit RGBA (6-bit components) with 24-bit Z
|
||||||
|
// - Multisampled 16-bit RGB (5-6-5 format) with 16-bit Z
|
||||||
|
// We only use one EFB format here: 32-bit ARGB with 24-bit Z.
|
||||||
|
// Multisampling depends on user settings.
|
||||||
|
// The distinction becomes important for certain operations, i.e. the
|
||||||
|
// alpha channel should be ignored if the EFB does not have one.
|
||||||
|
|
||||||
// Create EFB target.
|
// Create EFB target.
|
||||||
|
|
||||||
glGenFramebuffersEXT(1, &m_efbFramebuffer);
|
glGenFramebuffersEXT(1, &m_efbFramebuffer);
|
||||||
|
|
Loading…
Reference in New Issue