mirror of
https://github.com/thunderbrewhq/thunderbrew
synced 2025-04-21 04:11:43 +03:00
feat(gx): handle blend mode state in d3d backend
This commit is contained in:
parent
56b24bfb3c
commit
6581142c64
src/gx/d3d
@ -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);
|
||||
|
||||
|
@ -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[];
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user