1 | ///////////////////////////////////////////////////////////////////////////////
|
---|
2 | //
|
---|
3 | // ## ######
|
---|
4 | // ###### ###
|
---|
5 | // ## ############### Shark 3D Engine (www.shark3d.com)
|
---|
6 | // ########## # # #
|
---|
7 | // ######## Copyright (c) 1996-2006 Spinor GmbH.
|
---|
8 | // ######### # # # All rights reserved.
|
---|
9 | // ## ##########
|
---|
10 | // ##
|
---|
11 | //
|
---|
12 | ///////////////////////////////////////////////////////////////////////////////
|
---|
13 |
|
---|
14 | #include "drv_d3d9_util.h"
|
---|
15 | #include "util/base/util_strutil.h"
|
---|
16 | #include "util/stream/util_textstreampos.h"
|
---|
17 | #include <dxerr9.h>
|
---|
18 |
|
---|
19 | ///////////////////////////////////////////////////////////////////////////////
|
---|
20 |
|
---|
21 | void s3d_DrvD3d9DbgPrintF(const s3d_CSysChar *FmtStr, ...)
|
---|
22 | {
|
---|
23 | static s3d_CSysChar Buf[512];
|
---|
24 | va_list VaList;
|
---|
25 | va_start(VaList, FmtStr);
|
---|
26 | _vsnprintf(Buf, S3D_SYS_SIZEOFS(Buf), FmtStr, VaList);
|
---|
27 | va_end(VaList);
|
---|
28 |
|
---|
29 | OutputDebugString("s3d_drvd3d: ");
|
---|
30 | OutputDebugString(Buf);
|
---|
31 | }
|
---|
32 |
|
---|
33 | ///////////////////////////////////////////////////////////////////////////////
|
---|
34 |
|
---|
35 | int s3d_CDrvD3d9Util::ColBitsOfFmt(D3DFORMAT Fmt)
|
---|
36 | {
|
---|
37 | switch(Fmt)
|
---|
38 | {
|
---|
39 | case D3DFMT_R8G8B8:
|
---|
40 | return 24;
|
---|
41 | case D3DFMT_A8R8G8B8:
|
---|
42 | return 32;
|
---|
43 | case D3DFMT_X8R8G8B8:
|
---|
44 | return 24;
|
---|
45 | case D3DFMT_R5G6B5:
|
---|
46 | return 16;
|
---|
47 | case D3DFMT_X1R5G5B5:
|
---|
48 | return 15;
|
---|
49 | case D3DFMT_A1R5G5B5:
|
---|
50 | return 16;
|
---|
51 | case D3DFMT_A4R4G4B4:
|
---|
52 | return 16;
|
---|
53 | case D3DFMT_R3G3B2:
|
---|
54 | return 8;
|
---|
55 | case D3DFMT_A8:
|
---|
56 | return 8;
|
---|
57 | case D3DFMT_A8R3G3B2:
|
---|
58 | return 16;
|
---|
59 | case D3DFMT_X4R4G4B4:
|
---|
60 | return 12;
|
---|
61 | case D3DFMT_A2B10G10R10:
|
---|
62 | return 32;
|
---|
63 | case D3DFMT_A8B8G8R8:
|
---|
64 | return 32;
|
---|
65 | case D3DFMT_X8B8G8R8:
|
---|
66 | return 24;
|
---|
67 | case D3DFMT_G16R16:
|
---|
68 | return 32;
|
---|
69 | case D3DFMT_A2R10G10B10:
|
---|
70 | return 32;
|
---|
71 | case D3DFMT_A16B16G16R16:
|
---|
72 | return 64;
|
---|
73 |
|
---|
74 | case D3DFMT_A8P8:
|
---|
75 | return 16;
|
---|
76 | case D3DFMT_P8:
|
---|
77 | return 8;
|
---|
78 |
|
---|
79 | case D3DFMT_L8:
|
---|
80 | return 8;
|
---|
81 | case D3DFMT_A8L8:
|
---|
82 | return 16;
|
---|
83 | case D3DFMT_A4L4:
|
---|
84 | return 8;
|
---|
85 |
|
---|
86 | case D3DFMT_V8U8:
|
---|
87 | return 16;
|
---|
88 | case D3DFMT_L6V5U5:
|
---|
89 | return 16;
|
---|
90 | case D3DFMT_X8L8V8U8:
|
---|
91 | return 24;
|
---|
92 | case D3DFMT_Q8W8V8U8:
|
---|
93 | return 32;
|
---|
94 | case D3DFMT_V16U16:
|
---|
95 | return 32;
|
---|
96 | case D3DFMT_A2W10V10U10:
|
---|
97 | return 32;
|
---|
98 |
|
---|
99 | case D3DFMT_UYVY:
|
---|
100 | return 16;
|
---|
101 | case D3DFMT_R8G8_B8G8:
|
---|
102 | return 16;
|
---|
103 | case D3DFMT_YUY2:
|
---|
104 | return 16;
|
---|
105 | case D3DFMT_G8R8_G8B8:
|
---|
106 | return 16;
|
---|
107 | case D3DFMT_DXT1:
|
---|
108 | return 24;
|
---|
109 | case D3DFMT_DXT2:
|
---|
110 | return 32;
|
---|
111 | case D3DFMT_DXT3:
|
---|
112 | return 32;
|
---|
113 | case D3DFMT_DXT4:
|
---|
114 | return 32;
|
---|
115 | case D3DFMT_DXT5:
|
---|
116 | return 32;
|
---|
117 |
|
---|
118 | case D3DFMT_D16_LOCKABLE:
|
---|
119 | return 0;
|
---|
120 | case D3DFMT_D32:
|
---|
121 | return 0;
|
---|
122 | case D3DFMT_D15S1:
|
---|
123 | return 0;
|
---|
124 | case D3DFMT_D24S8:
|
---|
125 | return 0;
|
---|
126 | case D3DFMT_D24X8:
|
---|
127 | return 0;
|
---|
128 | case D3DFMT_D24X4S4:
|
---|
129 | return 0;
|
---|
130 | case D3DFMT_D16:
|
---|
131 | return 0;
|
---|
132 |
|
---|
133 | case D3DFMT_D32F_LOCKABLE:
|
---|
134 | return 0;
|
---|
135 | case D3DFMT_D24FS8:
|
---|
136 | return 0;
|
---|
137 |
|
---|
138 |
|
---|
139 | case D3DFMT_L16:
|
---|
140 | return 16;
|
---|
141 |
|
---|
142 | case D3DFMT_VERTEXDATA:
|
---|
143 | return 0;
|
---|
144 | case D3DFMT_INDEX16:
|
---|
145 | return 0;
|
---|
146 | case D3DFMT_INDEX32:
|
---|
147 | return 0;
|
---|
148 |
|
---|
149 | case D3DFMT_Q16W16V16U16:
|
---|
150 | return 64;
|
---|
151 |
|
---|
152 | case D3DFMT_MULTI2_ARGB8:
|
---|
153 | return 64;
|
---|
154 |
|
---|
155 | case D3DFMT_R16F:
|
---|
156 | return 16;
|
---|
157 | case D3DFMT_G16R16F:
|
---|
158 | return 32;
|
---|
159 | case D3DFMT_A16B16G16R16F:
|
---|
160 | return 64;
|
---|
161 |
|
---|
162 | case D3DFMT_R32F:
|
---|
163 | return 32;
|
---|
164 | case D3DFMT_G32R32F:
|
---|
165 | return 64;
|
---|
166 | case D3DFMT_A32B32G32R32F:
|
---|
167 | return 128;
|
---|
168 |
|
---|
169 | case D3DFMT_CxV8U8:
|
---|
170 | return 16;
|
---|
171 |
|
---|
172 | default:
|
---|
173 | S3D_SYS_ASSERT(0);
|
---|
174 | return 0;
|
---|
175 | }
|
---|
176 | }
|
---|
177 |
|
---|
178 | int s3d_CDrvD3d9Util::DepthBitsOfFmt(D3DFORMAT Fmt)
|
---|
179 | {
|
---|
180 | switch(Fmt)
|
---|
181 | {
|
---|
182 | case D3DFMT_D16_LOCKABLE:
|
---|
183 | return 16;
|
---|
184 | case D3DFMT_D32:
|
---|
185 | return 32;
|
---|
186 | case D3DFMT_D15S1:
|
---|
187 | return 15;
|
---|
188 | case D3DFMT_D24S8:
|
---|
189 | return 24;
|
---|
190 | case D3DFMT_D24X8:
|
---|
191 | return 24;
|
---|
192 | case D3DFMT_D24X4S4:
|
---|
193 | return 24;
|
---|
194 |
|
---|
195 | case D3DFMT_D32F_LOCKABLE:
|
---|
196 | return 32;
|
---|
197 | case D3DFMT_D24FS8:
|
---|
198 | return 24;
|
---|
199 | default:
|
---|
200 | S3D_SYS_ASSERT(0);
|
---|
201 | return 0;
|
---|
202 | }
|
---|
203 | }
|
---|
204 |
|
---|
205 | bool s3d_CDrvD3d9Util::IsDepthStencilFmt(
|
---|
206 | D3DFORMAT Fmt)
|
---|
207 | {
|
---|
208 | switch(Fmt)
|
---|
209 | {
|
---|
210 | case D3DFMT_D16_LOCKABLE:
|
---|
211 | case D3DFMT_D32:
|
---|
212 | case D3DFMT_D15S1:
|
---|
213 | case D3DFMT_D24S8:
|
---|
214 | case D3DFMT_D24X8:
|
---|
215 | case D3DFMT_D24X4S4:
|
---|
216 |
|
---|
217 | case D3DFMT_D32F_LOCKABLE:
|
---|
218 | case D3DFMT_D24FS8:
|
---|
219 | return true;
|
---|
220 | default:
|
---|
221 | return false;
|
---|
222 | }
|
---|
223 | }
|
---|
224 |
|
---|
225 | int s3d_CDrvD3d9Util::StencilBitsOfFmt(D3DFORMAT Fmt)
|
---|
226 | {
|
---|
227 | switch(Fmt)
|
---|
228 | {
|
---|
229 | case D3DFMT_D16_LOCKABLE:
|
---|
230 | return 0;
|
---|
231 | case D3DFMT_D32:
|
---|
232 | return 0;
|
---|
233 | case D3DFMT_D15S1:
|
---|
234 | return 1;
|
---|
235 | case D3DFMT_D24S8:
|
---|
236 | return 8;
|
---|
237 | case D3DFMT_D24X8:
|
---|
238 | return 0;
|
---|
239 | case D3DFMT_D24X4S4:
|
---|
240 | return 4;
|
---|
241 |
|
---|
242 | case D3DFMT_D32F_LOCKABLE:
|
---|
243 | return 0;
|
---|
244 | case D3DFMT_D24FS8:
|
---|
245 | return 8;
|
---|
246 | default:
|
---|
247 | S3D_SYS_ASSERT(0);
|
---|
248 | return 0;
|
---|
249 | }
|
---|
250 | }
|
---|
251 |
|
---|
252 | D3DFORMAT s3d_CDrvD3d9Util::LinearFmtOfSwizzledFmt(D3DFORMAT Fmt)
|
---|
253 | {
|
---|
254 | return Fmt;
|
---|
255 | }
|
---|
256 |
|
---|
257 | s3d_CUtilStr s3d_CDrvD3d9Util::StrOfFmt(D3DFORMAT Fmt)
|
---|
258 | {
|
---|
259 | switch(Fmt)
|
---|
260 | {
|
---|
261 | case D3DFMT_UNKNOWN: return "D3DFMT_UNKNOWN";
|
---|
262 | case D3DFMT_R8G8B8: return "D3DFMT_R8G8B8";
|
---|
263 | case D3DFMT_A8R8G8B8: return "D3DFMT_A8R8G8B8";
|
---|
264 | case D3DFMT_X8R8G8B8: return "D3DFMT_X8R8G8B8";
|
---|
265 | case D3DFMT_R5G6B5: return "D3DFMT_R5G6B5";
|
---|
266 | case D3DFMT_X1R5G5B5: return "D3DFMT_X1R5G5B5";
|
---|
267 | case D3DFMT_A1R5G5B5: return "D3DFMT_A1R5G5B5";
|
---|
268 | case D3DFMT_A4R4G4B4: return "D3DFMT_A4R4G4B4";
|
---|
269 | case D3DFMT_R3G3B2: return "D3DFMT_R3G3B2";
|
---|
270 | case D3DFMT_A8: return "D3DFMT_A8";
|
---|
271 | case D3DFMT_A8R3G3B2: return "D3DFMT_A8R3G3B2";
|
---|
272 | case D3DFMT_X4R4G4B4: return "D3DFMT_X4R4G4B4";
|
---|
273 | case D3DFMT_A2B10G10R10: return "D3DFMT_A2B10G10R10";
|
---|
274 | case D3DFMT_A8B8G8R8: return "D3DFMT_A8B8G8R8";
|
---|
275 | case D3DFMT_X8B8G8R8: return "D3DFMT_X8B8G8R8";
|
---|
276 | case D3DFMT_G16R16: return "D3DFMT_G16R16";
|
---|
277 | case D3DFMT_A2R10G10B10: return "D3DFMT_A2R10G10B10";
|
---|
278 | case D3DFMT_A16B16G16R16: return "D3DFMT_A16B16G16R16";
|
---|
279 | case D3DFMT_A8P8: return "D3DFMT_A8P8";
|
---|
280 | case D3DFMT_P8: return "D3DFMT_P8";
|
---|
281 | case D3DFMT_L8: return "D3DFMT_L8";
|
---|
282 | case D3DFMT_A8L8: return "D3DFMT_A8L8";
|
---|
283 | case D3DFMT_A4L4: return "D3DFMT_A4L4";
|
---|
284 | case D3DFMT_V8U8: return "D3DFMT_V8U8";
|
---|
285 | case D3DFMT_L6V5U5: return "D3DFMT_L6V5U5";
|
---|
286 | case D3DFMT_X8L8V8U8: return "D3DFMT_X8L8V8U8";
|
---|
287 | case D3DFMT_Q8W8V8U8: return "D3DFMT_Q8W8V8U8";
|
---|
288 | case D3DFMT_V16U16: return "D3DFMT_V16U16";
|
---|
289 | case D3DFMT_A2W10V10U10: return "D3DFMT_A2W10V10U10";
|
---|
290 | case D3DFMT_UYVY: return "D3DFMT_UYVY";
|
---|
291 | case D3DFMT_YUY2: return "D3DFMT_YUY2";
|
---|
292 | case D3DFMT_DXT1: return "D3DFMT_DXT1";
|
---|
293 | case D3DFMT_DXT2: return "D3DFMT_DXT2";
|
---|
294 | case D3DFMT_DXT3: return "D3DFMT_DXT3";
|
---|
295 | case D3DFMT_DXT4: return "D3DFMT_DXT4";
|
---|
296 | case D3DFMT_DXT5: return "D3DFMT_DXT5";
|
---|
297 | case D3DFMT_D16_LOCKABLE: return "D3DFMT_D16_LOCKABLE";
|
---|
298 | case D3DFMT_D32: return "D3DFMT_D32";
|
---|
299 | case D3DFMT_D15S1: return "D3DFMT_D15S1";
|
---|
300 | case D3DFMT_D24S8: return "D3DFMT_D24S8";
|
---|
301 | case D3DFMT_D24X8: return "D3DFMT_D24X8";
|
---|
302 | case D3DFMT_D24X4S4: return "D3DFMT_D24X4S4";
|
---|
303 | case D3DFMT_D16: return "D3DFMT_D16";
|
---|
304 | case D3DFMT_L16: return "D3DFMT_L16";
|
---|
305 | case D3DFMT_VERTEXDATA: return "D3DFMT_VERTEXDATA";
|
---|
306 | case D3DFMT_INDEX16: return "D3DFMT_INDEX16";
|
---|
307 | case D3DFMT_INDEX32: return "D3DFMT_INDEX32";
|
---|
308 | case D3DFMT_Q16W16V16U16: return "D3DFMT_Q16W16V16U16";
|
---|
309 | case D3DFMT_MULTI2_ARGB8: return "D3DFMT_MULTI2_ARGB8";
|
---|
310 | case D3DFMT_R16F: return "D3DFMT_R16F";
|
---|
311 | case D3DFMT_G16R16F: return "D3DFMT_G16R16F";
|
---|
312 | case D3DFMT_A16B16G16R16F: return "D3DFMT_A16B16G16R16F";
|
---|
313 | case D3DFMT_R32F: return "D3DFMT_R32F";
|
---|
314 | case D3DFMT_G32R32F: return "D3DFMT_G32R32F";
|
---|
315 | case D3DFMT_A32B32G32R32F: return "D3DFMT_A32B32G32R32F";
|
---|
316 | case D3DFMT_CxV8U8: return "D3DFMT_CxV8U8";
|
---|
317 | default: return "Unknown format";
|
---|
318 | }
|
---|
319 | }
|
---|
320 |
|
---|
321 | s3d_CUtilStr s3d_CDrvD3d9Util::StrOfMutliSampleType(
|
---|
322 | D3DMULTISAMPLE_TYPE MultiSampleType)
|
---|
323 | {
|
---|
324 | switch(MultiSampleType)
|
---|
325 | {
|
---|
326 | case D3DMULTISAMPLE_NONE: return "";
|
---|
327 | case D3DMULTISAMPLE_NONMASKABLE: return "Maskable MSAA";
|
---|
328 | case D3DMULTISAMPLE_2_SAMPLES: return "2xMSAA";
|
---|
329 | case D3DMULTISAMPLE_3_SAMPLES: return "3xMSAA";
|
---|
330 | case D3DMULTISAMPLE_4_SAMPLES: return "4xMSAA";
|
---|
331 | case D3DMULTISAMPLE_5_SAMPLES: return "5xMSAA";
|
---|
332 | case D3DMULTISAMPLE_6_SAMPLES: return "6xMSAA";
|
---|
333 | case D3DMULTISAMPLE_7_SAMPLES: return "7xMSAA";
|
---|
334 | case D3DMULTISAMPLE_8_SAMPLES: return "8xMSAA";
|
---|
335 | default: return "Unknown MSAA";
|
---|
336 | }
|
---|
337 | }
|
---|
338 | ///////////////////////////////////////////////////////////////////////////////
|
---|
339 |
|
---|
340 | void s3d_CDrvD3d9Util::ErrorD3d(
|
---|
341 | s3d_CUtilMsgHandler *MsgHandler, HRESULT DxResult,
|
---|
342 | const char *File, int Line)
|
---|
343 | {
|
---|
344 | s3d_CUtilTextStreamPos FilePos(File, Line, 0);
|
---|
345 |
|
---|
346 | s3d_CUtilStr DxResultStr = s3d_CUtilStrUtil::StrOfInt(DxResult);
|
---|
347 | s3d_CDrvDxError e;
|
---|
348 | e.m_Code = s3d_CUtilStr("drv/imp/directx/d3d9/s3d_DrvD3d9util.dxerror.")
|
---|
349 | + s3d_CUtilStrUtil::StrOfInt(DxResult);
|
---|
350 | e.m_StdTempl = "Direct3D: Call \"[1]\" returned error [2] \"[3]\".";
|
---|
351 | e.AddInfo("");
|
---|
352 | e.AddInfo(FilePos.FormatStd());
|
---|
353 | e.AddInfo(s3d_CUtilStrUtil::StrOfInt(
|
---|
354 | DxResult, 8, s3d_CUtilStrNum::Format_HexPadding));
|
---|
355 | e.AddInfo(DXGetErrorDescription9(DxResult));
|
---|
356 | s3d_UtilMsgReportError(MsgHandler, e);
|
---|
357 | }
|
---|
358 |
|
---|
359 | ///////////////////////////////////////////////////////////////////////////////
|
---|
360 |
|
---|
361 | s3d_CUtilStr s3d_CDrvD3d9Util::StrOfSemantic(
|
---|
362 | const D3DXSEMANTIC &Semantic)
|
---|
363 | {
|
---|
364 | s3d_CUtilStrBuf StrBuf;
|
---|
365 | DWORD Usage = Semantic.Usage;
|
---|
366 | DWORD UsageIdx = Semantic.UsageIndex;
|
---|
367 | switch(Usage)
|
---|
368 | {
|
---|
369 | case D3DDECLUSAGE_POSITION:
|
---|
370 | {
|
---|
371 | StrBuf.Append("POSITION");
|
---|
372 | break;
|
---|
373 | }
|
---|
374 | case D3DDECLUSAGE_BLENDWEIGHT:
|
---|
375 | {
|
---|
376 | StrBuf.Append("BLENDWGH");
|
---|
377 | break;
|
---|
378 | }
|
---|
379 | case D3DDECLUSAGE_NORMAL:
|
---|
380 | {
|
---|
381 | StrBuf.Append("NORMAL");
|
---|
382 | break;
|
---|
383 | }
|
---|
384 | case D3DDECLUSAGE_COLOR:
|
---|
385 | {
|
---|
386 | StrBuf.Append("COLOR");
|
---|
387 | break;
|
---|
388 | }
|
---|
389 | case D3DDECLUSAGE_TEXCOORD:
|
---|
390 | {
|
---|
391 | StrBuf.Append("TEXCOORD");
|
---|
392 | break;
|
---|
393 | }
|
---|
394 | case D3DDECLUSAGE_PSIZE:
|
---|
395 | {
|
---|
396 | StrBuf.Append("PSIZE");
|
---|
397 | break;
|
---|
398 | }
|
---|
399 | case D3DDECLUSAGE_BLENDINDICES:
|
---|
400 | {
|
---|
401 | StrBuf.Append("BLENDINDICES");
|
---|
402 | break;
|
---|
403 | }
|
---|
404 | case D3DDECLUSAGE_TANGENT:
|
---|
405 | {
|
---|
406 | StrBuf.Append("TANGENT");
|
---|
407 | break;
|
---|
408 | }
|
---|
409 | case D3DDECLUSAGE_BINORMAL:
|
---|
410 | {
|
---|
411 | StrBuf.Append("BINORMAL");
|
---|
412 | break;
|
---|
413 | }
|
---|
414 | case D3DDECLUSAGE_TESSFACTOR:
|
---|
415 | {
|
---|
416 | StrBuf.Append("TESSFACTOR");
|
---|
417 | break;
|
---|
418 | }
|
---|
419 | case D3DDECLUSAGE_POSITIONT:
|
---|
420 | {
|
---|
421 | StrBuf.Append("POSITIONT");
|
---|
422 | break;
|
---|
423 | }
|
---|
424 | case D3DDECLUSAGE_FOG:
|
---|
425 | {
|
---|
426 | StrBuf.Append("FOG");
|
---|
427 | break;
|
---|
428 | }
|
---|
429 | case D3DDECLUSAGE_DEPTH:
|
---|
430 | {
|
---|
431 | StrBuf.Append("DEPTH");
|
---|
432 | break;
|
---|
433 | }
|
---|
434 | case D3DDECLUSAGE_SAMPLE:
|
---|
435 | {
|
---|
436 | StrBuf.Append("SAMPLE");
|
---|
437 | break;
|
---|
438 | }
|
---|
439 | }
|
---|
440 | StrBuf.AppendInt(UsageIdx);
|
---|
441 | return StrBuf;
|
---|
442 | }
|
---|
443 |
|
---|
444 | s3d_CUtilStr s3d_CDrvD3d9Util::StrOfProgDecl(
|
---|
445 | const s3d_CDrvD3d9ProgDecl &ProgDecl)
|
---|
446 | {
|
---|
447 | s3d_CUtilStrBuf StrBuf;
|
---|
448 | const D3DXSEMANTIC *SemanticArray = ProgDecl.m_SemanticArray;
|
---|
449 | s3d_CSysIntps nSemantic = ProgDecl.m_SemanticsCnt;
|
---|
450 | s3d_CSysIntps iSemantic;
|
---|
451 | for(iSemantic = 0; iSemantic < nSemantic; iSemantic++)
|
---|
452 | {
|
---|
453 | if(iSemantic > 0)
|
---|
454 | StrBuf.Append(", ");
|
---|
455 | StrBuf.Append(s3d_CDrvD3d9Util::StrOfSemantic(*SemanticArray++));
|
---|
456 | }
|
---|
457 | return StrBuf;
|
---|
458 | }
|
---|
459 |
|
---|
460 | s3d_CUtilStr s3d_CDrvD3d9Util::StrOfVertDecl(
|
---|
461 | s3d_CDrvD3d9Env *Env, const s3d_CDrvD3d9VertDecl &VertDecl)
|
---|
462 | {
|
---|
463 | UINT ElemCnt = 0;
|
---|
464 | S3D_DRV_D3D9_CHECK(
|
---|
465 | Env, VertDecl->GetDeclaration(0, &ElemCnt));
|
---|
466 |
|
---|
467 | s3d_CSysIntps AllocSize
|
---|
468 | = ElemCnt * S3D_SYS_SIZEOFS(D3DVERTEXELEMENT9);
|
---|
469 | D3DVERTEXELEMENT9 *ElemArray
|
---|
470 | = reinterpret_cast<D3DVERTEXELEMENT9 *>(alloca(AllocSize));
|
---|
471 | S3D_DRV_D3D9_CHECK(
|
---|
472 | Env, VertDecl->GetDeclaration(ElemArray, &ElemCnt));
|
---|
473 |
|
---|
474 | return s3d_CDrvD3d9Util::StrOfVertElemArray(ElemCnt, ElemArray);
|
---|
475 | }
|
---|
476 |
|
---|
477 | s3d_CUtilStr s3d_CDrvD3d9Util::StrOfVertElemArray(
|
---|
478 | s3d_CSysIntps ElemCnt, const D3DVERTEXELEMENT9 *ElemArray)
|
---|
479 | {
|
---|
480 | ElemCnt--; // DECL_END
|
---|
481 | if(ElemCnt <= 0)
|
---|
482 | return 0;
|
---|
483 | if(!ElemArray)
|
---|
484 | return 0;
|
---|
485 |
|
---|
486 | s3d_CUtilStrBuf StrBuf;
|
---|
487 | s3d_CSysIntps iElem;
|
---|
488 | for(iElem = 0; iElem < ElemCnt; iElem++) //-1 DECL_END
|
---|
489 | {
|
---|
490 | if(iElem > 0)
|
---|
491 | StrBuf.Append(", ");
|
---|
492 | D3DXSEMANTIC Semantic;
|
---|
493 | Semantic.Usage = ElemArray->Usage;
|
---|
494 | Semantic.UsageIndex = ElemArray->UsageIndex;
|
---|
495 | StrBuf.Append(s3d_CDrvD3d9Util::StrOfSemantic(Semantic));
|
---|
496 | ElemArray++;
|
---|
497 | }
|
---|
498 |
|
---|
499 | return StrBuf;
|
---|
500 | }
|
---|
501 |
|
---|
502 | s3d_CSysIntps s3d_CDrvD3d9Util::SizeOfDeclType(int Type)
|
---|
503 | {
|
---|
504 | switch(Type)
|
---|
505 | {
|
---|
506 | case D3DDECLTYPE_FLOAT1:
|
---|
507 | return S3D_SYS_SIZEOFS(float);
|
---|
508 | case D3DDECLTYPE_FLOAT2:
|
---|
509 | return S3D_SYS_SIZEOFS(float) * 2;
|
---|
510 | case D3DDECLTYPE_FLOAT3:
|
---|
511 | return S3D_SYS_SIZEOFS(float) * 3;
|
---|
512 | case D3DDECLTYPE_FLOAT4:
|
---|
513 | return S3D_SYS_SIZEOFS(float) * 4;
|
---|
514 | case D3DDECLTYPE_D3DCOLOR:
|
---|
515 |
|
---|
516 | case D3DDECLTYPE_UBYTE4N:
|
---|
517 | case D3DDECLTYPE_UBYTE4:
|
---|
518 | return S3D_SYS_SIZEOFS(DWORD);
|
---|
519 |
|
---|
520 | case D3DDECLTYPE_SHORT2:
|
---|
521 | case D3DDECLTYPE_SHORT2N:
|
---|
522 | case D3DDECLTYPE_USHORT2N:
|
---|
523 | return S3D_SYS_SIZEOFS(DWORD);
|
---|
524 | case D3DDECLTYPE_SHORT4:
|
---|
525 | case D3DDECLTYPE_SHORT4N:
|
---|
526 | case D3DDECLTYPE_USHORT4N:
|
---|
527 | return S3D_SYS_SIZEOFS(DWORD) * 2;
|
---|
528 | case D3DDECLTYPE_UDEC3:
|
---|
529 | case D3DDECLTYPE_DEC3N:
|
---|
530 | return S3D_SYS_SIZEOFS(DWORD);
|
---|
531 |
|
---|
532 | case D3DDECLTYPE_FLOAT16_2:
|
---|
533 | return S3D_SYS_SIZEOFS(DWORD);
|
---|
534 | case D3DDECLTYPE_FLOAT16_4:
|
---|
535 | return S3D_SYS_SIZEOFS(DWORD) * 2;
|
---|
536 | }
|
---|
537 | return 0;
|
---|
538 | }
|
---|
539 |
|
---|
540 | static const D3DRENDERSTATETYPE s3d_DrvD3d9WrapTable[16] =
|
---|
541 | {
|
---|
542 | D3DRS_WRAP0, D3DRS_WRAP1, D3DRS_WRAP2, D3DRS_WRAP3,
|
---|
543 | D3DRS_WRAP4, D3DRS_WRAP5, D3DRS_WRAP6, D3DRS_WRAP7,
|
---|
544 | D3DRS_WRAP8, D3DRS_WRAP9, D3DRS_WRAP10, D3DRS_WRAP11,
|
---|
545 | D3DRS_WRAP12, D3DRS_WRAP13, D3DRS_WRAP14, D3DRS_WRAP15
|
---|
546 | };
|
---|
547 |
|
---|
548 | D3DRENDERSTATETYPE s3d_CDrvD3d9Util::D3dWrapOfSamp(int Samp)
|
---|
549 | {
|
---|
550 | if(s3d_SysIsValidArrayIdx(
|
---|
551 | Samp, S3D_SYS_ARRAYCNTS(s3d_DrvD3d9WrapTable)))
|
---|
552 | return s3d_DrvD3d9WrapTable[Samp];
|
---|
553 | else
|
---|
554 | return D3DRS_WRAP0;
|
---|
555 | }
|
---|
556 |
|
---|
557 | ///////////////////////////////////////////////////////////////////////////////
|
---|