D3D11: Prepare for dual src blending support

This commit is contained in:
Henrik Rydgård 2017-02-12 17:10:04 +01:00
parent 3b12ac5f05
commit 328201978f
4 changed files with 27 additions and 32 deletions

View file

@ -75,7 +75,6 @@ struct SamplerCacheKey {
}
};
class FramebufferManagerCommon;
class TextureCacheCommon {

View file

@ -506,8 +506,9 @@ void GPU_D3D11::CheckGPUFeatures() {
features |= GPU_SUPPORTS_TEXTURE_LOD_CONTROL;
features |= GPU_PREFER_CPU_DOWNLOAD;
features |= GPU_SUPPORTS_ACCURATE_DEPTH;
features |= GPU_SUPPORTS_ANISOTROPY;
///features |= GPU_SUPPORTS_ANISOTROPY;
features |= GPU_SUPPORTS_OES_TEXTURE_NPOT;
//features |= GPU_SUPPORTS_DUALSOURCE_BLEND;
// features |= GPU_SUPPORTS_ANY_COPY_IMAGE;

View file

@ -247,27 +247,6 @@ void TextureCacheD3D11::UpdateSamplingParams(TexCacheEntry &entry, SamplerCacheK
key.sClamp = sClamp;
key.tClamp = tClamp;
key.maxLevel = entry.maxLevel;
/*
if (entry.maxLevel != 0) {
if (force || entry.lodBias != lodBias) {
if (gstate_c.Supports(GPU_SUPPORTS_TEXTURE_LOD_CONTROL)) {
GETexLevelMode mode = gstate.getTexLevelMode();
switch (mode) {
case GE_TEXLEVEL_MODE_AUTO:
// TODO
break;
case GE_TEXLEVEL_MODE_CONST:
// Sigh, LOD_BIAS is not even in ES 3.0..
break;
case GE_TEXLEVEL_MODE_SLOPE:
// TODO
break;
}
}
entry.lodBias = lodBias;
}
}
*/
if (entry.framebuffer) {
WARN_LOG_REPORT_ONCE(wrongFramebufAttach, G3D, "Framebuffer still attached in UpdateSamplingParams()?");

View file

@ -131,11 +131,20 @@ bool GenerateFragmentShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage
WRITE(p, "};\n");
if (lang == HLSL_DX9) {
WRITE(p, "float4 main( PS_IN In ) : COLOR\n");
WRITE(p, "float4 main( PS_IN In ) : COLOR {\n");
} else {
WRITE(p, "float4 main( PS_IN In ) : SV_Target\n");
WRITE(p, "struct PS_OUT {\n");
if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) {
WRITE(p, " float4 target : SV_Target0;\n");
WRITE(p, " float4 target1 : SV_Target1;\n");
}
else {
WRITE(p, " float4 target : SV_Target;\n");
}
WRITE(p, "};\n");
WRITE(p, "PS_OUT main( PS_IN In ) {\n");
WRITE(p, " PS_OUT outfragment;\n");
}
WRITE(p, "{\n");
if (isModeClear) {
// Clear mode does not allow any fancy shading.
@ -375,11 +384,6 @@ bool GenerateFragmentShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage
}
switch (stencilToAlpha) {
case REPLACE_ALPHA_DUALSOURCE:
WRITE(p, " v.a = %s;\n", replacedAlpha.c_str());
// TODO: Output the second color as well using original v.a.
break;
case REPLACE_ALPHA_YES:
WRITE(p, " v.a = %s;\n", replacedAlpha.c_str());
break;
@ -401,7 +405,19 @@ bool GenerateFragmentShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage
break;
}
WRITE(p, " return v;\n");
if (lang == HLSL_D3D11) {
if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) {
WRITE(p, " outfragment.target = float4(v.rgb, %s);\n", replacedAlpha.c_str());
WRITE(p, " outfragment.target1 = float4(0.0, 0.0, 0.0, v.a);\n");
WRITE(p, " return outfragment;\n");
}
else {
WRITE(p, " outfragment.target = v;\n");
WRITE(p, " return outfragment;\n");
}
} else {
WRITE(p, " return v;\n");
}
WRITE(p, "}\n");
return true;
}