feat(gx): handle blend mode state in d3d backend

This commit is contained in:
fallenoak 2023-03-12 00:11:18 -06:00
parent 56b24bfb3c
commit 6581142c64
2 changed files with 56 additions and 0 deletions

View File

@ -11,6 +11,21 @@ D3DCMPFUNC CGxDeviceD3d::s_cmpFunc[] = {
D3DCMP_LESS,
};
D3DBLEND CGxDeviceD3d::s_dstBlend[] = {
D3DBLEND_ZERO, // GxBlend_Opaque
D3DBLEND_ZERO, // GxBlend_AlphaKey
D3DBLEND_INVSRCALPHA, // GxBlend_Alpha
D3DBLEND_ONE, // GxBlend_Add
D3DBLEND_ZERO, // GxBlend_Mod
D3DBLEND_SRCCOLOR, // GxBlend_Mod2x
D3DBLEND_ONE, // GxBlend_ModAdd
D3DBLEND_ONE, // GxBlend_InvSrcAlphaAdd
D3DBLEND_ZERO, // GxBlend_InvSrcAlphaOpaque
D3DBLEND_ZERO, // GxBlend_SrcAlphaOpaque
D3DBLEND_ONE, // GxBlend_NoAlphaAdd
D3DBLEND_INVBLENDFACTOR, // GxBlend_ConstantAlpha
};
D3DCUBEMAP_FACES CGxDeviceD3d::s_faceTypes[] = {
D3DCUBEMAP_FACE_POSITIVE_X,
D3DCUBEMAP_FACE_NEGATIVE_X,
@ -136,6 +151,21 @@ D3DPRIMITIVETYPE CGxDeviceD3d::s_primitiveConversion[] = {
D3DPT_TRIANGLEFAN, // GxPrim_TriangleFan
};
D3DBLEND CGxDeviceD3d::s_srcBlend[] = {
D3DBLEND_ONE, // GxBlend_Opaque
D3DBLEND_ONE, // GxBlend_AlphaKey
D3DBLEND_SRCALPHA, // GxBlend_Alpha
D3DBLEND_SRCALPHA, // GxBlend_Add
D3DBLEND_DESTCOLOR, // GxBlend_Mod
D3DBLEND_DESTCOLOR, // GxBlend_Mod2x
D3DBLEND_DESTCOLOR, // GxBlend_ModAdd
D3DBLEND_INVSRCALPHA, // GxBlend_InvSrcAlphaAdd
D3DBLEND_INVSRCALPHA, // GxBlend_InvSrcAlphaOpaque
D3DBLEND_SRCALPHA, // GxBlend_SrcAlphaOpaque
D3DBLEND_ONE, // GxBlend_NoAlphaAdd
D3DBLEND_BLENDFACTOR, // GxBlend_ConstantAlpha
};
EGxTexFormat CGxDeviceD3d::s_tolerableTexFmtMapping[] = {
GxTex_Unknown, // GxTex_Unknown
GxTex_Argb4444, // GxTex_Abgr8888
@ -483,6 +513,16 @@ void CGxDeviceD3d::DsSet(EDeviceState state, uint32_t val) {
switch (state) {
// TODO handle other device states
case Ds_SrcBlend: {
this->m_d3dDevice->SetRenderState(D3DRS_SRCBLEND, val);
break;
}
case Ds_DstBlend: {
this->m_d3dDevice->SetRenderState(D3DRS_DESTBLEND, val);
break;
}
case Ds_TssMagFilter0:
case Ds_TssMagFilter1:
case Ds_TssMagFilter2:
@ -837,6 +877,20 @@ void CGxDeviceD3d::IRsSendToHw(EGxRenderState which) {
switch (which) {
// TODO handle all render states
case GxRs_BlendingMode: {
auto blendMode = static_cast<EGxBlend>(static_cast<int32_t>(state->m_value));
if (blendMode < GxBlend_Alpha) {
this->DsSet(Ds_AlphaBlendEnable, 0);
} else {
this->DsSet(Ds_AlphaBlendEnable, 1);
this->DsSet(Ds_SrcBlend, CGxDeviceD3d::s_srcBlend[blendMode]);
this->DsSet(Ds_DstBlend, CGxDeviceD3d::s_dstBlend[blendMode]);
}
break;
}
case GxRs_AlphaRef: {
auto alphaRef = static_cast<int32_t>(state->m_value);

View File

@ -197,6 +197,7 @@ class CGxDeviceD3d : public CGxDevice {
// Static variables
static D3DCMPFUNC s_cmpFunc[];
static D3DBLEND s_dstBlend[];
static D3DCUBEMAP_FACES s_faceTypes[];
static D3DTEXTUREFILTERTYPE s_filterModes[GxTexFilters_Last][3];
static uint32_t s_gxAttribToD3dAttribSize[];
@ -207,6 +208,7 @@ class CGxDeviceD3d : public CGxDevice {
static D3DFORMAT s_GxTexFmtToD3dFmt[];
static EGxTexFormat s_GxTexFmtToUse[];
static D3DPRIMITIVETYPE s_primitiveConversion[];
static D3DBLEND s_srcBlend[];
static EGxTexFormat s_tolerableTexFmtMapping[];
static D3DTEXTUREADDRESS s_wrapModes[];