Merge pull request #1940 from kd-11/master

dx12: Constant color/alpha blending
This commit is contained in:
vlj 2016-07-19 20:27:55 +02:00 committed by GitHub
commit cc30e1aa47
2 changed files with 90 additions and 37 deletions

View File

@ -40,16 +40,10 @@ D3D12_BLEND get_blend_factor(rsx::blend_factor factor)
case rsx::blend_factor::src_alpha_saturate: return D3D12_BLEND_SRC_ALPHA_SAT; case rsx::blend_factor::src_alpha_saturate: return D3D12_BLEND_SRC_ALPHA_SAT;
case rsx::blend_factor::constant_color: case rsx::blend_factor::constant_color:
case rsx::blend_factor::constant_alpha: case rsx::blend_factor::constant_alpha:
{ return D3D12_BLEND_BLEND_FACTOR;
LOG_ERROR(RSX, "Constant blend factor not supported. Using ZERO instead");
return D3D12_BLEND_ZERO;
}
case rsx::blend_factor::one_minus_constant_color: case rsx::blend_factor::one_minus_constant_color:
case rsx::blend_factor::one_minus_constant_alpha: case rsx::blend_factor::one_minus_constant_alpha:
{ return D3D12_BLEND_INV_BLEND_FACTOR;
LOG_ERROR(RSX, "Inv Constant blend factor not supported. Using ONE instead");
return D3D12_BLEND_ONE;
}
} }
throw EXCEPTION("Invalid blend factor (0x%x)", factor); throw EXCEPTION("Invalid blend factor (0x%x)", factor);
} }
@ -71,16 +65,10 @@ D3D12_BLEND get_blend_factor_alpha(rsx::blend_factor factor)
case rsx::blend_factor::src_alpha_saturate: return D3D12_BLEND_SRC_ALPHA_SAT; case rsx::blend_factor::src_alpha_saturate: return D3D12_BLEND_SRC_ALPHA_SAT;
case rsx::blend_factor::constant_color: case rsx::blend_factor::constant_color:
case rsx::blend_factor::constant_alpha: case rsx::blend_factor::constant_alpha:
{ return D3D12_BLEND_BLEND_FACTOR;
LOG_ERROR(RSX, "Constant blend factor not supported. Using ONE instead");
return D3D12_BLEND_ONE;
}
case rsx::blend_factor::one_minus_constant_color: case rsx::blend_factor::one_minus_constant_color:
case rsx::blend_factor::one_minus_constant_alpha: case rsx::blend_factor::one_minus_constant_alpha:
{ return D3D12_BLEND_INV_BLEND_FACTOR;
LOG_ERROR(RSX, "Inv Constant blend factor not supported. Using ZERO instead");
return D3D12_BLEND_ZERO;
}
} }
throw EXCEPTION("Invalid blend alpha factor (0x%x)", factor); throw EXCEPTION("Invalid blend alpha factor (0x%x)", factor);
} }

View File

@ -62,6 +62,76 @@ void D3D12GSRender::load_program()
if (rsx::method_registers.blend_enabled()) if (rsx::method_registers.blend_enabled())
{ {
//We can use the d3d blend factor as long as !(rgb_factor == alpha && a_factor == color)
rsx::blend_factor sfactor_rgb = rsx::method_registers.blend_func_sfactor_rgb();
rsx::blend_factor dfactor_rgb = rsx::method_registers.blend_func_dfactor_rgb();
rsx::blend_factor sfactor_a = rsx::method_registers.blend_func_sfactor_a();
rsx::blend_factor dfactor_a = rsx::method_registers.blend_func_dfactor_a();
D3D12_BLEND d3d_sfactor_rgb = get_blend_factor(sfactor_rgb);
D3D12_BLEND d3d_dfactor_rgb = get_blend_factor(dfactor_rgb);;
D3D12_BLEND d3d_sfactor_alpha = get_blend_factor_alpha(sfactor_a);
D3D12_BLEND d3d_dfactor_alpha = get_blend_factor_alpha(dfactor_a);
FLOAT BlendColor[4];
//TODO: Check surface color format for u16 colors
{
u8 blend_color_r = rsx::method_registers.blend_color_8b_r();
u8 blend_color_g = rsx::method_registers.blend_color_8b_g();
u8 blend_color_b = rsx::method_registers.blend_color_8b_b();
u8 blend_color_a = rsx::method_registers.blend_color_8b_a();
BlendColor[0] = blend_color_r / 255.f;
BlendColor[1] = blend_color_g / 255.f;
BlendColor[2] = blend_color_b / 255.f;
BlendColor[3] = blend_color_a / 255.f;
}
bool color_blend_possible = true;
if (sfactor_rgb == rsx::blend_factor::constant_alpha ||
dfactor_rgb == rsx::blend_factor::constant_alpha)
{
if (sfactor_rgb == rsx::blend_factor::constant_color ||
dfactor_rgb == rsx::blend_factor::constant_color)
{
//Color information will be destroyed
color_blend_possible = false;
}
else
{
//All components are alpha.
//If an alpha factor refers to constant_color, it only refers to the alpha component, so no need to replace it
BlendColor[0] = BlendColor[1] = BlendColor[2] = BlendColor[3];
}
}
if (!color_blend_possible)
{
LOG_ERROR(RSX, "The constant_color blend factor combination defined is not supported");
auto flatten_d3d12_factor = [](D3D12_BLEND in) -> D3D12_BLEND
{
switch (in)
{
case D3D12_BLEND_BLEND_FACTOR:
return D3D12_BLEND_ONE;
case D3D12_BLEND_INV_BLEND_FACTOR:
return D3D12_BLEND_ZERO;
}
};
d3d_sfactor_rgb = flatten_d3d12_factor(d3d_sfactor_rgb);
d3d_dfactor_rgb = flatten_d3d12_factor(d3d_dfactor_rgb);;
d3d_sfactor_alpha = flatten_d3d12_factor(d3d_sfactor_alpha);
d3d_dfactor_alpha = flatten_d3d12_factor(d3d_dfactor_alpha);
}
else
{
get_current_resource_storage().command_list->OMSetBlendFactor(BlendColor);
}
prop.Blend.RenderTarget[0].BlendEnable = true; prop.Blend.RenderTarget[0].BlendEnable = true;
if (rsx::method_registers.blend_enabled_surface_1()) if (rsx::method_registers.blend_enabled_surface_1())
@ -92,33 +162,33 @@ void D3D12GSRender::load_program()
prop.Blend.RenderTarget[3].BlendOpAlpha = get_blend_op(rsx::method_registers.blend_equation_a()); prop.Blend.RenderTarget[3].BlendOpAlpha = get_blend_op(rsx::method_registers.blend_equation_a());
} }
prop.Blend.RenderTarget[0].SrcBlend = get_blend_factor(rsx::method_registers.blend_func_sfactor_rgb()); prop.Blend.RenderTarget[0].SrcBlend = d3d_sfactor_rgb;
prop.Blend.RenderTarget[0].DestBlend = get_blend_factor(rsx::method_registers.blend_func_dfactor_rgb()); prop.Blend.RenderTarget[0].DestBlend = d3d_dfactor_rgb;
prop.Blend.RenderTarget[0].SrcBlendAlpha = get_blend_factor_alpha(rsx::method_registers.blend_func_sfactor_a()); prop.Blend.RenderTarget[0].SrcBlendAlpha = d3d_sfactor_alpha;
prop.Blend.RenderTarget[0].DestBlendAlpha = get_blend_factor_alpha(rsx::method_registers.blend_func_dfactor_a()); prop.Blend.RenderTarget[0].DestBlendAlpha = d3d_dfactor_alpha;
if (rsx::method_registers.blend_enabled_surface_1()) if (rsx::method_registers.blend_enabled_surface_1())
{ {
prop.Blend.RenderTarget[1].SrcBlend = get_blend_factor(rsx::method_registers.blend_func_sfactor_rgb()); prop.Blend.RenderTarget[1].SrcBlend = d3d_sfactor_rgb;
prop.Blend.RenderTarget[1].DestBlend = get_blend_factor(rsx::method_registers.blend_func_dfactor_rgb()); prop.Blend.RenderTarget[1].DestBlend = d3d_dfactor_rgb;
prop.Blend.RenderTarget[1].SrcBlendAlpha = get_blend_factor_alpha(rsx::method_registers.blend_func_sfactor_a()); prop.Blend.RenderTarget[1].SrcBlendAlpha = d3d_sfactor_alpha;
prop.Blend.RenderTarget[1].DestBlendAlpha = get_blend_factor_alpha(rsx::method_registers.blend_func_dfactor_a()); prop.Blend.RenderTarget[1].DestBlendAlpha = d3d_dfactor_alpha;
} }
if (rsx::method_registers.blend_enabled_surface_2()) if (rsx::method_registers.blend_enabled_surface_2())
{ {
prop.Blend.RenderTarget[2].SrcBlend = get_blend_factor(rsx::method_registers.blend_func_sfactor_rgb()); prop.Blend.RenderTarget[2].SrcBlend = d3d_sfactor_rgb;
prop.Blend.RenderTarget[2].DestBlend = get_blend_factor(rsx::method_registers.blend_func_dfactor_rgb()); prop.Blend.RenderTarget[2].DestBlend = d3d_dfactor_rgb;
prop.Blend.RenderTarget[2].SrcBlendAlpha = get_blend_factor_alpha(rsx::method_registers.blend_func_sfactor_a()); prop.Blend.RenderTarget[2].SrcBlendAlpha = d3d_sfactor_alpha;
prop.Blend.RenderTarget[2].DestBlendAlpha = get_blend_factor_alpha(rsx::method_registers.blend_func_dfactor_a()); prop.Blend.RenderTarget[2].DestBlendAlpha = d3d_dfactor_alpha;
} }
if (rsx::method_registers.blend_enabled_surface_3()) if (rsx::method_registers.blend_enabled_surface_3())
{ {
prop.Blend.RenderTarget[3].SrcBlend = get_blend_factor(rsx::method_registers.blend_func_sfactor_rgb()); prop.Blend.RenderTarget[3].SrcBlend = d3d_sfactor_rgb;
prop.Blend.RenderTarget[3].DestBlend = get_blend_factor(rsx::method_registers.blend_func_dfactor_rgb()); prop.Blend.RenderTarget[3].DestBlend = d3d_dfactor_rgb;
prop.Blend.RenderTarget[3].SrcBlendAlpha = get_blend_factor_alpha(rsx::method_registers.blend_func_sfactor_a()); prop.Blend.RenderTarget[3].SrcBlendAlpha = d3d_sfactor_alpha;
prop.Blend.RenderTarget[3].DestBlendAlpha = get_blend_factor_alpha(rsx::method_registers.blend_func_dfactor_a()); prop.Blend.RenderTarget[3].DestBlendAlpha = d3d_dfactor_alpha;
} }
} }
@ -128,11 +198,6 @@ void D3D12GSRender::load_program()
prop.Blend.RenderTarget[0].LogicOp = get_logic_op(rsx::method_registers.logic_operation()); prop.Blend.RenderTarget[0].LogicOp = get_logic_op(rsx::method_registers.logic_operation());
} }
// if (m_set_blend_color)
{
// glBlendColor(m_blend_color_r, m_blend_color_g, m_blend_color_b, m_blend_color_a);
// checkForGlError("glBlendColor");
}
prop.DepthStencilFormat = get_depth_stencil_surface_format(rsx::method_registers.surface_depth_fmt()); prop.DepthStencilFormat = get_depth_stencil_surface_format(rsx::method_registers.surface_depth_fmt());
prop.RenderTargetsFormat = get_color_surface_format(rsx::method_registers.surface_color()); prop.RenderTargetsFormat = get_color_surface_format(rsx::method_registers.surface_color());