Support Dual Source Blending in OGL plugin with GLSL.
This commit is contained in:
parent
62b9a779c1
commit
0ccba2b581
|
@ -675,10 +675,18 @@ const char *GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType
|
||||||
{
|
{
|
||||||
// GLSL doesn't do main arguments
|
// GLSL doesn't do main arguments
|
||||||
// Once we switch to GLSL 1.3 we will bind a lot of these.
|
// Once we switch to GLSL 1.3 we will bind a lot of these.
|
||||||
|
|
||||||
WRITE(p, " float4 ocol0;\n");
|
|
||||||
if(dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND)
|
if(dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND)
|
||||||
WRITE(p, " float4 ocol1;\n"); // Will be supported later
|
{
|
||||||
|
// This won't get hit unless we support GL 3.3
|
||||||
|
WRITE(p, " layout(location = 0) out float4 ocol0;\n");
|
||||||
|
WRITE(p, " layout(location = 0, index = 1) out float4 ocol1;\n"); // Will be supported later
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WRITE(p, " float4 ocol0;\n");
|
||||||
|
}
|
||||||
if(DepthTextureEnable)
|
if(DepthTextureEnable)
|
||||||
WRITE(p, " float depth;\n"); // TODO: Passed to Vertex Shader right?
|
WRITE(p, " float depth;\n"); // TODO: Passed to Vertex Shader right?
|
||||||
WRITE(p, " float4 rawpos = gl_FragCoord;\n");
|
WRITE(p, " float4 rawpos = gl_FragCoord;\n");
|
||||||
|
@ -721,7 +729,7 @@ const char *GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType
|
||||||
// alpha test will always fail, so restart the shader and just make it an empty function
|
// alpha test will always fail, so restart the shader and just make it an empty function
|
||||||
WRITE(p, "ocol0 = float4(0);\n");
|
WRITE(p, "ocol0 = float4(0);\n");
|
||||||
WRITE(p, "discard;\n");
|
WRITE(p, "discard;\n");
|
||||||
if(ApiType == API_GLSL)
|
if(ApiType == API_GLSL && dstAlphaMode != DSTALPHA_DUAL_SOURCE_BLEND)
|
||||||
WRITE(p, "gl_FragData[0] = ocol0;\n");
|
WRITE(p, "gl_FragData[0] = ocol0;\n");
|
||||||
if(ApiType != API_D3D11)
|
if(ApiType != API_D3D11)
|
||||||
WRITE(p, "return;\n");
|
WRITE(p, "return;\n");
|
||||||
|
@ -833,7 +841,8 @@ const char *GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType
|
||||||
if(ApiType == API_GLSL)
|
if(ApiType == API_GLSL)
|
||||||
{
|
{
|
||||||
// Once we switch to GLSL 1.3 and bind variables, we won't need to do this
|
// Once we switch to GLSL 1.3 and bind variables, we won't need to do this
|
||||||
WRITE(p, "gl_FragData[0] = ocol0;\n");
|
if (dstAlphaMode != DSTALPHA_DUAL_SOURCE_BLEND)
|
||||||
|
WRITE(p, "gl_FragData[0] = ocol0;\n");
|
||||||
if(DepthTextureEnable)
|
if(DepthTextureEnable)
|
||||||
WRITE(p, "gl_FragDepth = depth;\n");
|
WRITE(p, "gl_FragDepth = depth;\n");
|
||||||
if(dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND)
|
if(dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND)
|
||||||
|
@ -892,8 +901,8 @@ const char *GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType
|
||||||
{
|
{
|
||||||
if(DepthTextureEnable)
|
if(DepthTextureEnable)
|
||||||
WRITE(p, "gl_FragDepth = depth;\n");
|
WRITE(p, "gl_FragDepth = depth;\n");
|
||||||
|
if (dstAlphaMode != DSTALPHA_DUAL_SOURCE_BLEND)
|
||||||
WRITE(p, "gl_FragData[0] = ocol0;\n");
|
WRITE(p, "gl_FragData[0] = ocol0;\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
WRITE(p, "}\n");
|
WRITE(p, "}\n");
|
||||||
|
|
|
@ -177,8 +177,8 @@ void VertexManager::vFlush()
|
||||||
bool useDstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate
|
bool useDstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate
|
||||||
&& bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24;
|
&& bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24;
|
||||||
|
|
||||||
#ifdef USE_DUAL_SOURCE_BLEND
|
// Makes sure we can actually do Dual source blending
|
||||||
bool dualSourcePossible = GLEW_ARB_blend_func_extended;
|
bool dualSourcePossible = g_ActiveConfig.bUseGLSL && g_ActiveConfig.backend_info.bSupportsGLSLBinding;
|
||||||
|
|
||||||
// finally bind
|
// finally bind
|
||||||
FRAGMENTSHADER* ps;
|
FRAGMENTSHADER* ps;
|
||||||
|
@ -201,10 +201,6 @@ void VertexManager::vFlush()
|
||||||
{
|
{
|
||||||
ps = PixelShaderCache::SetShader(DSTALPHA_NONE,g_nativeVertexFmt->m_components);
|
ps = PixelShaderCache::SetShader(DSTALPHA_NONE,g_nativeVertexFmt->m_components);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
bool dualSourcePossible = false;
|
|
||||||
FRAGMENTSHADER* ps = PixelShaderCache::SetShader(DSTALPHA_NONE,g_nativeVertexFmt->m_components);
|
|
||||||
#endif
|
|
||||||
VERTEXSHADER* vs = VertexShaderCache::SetShader(g_nativeVertexFmt->m_components);
|
VERTEXSHADER* vs = VertexShaderCache::SetShader(g_nativeVertexFmt->m_components);
|
||||||
|
|
||||||
if(g_ActiveConfig.bUseGLSL)
|
if(g_ActiveConfig.bUseGLSL)
|
||||||
|
|
Loading…
Reference in New Issue