Added alpha to coverage and anti-aliased lines support.

This commit is contained in:
Branimir Karadžić
2016-03-16 15:09:15 -07:00
parent 9853b5b8f6
commit 8955ebc6c8
11 changed files with 147 additions and 71 deletions

View File

@@ -261,6 +261,7 @@ namespace bgfx { namespace d3d9
{ D3DFMT_NULL, D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, false },
{ D3DFMT_RESZ, D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, false },
{ D3DFMT_RAWZ, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, false },
{ D3DFMT_ATOC, 0, D3DRTYPE_SURFACE, false },
};
static const GUID IID_IDirect3D9 = { 0x81bdcbca, 0x64d4, 0x426d, { 0xae, 0x8d, 0xad, 0x1, 0x47, 0xf4, 0x27, 0x5c } };
@@ -288,9 +289,10 @@ namespace bgfx { namespace d3d9
, m_initialized(false)
, m_amd(false)
, m_nvidia(false)
, m_atocSupport(false)
, m_instancingSupport(false)
, m_timerQuerySupport(false)
, m_occlusionQuerySupport(false)
, m_timerQuerySupport(false)
, m_rtMsaa(false)
{
}
@@ -598,6 +600,10 @@ namespace bgfx { namespace d3d9
|| (m_caps.VertexShaderVersion >= D3DVS_VERSION(3, 0) )
;
m_atocSupport = false
|| s_extendedFormats[ExtendedFormat::Atoc].m_supported
;
if (m_amd
&& s_extendedFormats[ExtendedFormat::Inst].m_supported)
{ // AMD only
@@ -613,7 +619,8 @@ namespace bgfx { namespace d3d9
s_textureFormat[TextureFormat::BC4].m_fmt = s_extendedFormats[ExtendedFormat::Ati1].m_supported ? D3DFMT_ATI1 : D3DFMT_UNKNOWN;
s_textureFormat[TextureFormat::BC5].m_fmt = s_extendedFormats[ExtendedFormat::Ati2].m_supported ? D3DFMT_ATI2 : D3DFMT_UNKNOWN;
g_caps.supported |= m_instancingSupport ? BGFX_CAPS_INSTANCING : 0;
g_caps.supported |= m_instancingSupport ? BGFX_CAPS_INSTANCING : 0;
g_caps.supported |= m_atocSupport ? BGFX_CAPS_ALPHA_TO_COVERAGE : 0;
}
for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii)
@@ -2066,9 +2073,10 @@ namespace bgfx { namespace d3d9
bool m_initialized;
bool m_amd;
bool m_nvidia;
bool m_atocSupport;
bool m_instancingSupport;
bool m_timerQuerySupport;
bool m_occlusionQuerySupport;
bool m_timerQuerySupport;
D3DFORMAT m_fmtDepth;
@@ -3844,6 +3852,11 @@ namespace bgfx { namespace d3d9
DX_CHECK(device->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, (newFlags&BGFX_STATE_MSAA) == BGFX_STATE_MSAA) );
}
if (BGFX_STATE_LINEAA & changedFlags)
{
DX_CHECK(m_device->SetRenderState(D3DRS_ANTIALIASEDLINEENABLE, !!(newFlags&BGFX_STATE_LINEAA) ) );
}
if ( (BGFX_STATE_ALPHA_WRITE|BGFX_STATE_RGB_WRITE) & changedFlags)
{
uint32_t writeEnable = (newFlags&BGFX_STATE_ALPHA_WRITE) ? D3DCOLORWRITEENABLE_ALPHA : 0;
@@ -3851,12 +3864,26 @@ namespace bgfx { namespace d3d9
DX_CHECK(device->SetRenderState(D3DRS_COLORWRITEENABLE, writeEnable) );
}
if ( (BGFX_STATE_BLEND_MASK|BGFX_STATE_BLEND_EQUATION_MASK) & changedFlags
if ( ( (0
| BGFX_STATE_BLEND_MASK
| BGFX_STATE_BLEND_EQUATION_MASK
| BGFX_STATE_BLEND_ALPHA_TO_COVERAGE
) & changedFlags)
|| blendFactor != draw.m_rgba)
{
bool enabled = !!(BGFX_STATE_BLEND_MASK & newFlags);
DX_CHECK(device->SetRenderState(D3DRS_ALPHABLENDENABLE, enabled) );
if (m_atocSupport
&& BGFX_STATE_BLEND_ALPHA_TO_COVERAGE & changedFlags)
{
DX_CHECK(m_device->SetRenderState(D3DRS_ADAPTIVETESS_Y
, !!(newFlags&BGFX_STATE_BLEND_ALPHA_TO_COVERAGE)
? D3DFMT_ATOC
: 0
) );
}
if (enabled)
{
const uint32_t blend = uint32_t( (newFlags&BGFX_STATE_BLEND_MASK)>>BGFX_STATE_BLEND_SHIFT);