1 /*===========================================================================*/
3 /* Mesa-3.0 DirectX 6 Driver Build 5 */
7 /* http://www.altsoftware.com/ */
9 /* Copyright (c) 1999-1998 alt.software inc. All Rights Reserved */
10 /*===========================================================================*/
12 /*===========================================================================*/
14 /*===========================================================================*/
15 #define SRCBLEND_MAP(gl,d3d,fall) if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwSrcBlendCaps & d3d ) \
17 sprintf( buffer, "SRC Blend: %s -> %s", # gl, # d3d ); \
18 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), buffer )); \
19 pShared->dwSrcBlendCaps[index] = d3d; \
23 sprintf( buffer, "SRC Blend: %s -> %s", # gl, # fall ); \
24 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), buffer )); \
25 pShared->dwSrcBlendCaps[index] = fall; \
27 #define DSTBLEND_MAP(gl,d3d,fall) if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwDestBlendCaps & d3d ) \
29 sprintf( buffer, "DST Blend: %s -> %s", # gl, # d3d ); \
30 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), buffer )); \
31 pShared->dwDestBlendCaps[index] = d3d; \
35 sprintf( buffer, "DST Blend: %s -> %s", # gl, # fall ); \
36 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), buffer )); \
37 pShared->dwDestBlendCaps[index] = fall; \
40 /*===========================================================================*/
41 /* I use this function to handle the fact that the D3D texture blending and */
42 /* OpenGL texture blending functions don't map one to one. Also there is the*/
43 /* problem with cards not supporting all the D3D functions. So I use the CAPS*/
44 /* of the card to make a table of functions that will have defaults for the */
45 /* unsupported functions. */
46 /* So first I fill the table with the fallback function then I check to see */
47 /* if the card supports the requested function. If it does I replace the */
48 /* default thats already in the array. Now order does matter as I used an */
49 /* enum type in D3DShared.h so that the mapping would be a little easier. */
50 /*===========================================================================*/
52 /*===========================================================================*/
53 void AlphaBlendTableHAL( PMESAD3DHAL pHAL )
55 PMESAD3DSHARED pShared = &pHAL->shared;
59 DPF(( DBG_FUNC, "AlphaBlendTableHAL();" ));
61 /* Make the fallback for the Source blend. */
62 for( index = 0; index < 14; index++ )
67 SRCBLEND_MAP( GL_ZERO, D3DBLEND_ZERO, D3DBLEND_ONE );
70 SRCBLEND_MAP( GL_ONE, D3DBLEND_ONE, D3DBLEND_ONE );
73 SRCBLEND_MAP( GL_DST_COLOR, D3DBLEND_DESTCOLOR, D3DBLEND_ONE );
75 case s_one_minus_dst_color:
76 SRCBLEND_MAP( GL_ONE_MINUS_DST_COLOR, D3DBLEND_INVDESTCOLOR, D3DBLEND_ONE );
79 SRCBLEND_MAP( GL_SRC_ALPHA, D3DBLEND_SRCALPHA, D3DBLEND_ONE );
81 case s_one_minus_src_alpha:
82 SRCBLEND_MAP( GL_ONE_MINUS_SRC_ALPHA, D3DBLEND_INVSRCALPHA, D3DBLEND_ONE );
85 SRCBLEND_MAP( GL_DST_ALPHA, D3DBLEND_DESTALPHA, D3DBLEND_ONE );
87 case s_one_minus_dst_alpha:
88 SRCBLEND_MAP( GL_ONE_MINUS_DST_ALPHA, D3DBLEND_INVDESTALPHA, D3DBLEND_ONE );
90 case s_src_alpha_saturate:
91 SRCBLEND_MAP( GL_SRC_ALPHA_SATURATE, D3DBLEND_SRCALPHASAT, D3DBLEND_ONE );
93 case s_constant_color:
94 SRCBLEND_MAP( GL_CONSTANT_COLOR, D3DBLEND_SRCCOLOR, D3DBLEND_ONE );
96 case s_one_minus_constant_color:
97 SRCBLEND_MAP( GL_ONE_MINUS_CONSTANT_COLOR, D3DBLEND_INVSRCCOLOR, D3DBLEND_ONE );
99 case s_constant_alpha:
100 SRCBLEND_MAP( GL_CONSTANT_ALPHA, D3DBLEND_BOTHSRCALPHA, D3DBLEND_ONE );
102 case s_one_minus_constant_alpha:
103 SRCBLEND_MAP( GL_ONE_MINUS_CONSTANT_ALPHA, D3DBLEND_BOTHINVSRCALPHA, D3DBLEND_ONE );
108 /* Make the fallback for the Destination blend. */
109 for( index = 0; index < 14; index++ )
114 DSTBLEND_MAP( GL_ZERO, D3DBLEND_ZERO, D3DBLEND_ONE );
117 DSTBLEND_MAP( GL_ONE, D3DBLEND_ONE, D3DBLEND_ONE );
120 DSTBLEND_MAP( GL_SRC_COLOR, D3DBLEND_SRCCOLOR, D3DBLEND_ONE );
122 case d_one_minus_src_color:
123 DSTBLEND_MAP( GL_ONE_MINUS_SRC_COLOR, D3DBLEND_INVSRCCOLOR, D3DBLEND_ONE );
126 DSTBLEND_MAP( GL_SRC_ALPHA, D3DBLEND_SRCALPHA, D3DBLEND_ONE );
128 case d_one_minus_src_alpha:
129 DSTBLEND_MAP( GL_ONE_MINUS_SRC_ALPHA, D3DBLEND_INVSRCALPHA, D3DBLEND_ONE );
132 DSTBLEND_MAP( GL_DST_ALPHA, D3DBLEND_DESTALPHA, D3DBLEND_ONE );
134 case d_one_minus_dst_alpha:
135 DSTBLEND_MAP( GL_ONE_MINUS_DST_ALPHA, D3DBLEND_INVDESTALPHA, D3DBLEND_ONE );
137 case d_constant_color:
138 DSTBLEND_MAP( GL_CONSTANT_COLOR, D3DBLEND_DESTCOLOR, D3DBLEND_ONE );
140 case d_one_minus_constant_color:
141 DSTBLEND_MAP( GL_ONE_MINUS_CONSTANT_COLOR, D3DBLEND_INVDESTCOLOR, D3DBLEND_ONE );
143 case d_constant_alpha:
144 DSTBLEND_MAP( GL_CONSTANT_ALPHAR, D3DBLEND_BOTHSRCALPHA, D3DBLEND_ONE );
146 case d_one_minus_constant_alpha:
147 DSTBLEND_MAP( GL_ONE_MINUS_CONSTANT_ALPHA, D3DBLEND_BOTHINVSRCALPHA, D3DBLEND_ONE );
152 /* Make the fallbacks for the texture functions. */
153 for( index = 0; index < 4; index++ )
157 case d3dtblend_decal:
158 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECAL )
160 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECAL -> D3DTBLEND_DECAL" ));
161 pShared->dwTexFunc[index] = D3DTBLEND_DECAL;
165 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATE )
167 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECAL -> D3DTBLEND_MODULATE" ));
168 pShared->dwTexFunc[index] = D3DTBLEND_MODULATE;
172 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECAL -> D3DTBLEND_ADD" ));
173 pShared->dwTexFunc[index] = D3DTBLEND_ADD;
177 case d3dtblend_decalalpha:
178 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECALALPHA )
180 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECALALPHA -> D3DTBLEND_DECALALPHA" ));
181 pShared->dwTexFunc[index] = D3DTBLEND_DECALALPHA;
185 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECAL )
187 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECALALPA -> D3DTBLEND_DECAL" ));
188 pShared->dwTexFunc[index] = D3DTBLEND_DECAL;
192 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECALALPHA -> D3DTBLEND_ADD" ));
193 pShared->dwTexFunc[index] = D3DTBLEND_ADD;
197 case d3dtblend_modulate:
198 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATE )
200 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATE -> D3DTBLEND_MODULATE" ));
201 pShared->dwTexFunc[index] = D3DTBLEND_MODULATE;
205 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATEALPHA )
207 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATE -> D3DTBLEND_MODULATEALPHA" ));
208 pShared->dwTexFunc[index] = D3DTBLEND_MODULATEALPHA;
210 else if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECAL )
212 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATE -> D3DTBLEND_DECAL" ));
213 pShared->dwTexFunc[index] = D3DTBLEND_DECAL;
217 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATE -> D3DTBLEND_ADD" ));
218 pShared->dwTexFunc[index] = D3DTBLEND_ADD;
222 case d3dtblend_modulatealpha:
223 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATEALPHA )
225 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATEALPHA -> D3DTBLEND_MODULATEALPHA" ));
226 pShared->dwTexFunc[index] = D3DTBLEND_MODULATEALPHA;
230 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATE )
232 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATEALPHA -> D3DTBLEND_MODULATE" ));
233 pShared->dwTexFunc[index] = D3DTBLEND_MODULATE;
235 else if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECAL )
237 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATEALPHA -> D3DTBLEND_DECALE" ));
238 pShared->dwTexFunc[index] = D3DTBLEND_DECAL;
242 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATEALPHA -> D3DTBLEND_ADD" ));
243 pShared->dwTexFunc[index] = D3DTBLEND_ADD;