Convert crlf->lf line endings.
[mesa.git] / src / mesa / drivers / d3d / D3DCAPS.CPP
1 /*===========================================================================*/
2 /* */
3 /* Mesa-3.0 DirectX 6 Driver Build 5 */
4 /* */
5 /* By Leigh McRae */
6 /* */
7 /* http://www.altsoftware.com/ */
8 /* */
9 /* Copyright (c) 1999-1998 alt.software inc. All Rights Reserved */
10 /*===========================================================================*/
11 #include "D3DHAL.h"
12 /*===========================================================================*/
13 /* Macros. */
14 /*===========================================================================*/
15 #define SRCBLEND_MAP(gl,d3d,fall) if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwSrcBlendCaps & d3d ) \
16 { \
17 sprintf( buffer, "SRC Blend: %s -> %s", # gl, # d3d ); \
18 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), buffer )); \
19 pShared->dwSrcBlendCaps[index] = d3d; \
20 } \
21 else \
22 { \
23 sprintf( buffer, "SRC Blend: %s -> %s", # gl, # fall ); \
24 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), buffer )); \
25 pShared->dwSrcBlendCaps[index] = fall; \
26 }
27 #define DSTBLEND_MAP(gl,d3d,fall) if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwDestBlendCaps & d3d ) \
28 { \
29 sprintf( buffer, "DST Blend: %s -> %s", # gl, # d3d ); \
30 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), buffer )); \
31 pShared->dwDestBlendCaps[index] = d3d; \
32 } \
33 else \
34 { \
35 sprintf( buffer, "DST Blend: %s -> %s", # gl, # fall ); \
36 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), buffer )); \
37 pShared->dwDestBlendCaps[index] = fall; \
38 }
39
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 /*===========================================================================*/
51 /* RETURN: */
52 /*===========================================================================*/
53 void AlphaBlendTableHAL( PMESAD3DHAL pHAL )
54 {
55 PMESAD3DSHARED pShared = &pHAL->shared;
56 int index;
57 char buffer[128];
58
59 DPF(( DBG_FUNC, "AlphaBlendTableHAL();" ));
60
61 /* Make the fallback for the Source blend. */
62 for( index = 0; index < 14; index++ )
63 {
64 switch( index )
65 {
66 case s_zero:
67 SRCBLEND_MAP( GL_ZERO, D3DBLEND_ZERO, D3DBLEND_ONE );
68 break;
69 case s_one:
70 SRCBLEND_MAP( GL_ONE, D3DBLEND_ONE, D3DBLEND_ONE );
71 break;
72 case s_dst_color:
73 SRCBLEND_MAP( GL_DST_COLOR, D3DBLEND_DESTCOLOR, D3DBLEND_ONE );
74 break;
75 case s_one_minus_dst_color:
76 SRCBLEND_MAP( GL_ONE_MINUS_DST_COLOR, D3DBLEND_INVDESTCOLOR, D3DBLEND_ONE );
77 break;
78 case s_src_alpha:
79 SRCBLEND_MAP( GL_SRC_ALPHA, D3DBLEND_SRCALPHA, D3DBLEND_ONE );
80 break;
81 case s_one_minus_src_alpha:
82 SRCBLEND_MAP( GL_ONE_MINUS_SRC_ALPHA, D3DBLEND_INVSRCALPHA, D3DBLEND_ONE );
83 break;
84 case s_dst_alpha:
85 SRCBLEND_MAP( GL_DST_ALPHA, D3DBLEND_DESTALPHA, D3DBLEND_ONE );
86 break;
87 case s_one_minus_dst_alpha:
88 SRCBLEND_MAP( GL_ONE_MINUS_DST_ALPHA, D3DBLEND_INVDESTALPHA, D3DBLEND_ONE );
89 break;
90 case s_src_alpha_saturate:
91 SRCBLEND_MAP( GL_SRC_ALPHA_SATURATE, D3DBLEND_SRCALPHASAT, D3DBLEND_ONE );
92 break;
93 case s_constant_color:
94 SRCBLEND_MAP( GL_CONSTANT_COLOR, D3DBLEND_SRCCOLOR, D3DBLEND_ONE );
95 break;
96 case s_one_minus_constant_color:
97 SRCBLEND_MAP( GL_ONE_MINUS_CONSTANT_COLOR, D3DBLEND_INVSRCCOLOR, D3DBLEND_ONE );
98 break;
99 case s_constant_alpha:
100 SRCBLEND_MAP( GL_CONSTANT_ALPHA, D3DBLEND_BOTHSRCALPHA, D3DBLEND_ONE );
101 break;
102 case s_one_minus_constant_alpha:
103 SRCBLEND_MAP( GL_ONE_MINUS_CONSTANT_ALPHA, D3DBLEND_BOTHINVSRCALPHA, D3DBLEND_ONE );
104 break;
105 }
106 }
107
108 /* Make the fallback for the Destination blend. */
109 for( index = 0; index < 14; index++ )
110 {
111 switch( index )
112 {
113 case d_zero:
114 DSTBLEND_MAP( GL_ZERO, D3DBLEND_ZERO, D3DBLEND_ONE );
115 break;
116 case d_one:
117 DSTBLEND_MAP( GL_ONE, D3DBLEND_ONE, D3DBLEND_ONE );
118 break;
119 case d_src_color:
120 DSTBLEND_MAP( GL_SRC_COLOR, D3DBLEND_SRCCOLOR, D3DBLEND_ONE );
121 break;
122 case d_one_minus_src_color:
123 DSTBLEND_MAP( GL_ONE_MINUS_SRC_COLOR, D3DBLEND_INVSRCCOLOR, D3DBLEND_ONE );
124 break;
125 case d_src_alpha:
126 DSTBLEND_MAP( GL_SRC_ALPHA, D3DBLEND_SRCALPHA, D3DBLEND_ONE );
127 break;
128 case d_one_minus_src_alpha:
129 DSTBLEND_MAP( GL_ONE_MINUS_SRC_ALPHA, D3DBLEND_INVSRCALPHA, D3DBLEND_ONE );
130 break;
131 case d_dst_alpha:
132 DSTBLEND_MAP( GL_DST_ALPHA, D3DBLEND_DESTALPHA, D3DBLEND_ONE );
133 break;
134 case d_one_minus_dst_alpha:
135 DSTBLEND_MAP( GL_ONE_MINUS_DST_ALPHA, D3DBLEND_INVDESTALPHA, D3DBLEND_ONE );
136 break;
137 case d_constant_color:
138 DSTBLEND_MAP( GL_CONSTANT_COLOR, D3DBLEND_DESTCOLOR, D3DBLEND_ONE );
139 break;
140 case d_one_minus_constant_color:
141 DSTBLEND_MAP( GL_ONE_MINUS_CONSTANT_COLOR, D3DBLEND_INVDESTCOLOR, D3DBLEND_ONE );
142 break;
143 case d_constant_alpha:
144 DSTBLEND_MAP( GL_CONSTANT_ALPHAR, D3DBLEND_BOTHSRCALPHA, D3DBLEND_ONE );
145 break;
146 case d_one_minus_constant_alpha:
147 DSTBLEND_MAP( GL_ONE_MINUS_CONSTANT_ALPHA, D3DBLEND_BOTHINVSRCALPHA, D3DBLEND_ONE );
148 break;
149 }
150 }
151
152 /* Make the fallbacks for the texture functions. */
153 for( index = 0; index < 4; index++ )
154 {
155 switch( index )
156 {
157 case d3dtblend_decal:
158 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECAL )
159 {
160 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECAL -> D3DTBLEND_DECAL" ));
161 pShared->dwTexFunc[index] = D3DTBLEND_DECAL;
162 }
163 else
164 {
165 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATE )
166 {
167 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECAL -> D3DTBLEND_MODULATE" ));
168 pShared->dwTexFunc[index] = D3DTBLEND_MODULATE;
169 }
170 else
171 {
172 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECAL -> D3DTBLEND_ADD" ));
173 pShared->dwTexFunc[index] = D3DTBLEND_ADD;
174 }
175 }
176 break;
177 case d3dtblend_decalalpha:
178 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECALALPHA )
179 {
180 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECALALPHA -> D3DTBLEND_DECALALPHA" ));
181 pShared->dwTexFunc[index] = D3DTBLEND_DECALALPHA;
182 }
183 else
184 {
185 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECAL )
186 {
187 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECALALPA -> D3DTBLEND_DECAL" ));
188 pShared->dwTexFunc[index] = D3DTBLEND_DECAL;
189 }
190 else
191 {
192 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECALALPHA -> D3DTBLEND_ADD" ));
193 pShared->dwTexFunc[index] = D3DTBLEND_ADD;
194 }
195 }
196 break;
197 case d3dtblend_modulate:
198 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATE )
199 {
200 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATE -> D3DTBLEND_MODULATE" ));
201 pShared->dwTexFunc[index] = D3DTBLEND_MODULATE;
202 }
203 else
204 {
205 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATEALPHA )
206 {
207 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATE -> D3DTBLEND_MODULATEALPHA" ));
208 pShared->dwTexFunc[index] = D3DTBLEND_MODULATEALPHA;
209 }
210 else if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECAL )
211 {
212 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATE -> D3DTBLEND_DECAL" ));
213 pShared->dwTexFunc[index] = D3DTBLEND_DECAL;
214 }
215 else
216 {
217 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATE -> D3DTBLEND_ADD" ));
218 pShared->dwTexFunc[index] = D3DTBLEND_ADD;
219 }
220 }
221 break;
222 case d3dtblend_modulatealpha:
223 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATEALPHA )
224 {
225 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATEALPHA -> D3DTBLEND_MODULATEALPHA" ));
226 pShared->dwTexFunc[index] = D3DTBLEND_MODULATEALPHA;
227 }
228 else
229 {
230 if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATE )
231 {
232 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATEALPHA -> D3DTBLEND_MODULATE" ));
233 pShared->dwTexFunc[index] = D3DTBLEND_MODULATE;
234 }
235 else if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECAL )
236 {
237 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATEALPHA -> D3DTBLEND_DECALE" ));
238 pShared->dwTexFunc[index] = D3DTBLEND_DECAL;
239 }
240 else
241 {
242 DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATEALPHA -> D3DTBLEND_ADD" ));
243 pShared->dwTexFunc[index] = D3DTBLEND_ADD;
244 }
245 }
246 break;
247 }
248 }
249 }
250