source: GTP/trunk/App/Demos/Geom/Shark3D/src/drv_d3d9_util.cpp @ 2236

Revision 2236, 16.3 KB checked in by gumbau, 17 years ago (diff)
Line 
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
21void 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
35int 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   
178int 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
205bool 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
225int 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
252D3DFORMAT s3d_CDrvD3d9Util::LinearFmtOfSwizzledFmt(D3DFORMAT Fmt)
253{
254    return Fmt;
255}
256
257s3d_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
321s3d_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
340void 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
361s3d_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
444s3d_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
460s3d_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
477s3d_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
502s3d_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
540static 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
548D3DRENDERSTATETYPE 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///////////////////////////////////////////////////////////////////////////////
Note: See TracBrowser for help on using the repository browser.