CmD3D9Mappings.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. /*
  2. -----------------------------------------------------------------------------
  3. This source file is part of OGRE
  4. (Object-oriented Graphics Rendering Engine)
  5. For the latest info, see http://www.ogre3d.org/
  6. Copyright (c) 2000-2011 Torus Knot Software Ltd
  7. Permission is hereby granted, free of charge, to any person obtaining a copy
  8. of this software and associated documentation files (the "Software"), to deal
  9. in the Software without restriction, including without limitation the rights
  10. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. copies of the Software, and to permit persons to whom the Software is
  12. furnished to do so, subject to the following conditions:
  13. The above copyright notice and this permission notice shall be included in
  14. all copies or substantial portions of the Software.
  15. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. THE SOFTWARE.
  22. -----------------------------------------------------------------------------
  23. */
  24. #include "CmD3D9Mappings.h"
  25. #include "CmString.h"
  26. #include "CmException.h"
  27. namespace CamelotEngine
  28. {
  29. //---------------------------------------------------------------------
  30. DWORD D3D9Mappings::get(ShadeOptions so)
  31. {
  32. switch( so )
  33. {
  34. case SO_FLAT:
  35. return D3DSHADE_FLAT;
  36. case SO_GOURAUD:
  37. return D3DSHADE_GOURAUD;
  38. case SO_PHONG:
  39. return D3DSHADE_PHONG;
  40. }
  41. return 0;
  42. }
  43. //---------------------------------------------------------------------
  44. DWORD D3D9Mappings::get(TexCoordCalcMethod m, const D3DCAPS9& caps)
  45. {
  46. switch( m )
  47. {
  48. case TEXCALC_NONE:
  49. return D3DTSS_TCI_PASSTHRU;
  50. case TEXCALC_ENVIRONMENT_MAP_REFLECTION:
  51. return D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR;
  52. case TEXCALC_ENVIRONMENT_MAP_PLANAR:
  53. if (caps.VertexProcessingCaps & D3DVTXPCAPS_TEXGEN_SPHEREMAP)
  54. {
  55. // Use sphere map if available
  56. return D3DTSS_TCI_SPHEREMAP;
  57. }
  58. else
  59. {
  60. // If not, fall back on camera space reflection vector which isn't as good
  61. return D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR;
  62. }
  63. case TEXCALC_ENVIRONMENT_MAP_NORMAL:
  64. return D3DTSS_TCI_CAMERASPACENORMAL;
  65. case TEXCALC_ENVIRONMENT_MAP:
  66. if (caps.VertexProcessingCaps & D3DVTXPCAPS_TEXGEN_SPHEREMAP)
  67. {
  68. // Use sphere map if available
  69. return D3DTSS_TCI_SPHEREMAP;
  70. }
  71. else
  72. {
  73. // If not, fall back on camera space normal which isn't as good
  74. return D3DTSS_TCI_CAMERASPACENORMAL;
  75. }
  76. case TEXCALC_PROJECTIVE_TEXTURE:
  77. return D3DTSS_TCI_CAMERASPACEPOSITION;
  78. }
  79. return 0;
  80. }
  81. //---------------------------------------------------------------------
  82. D3DTEXTUREADDRESS D3D9Mappings::get(TextureState::TextureAddressingMode tam, const D3DCAPS9& devCaps)
  83. {
  84. switch( tam )
  85. {
  86. case TextureState::TAM_WRAP:
  87. return D3DTADDRESS_WRAP;
  88. case TextureState::TAM_MIRROR:
  89. return D3DTADDRESS_MIRROR;
  90. case TextureState::TAM_CLAMP:
  91. return D3DTADDRESS_CLAMP;
  92. case TextureState::TAM_BORDER:
  93. if (devCaps.TextureAddressCaps & D3DPTADDRESSCAPS_BORDER)
  94. return D3DTADDRESS_BORDER;
  95. else
  96. return D3DTADDRESS_CLAMP;
  97. }
  98. return D3DTADDRESS_FORCE_DWORD;
  99. }
  100. //---------------------------------------------------------------------
  101. D3DBLEND D3D9Mappings::get(SceneBlendFactor sbf)
  102. {
  103. switch( sbf )
  104. {
  105. case SBF_ONE:
  106. return D3DBLEND_ONE;
  107. case SBF_ZERO:
  108. return D3DBLEND_ZERO;
  109. case SBF_DEST_COLOUR:
  110. return D3DBLEND_DESTCOLOR;
  111. case SBF_SOURCE_COLOUR:
  112. return D3DBLEND_SRCCOLOR;
  113. case SBF_ONE_MINUS_DEST_COLOUR:
  114. return D3DBLEND_INVDESTCOLOR;
  115. case SBF_ONE_MINUS_SOURCE_COLOUR:
  116. return D3DBLEND_INVSRCCOLOR;
  117. case SBF_DEST_ALPHA:
  118. return D3DBLEND_DESTALPHA;
  119. case SBF_SOURCE_ALPHA:
  120. return D3DBLEND_SRCALPHA;
  121. case SBF_ONE_MINUS_DEST_ALPHA:
  122. return D3DBLEND_INVDESTALPHA;
  123. case SBF_ONE_MINUS_SOURCE_ALPHA:
  124. return D3DBLEND_INVSRCALPHA;
  125. }
  126. return D3DBLEND_FORCE_DWORD;
  127. }
  128. //---------------------------------------------------------------------
  129. D3DBLENDOP D3D9Mappings::get(CamelotEngine::SceneBlendOperation sbo)
  130. {
  131. switch(sbo)
  132. {
  133. case SBO_ADD:
  134. return D3DBLENDOP_ADD;
  135. case SBO_SUBTRACT:
  136. return D3DBLENDOP_SUBTRACT;
  137. case SBO_REVERSE_SUBTRACT:
  138. return D3DBLENDOP_REVSUBTRACT;
  139. case SBO_MIN:
  140. return D3DBLENDOP_MIN;
  141. case SBO_MAX:
  142. return D3DBLENDOP_MAX;
  143. }
  144. return D3DBLENDOP_FORCE_DWORD;
  145. }
  146. //---------------------------------------------------------------------
  147. DWORD D3D9Mappings::get(CompareFunction cf)
  148. {
  149. switch( cf )
  150. {
  151. case CMPF_ALWAYS_FAIL:
  152. return D3DCMP_NEVER;
  153. case CMPF_ALWAYS_PASS:
  154. return D3DCMP_ALWAYS;
  155. case CMPF_LESS:
  156. return D3DCMP_LESS;
  157. case CMPF_LESS_EQUAL:
  158. return D3DCMP_LESSEQUAL;
  159. case CMPF_EQUAL:
  160. return D3DCMP_EQUAL;
  161. case CMPF_NOT_EQUAL:
  162. return D3DCMP_NOTEQUAL;
  163. case CMPF_GREATER_EQUAL:
  164. return D3DCMP_GREATEREQUAL;
  165. case CMPF_GREATER:
  166. return D3DCMP_GREATER;
  167. };
  168. return 0;
  169. }
  170. //---------------------------------------------------------------------
  171. DWORD D3D9Mappings::get(CullingMode cm, bool flip)
  172. {
  173. switch( cm )
  174. {
  175. case CULL_NONE:
  176. return D3DCULL_NONE;
  177. case CULL_CLOCKWISE:
  178. if( flip )
  179. return D3DCULL_CCW;
  180. else
  181. return D3DCULL_CW;
  182. case CULL_ANTICLOCKWISE:
  183. if( flip )
  184. return D3DCULL_CW;
  185. else
  186. return D3DCULL_CCW;
  187. }
  188. return 0;
  189. }
  190. //---------------------------------------------------------------------
  191. D3DFOGMODE D3D9Mappings::get(FogMode fm)
  192. {
  193. switch( fm )
  194. {
  195. case FOG_EXP:
  196. return D3DFOG_EXP;
  197. case FOG_EXP2:
  198. return D3DFOG_EXP2;
  199. case FOG_LINEAR:
  200. return D3DFOG_LINEAR;
  201. }
  202. return D3DFOG_FORCE_DWORD;
  203. }
  204. //---------------------------------------------------------------------
  205. D3DFILLMODE D3D9Mappings::get(PolygonMode level)
  206. {
  207. switch(level)
  208. {
  209. case PM_POINTS:
  210. return D3DFILL_POINT;
  211. case PM_WIREFRAME:
  212. return D3DFILL_WIREFRAME;
  213. case PM_SOLID:
  214. return D3DFILL_SOLID;
  215. }
  216. return D3DFILL_FORCE_DWORD;
  217. }
  218. //---------------------------------------------------------------------
  219. DWORD D3D9Mappings::get(StencilOperation op, bool invert)
  220. {
  221. switch(op)
  222. {
  223. case SOP_KEEP:
  224. return D3DSTENCILOP_KEEP;
  225. case SOP_ZERO:
  226. return D3DSTENCILOP_ZERO;
  227. case SOP_REPLACE:
  228. return D3DSTENCILOP_REPLACE;
  229. case SOP_INCREMENT:
  230. return invert? D3DSTENCILOP_DECRSAT : D3DSTENCILOP_INCRSAT;
  231. case SOP_DECREMENT:
  232. return invert? D3DSTENCILOP_INCRSAT : D3DSTENCILOP_DECRSAT;
  233. case SOP_INCREMENT_WRAP:
  234. return invert? D3DSTENCILOP_DECR : D3DSTENCILOP_INCR;
  235. case SOP_DECREMENT_WRAP:
  236. return invert? D3DSTENCILOP_INCR : D3DSTENCILOP_DECR;
  237. case SOP_INVERT:
  238. return D3DSTENCILOP_INVERT;
  239. }
  240. return 0;
  241. }
  242. //---------------------------------------------------------------------
  243. D3DSAMPLERSTATETYPE D3D9Mappings::get(FilterType ft)
  244. {
  245. switch (ft)
  246. {
  247. case FT_MIN:
  248. return D3DSAMP_MINFILTER;
  249. break;
  250. case FT_MAG:
  251. return D3DSAMP_MAGFILTER;
  252. break;
  253. case FT_MIP:
  254. return D3DSAMP_MIPFILTER;
  255. break;
  256. }
  257. // to keep compiler happy
  258. return D3DSAMP_MINFILTER;
  259. }
  260. //---------------------------------------------------------------------
  261. DWORD D3D9Mappings::get(FilterType ft, FilterOptions fo, const D3DCAPS9& devCaps,
  262. eD3DTexType texType)
  263. {
  264. // Assume normal
  265. DWORD capsType = devCaps.TextureFilterCaps;
  266. switch( texType )
  267. {
  268. case D3D_TEX_TYPE_NORMAL:
  269. capsType = devCaps.TextureFilterCaps;
  270. break;
  271. case D3D_TEX_TYPE_CUBE:
  272. capsType = devCaps.CubeTextureFilterCaps;
  273. break;
  274. case D3D_TEX_TYPE_VOLUME:
  275. capsType = devCaps.VolumeTextureFilterCaps;
  276. break;
  277. }
  278. switch (ft)
  279. {
  280. case FT_MIN:
  281. switch( fo )
  282. {
  283. // NOTE: Fall through if device doesn't support requested type
  284. case FO_ANISOTROPIC:
  285. if( capsType & D3DPTFILTERCAPS_MINFANISOTROPIC )
  286. {
  287. return D3DTEXF_ANISOTROPIC;
  288. break;
  289. }
  290. case FO_LINEAR:
  291. if( capsType & D3DPTFILTERCAPS_MINFLINEAR )
  292. {
  293. return D3DTEXF_LINEAR;
  294. break;
  295. }
  296. case FO_POINT:
  297. case FO_NONE:
  298. return D3DTEXF_POINT;
  299. break;
  300. }
  301. break;
  302. case FT_MAG:
  303. switch( fo )
  304. {
  305. // NOTE: Fall through if device doesn't support requested type
  306. case FO_ANISOTROPIC:
  307. if( capsType & D3DPTFILTERCAPS_MAGFANISOTROPIC )
  308. {
  309. return D3DTEXF_ANISOTROPIC;
  310. break;
  311. }
  312. case FO_LINEAR:
  313. if( capsType & D3DPTFILTERCAPS_MAGFLINEAR )
  314. {
  315. return D3DTEXF_LINEAR;
  316. break;
  317. }
  318. case FO_POINT:
  319. case FO_NONE:
  320. return D3DTEXF_POINT;
  321. break;
  322. }
  323. break;
  324. case FT_MIP:
  325. switch( fo )
  326. {
  327. case FO_ANISOTROPIC:
  328. case FO_LINEAR:
  329. if( capsType & D3DPTFILTERCAPS_MIPFLINEAR )
  330. {
  331. return D3DTEXF_LINEAR;
  332. break;
  333. }
  334. case FO_POINT:
  335. if( capsType & D3DPTFILTERCAPS_MIPFPOINT )
  336. {
  337. return D3DTEXF_POINT;
  338. break;
  339. }
  340. case FO_NONE:
  341. return D3DTEXF_NONE;
  342. break;
  343. }
  344. break;
  345. }
  346. // should never get here
  347. return 0;
  348. }
  349. //---------------------------------------------------------------------
  350. D3D9Mappings::eD3DTexType D3D9Mappings::get(TextureType ogreTexType)
  351. {
  352. switch( ogreTexType )
  353. {
  354. case TEX_TYPE_1D :
  355. case TEX_TYPE_2D :
  356. return D3D9Mappings::D3D_TEX_TYPE_NORMAL;
  357. case TEX_TYPE_CUBE_MAP :
  358. return D3D9Mappings::D3D_TEX_TYPE_CUBE;
  359. case TEX_TYPE_3D :
  360. return D3D9Mappings::D3D_TEX_TYPE_VOLUME;
  361. }
  362. return D3D9Mappings::D3D_TEX_TYPE_NONE;
  363. }
  364. //---------------------------------------------------------------------
  365. DWORD D3D9Mappings::get(HardwareBuffer::Usage usage)
  366. {
  367. DWORD ret = 0;
  368. if (usage & HardwareBuffer::HBU_DYNAMIC)
  369. {
  370. #if OGRE_D3D_MANAGE_BUFFERS
  371. // Only add the dynamic flag for default pool, and
  372. // we use default pool when buffer is discardable
  373. if (usage & HardwareBuffer::HBU_DISCARDABLE)
  374. ret |= D3DUSAGE_DYNAMIC;
  375. #else
  376. ret |= D3DUSAGE_DYNAMIC;
  377. #endif
  378. }
  379. if (usage & HardwareBuffer::HBU_WRITE_ONLY)
  380. {
  381. ret |= D3DUSAGE_WRITEONLY;
  382. }
  383. return ret;
  384. }
  385. //---------------------------------------------------------------------
  386. DWORD D3D9Mappings::get(HardwareBuffer::LockOptions options, HardwareBuffer::Usage usage)
  387. {
  388. DWORD ret = 0;
  389. if (options == HardwareBuffer::HBL_DISCARD)
  390. {
  391. #if OGRE_D3D_MANAGE_BUFFERS
  392. // Only add the discard flag for dynamic usgae and default pool
  393. if ((usage & HardwareBuffer::HBU_DYNAMIC) &&
  394. (usage & HardwareBuffer::HBU_DISCARDABLE))
  395. ret |= D3DLOCK_DISCARD;
  396. #else
  397. // D3D doesn't like discard or no_overwrite on non-dynamic buffers
  398. if (usage & HardwareBuffer::HBU_DYNAMIC)
  399. ret |= D3DLOCK_DISCARD;
  400. #endif
  401. }
  402. if (options == HardwareBuffer::HBL_READ_ONLY)
  403. {
  404. // D3D debug runtime doesn't like you locking managed buffers readonly
  405. // when they were created with write-only (even though you CAN read
  406. // from the software backed version)
  407. if (!(usage & HardwareBuffer::HBU_WRITE_ONLY))
  408. ret |= D3DLOCK_READONLY;
  409. }
  410. if (options == HardwareBuffer::HBL_NO_OVERWRITE)
  411. {
  412. #if OGRE_D3D_MANAGE_BUFFERS
  413. // Only add the nooverwrite flag for dynamic usgae and default pool
  414. if ((usage & HardwareBuffer::HBU_DYNAMIC) &&
  415. (usage & HardwareBuffer::HBU_DISCARDABLE))
  416. ret |= D3DLOCK_NOOVERWRITE;
  417. #else
  418. // D3D doesn't like discard or no_overwrite on non-dynamic buffers
  419. if (usage & HardwareBuffer::HBU_DYNAMIC)
  420. ret |= D3DLOCK_NOOVERWRITE;
  421. #endif
  422. }
  423. return ret;
  424. }
  425. //---------------------------------------------------------------------
  426. D3DFORMAT D3D9Mappings::get(HardwareIndexBuffer::IndexType itype)
  427. {
  428. if (itype == HardwareIndexBuffer::IT_32BIT)
  429. {
  430. return D3DFMT_INDEX32;
  431. }
  432. else
  433. {
  434. return D3DFMT_INDEX16;
  435. }
  436. }
  437. //---------------------------------------------------------------------
  438. D3DDECLTYPE D3D9Mappings::get(VertexElementType vType)
  439. {
  440. switch (vType)
  441. {
  442. case VET_COLOUR:
  443. case VET_COLOUR_ABGR:
  444. case VET_COLOUR_ARGB:
  445. return D3DDECLTYPE_D3DCOLOR;
  446. break;
  447. case VET_FLOAT1:
  448. return D3DDECLTYPE_FLOAT1;
  449. break;
  450. case VET_FLOAT2:
  451. return D3DDECLTYPE_FLOAT2;
  452. break;
  453. case VET_FLOAT3:
  454. return D3DDECLTYPE_FLOAT3;
  455. break;
  456. case VET_FLOAT4:
  457. return D3DDECLTYPE_FLOAT4;
  458. break;
  459. case VET_SHORT2:
  460. return D3DDECLTYPE_SHORT2;
  461. break;
  462. case VET_SHORT4:
  463. return D3DDECLTYPE_SHORT4;
  464. break;
  465. case VET_UBYTE4:
  466. return D3DDECLTYPE_UBYTE4;
  467. break;
  468. }
  469. // to keep compiler happy
  470. return D3DDECLTYPE_FLOAT3;
  471. }
  472. //---------------------------------------------------------------------
  473. D3DDECLUSAGE D3D9Mappings::get(VertexElementSemantic sem)
  474. {
  475. switch (sem)
  476. {
  477. case VES_BLEND_INDICES:
  478. return D3DDECLUSAGE_BLENDINDICES;
  479. break;
  480. case VES_BLEND_WEIGHTS:
  481. return D3DDECLUSAGE_BLENDWEIGHT;
  482. break;
  483. case VES_DIFFUSE:
  484. return D3DDECLUSAGE_COLOR; // NB index will differentiate
  485. break;
  486. case VES_SPECULAR:
  487. return D3DDECLUSAGE_COLOR; // NB index will differentiate
  488. break;
  489. case VES_NORMAL:
  490. return D3DDECLUSAGE_NORMAL;
  491. break;
  492. case VES_POSITION:
  493. return D3DDECLUSAGE_POSITION;
  494. break;
  495. case VES_TEXTURE_COORDINATES:
  496. return D3DDECLUSAGE_TEXCOORD;
  497. break;
  498. case VES_BINORMAL:
  499. return D3DDECLUSAGE_BINORMAL;
  500. break;
  501. case VES_TANGENT:
  502. return D3DDECLUSAGE_TANGENT;
  503. break;
  504. }
  505. // to keep compiler happy
  506. return D3DDECLUSAGE_POSITION;
  507. }
  508. //---------------------------------------------------------------------
  509. D3DXMATRIX D3D9Mappings::makeD3DXMatrix( const Matrix4& mat )
  510. {
  511. // Transpose matrix
  512. // D3D9 uses row vectors i.e. V*M
  513. // Ogre, OpenGL and everything else uses column vectors i.e. M*V
  514. return D3DXMATRIX(
  515. mat[0][0], mat[1][0], mat[2][0], mat[3][0],
  516. mat[0][1], mat[1][1], mat[2][1], mat[3][1],
  517. mat[0][2], mat[1][2], mat[2][2], mat[3][2],
  518. mat[0][3], mat[1][3], mat[2][3], mat[3][3]);
  519. }
  520. //---------------------------------------------------------------------
  521. Matrix4 D3D9Mappings::convertD3DXMatrix( const D3DXMATRIX& mat )
  522. {
  523. return Matrix4(
  524. mat.m[0][0], mat.m[1][0], mat.m[2][0], mat.m[3][0],
  525. mat.m[0][1], mat.m[1][1], mat.m[2][1], mat.m[3][1],
  526. mat.m[0][2], mat.m[1][2], mat.m[2][2], mat.m[3][2],
  527. mat.m[0][3], mat.m[1][3], mat.m[2][3], mat.m[3][3]);
  528. }
  529. /****************************************************************************************/
  530. PixelFormat D3D9Mappings::_getPF(D3DFORMAT d3dPF)
  531. {
  532. switch(d3dPF)
  533. {
  534. case D3DFMT_A8:
  535. return PF_A8;
  536. case D3DFMT_L8:
  537. return PF_L8;
  538. case D3DFMT_L16:
  539. return PF_L16;
  540. case D3DFMT_A4L4:
  541. return PF_A4L4;
  542. case D3DFMT_A8L8:
  543. return PF_BYTE_LA; // Assume little endian here
  544. case D3DFMT_R3G3B2:
  545. return PF_R3G3B2;
  546. case D3DFMT_A1R5G5B5:
  547. return PF_A1R5G5B5;
  548. case D3DFMT_A4R4G4B4:
  549. return PF_A4R4G4B4;
  550. case D3DFMT_R5G6B5:
  551. return PF_R5G6B5;
  552. case D3DFMT_R8G8B8:
  553. return PF_R8G8B8;
  554. case D3DFMT_X8R8G8B8:
  555. return PF_X8R8G8B8;
  556. case D3DFMT_A8R8G8B8:
  557. return PF_A8R8G8B8;
  558. case D3DFMT_X8B8G8R8:
  559. return PF_X8B8G8R8;
  560. case D3DFMT_A8B8G8R8:
  561. return PF_A8B8G8R8;
  562. case D3DFMT_A2R10G10B10:
  563. return PF_A2R10G10B10;
  564. case D3DFMT_A2B10G10R10:
  565. return PF_A2B10G10R10;
  566. case D3DFMT_R16F:
  567. return PF_FLOAT16_R;
  568. case D3DFMT_A16B16G16R16F:
  569. return PF_FLOAT16_RGBA;
  570. case D3DFMT_R32F:
  571. return PF_FLOAT32_R;
  572. case D3DFMT_G32R32F:
  573. return PF_FLOAT32_GR;
  574. case D3DFMT_A32B32G32R32F:
  575. return PF_FLOAT32_RGBA;
  576. case D3DFMT_G16R16F:
  577. return PF_FLOAT16_GR;
  578. case D3DFMT_A16B16G16R16:
  579. return PF_SHORT_RGBA;
  580. case D3DFMT_G16R16:
  581. return PF_SHORT_GR;
  582. case D3DFMT_DXT1:
  583. return PF_DXT1;
  584. case D3DFMT_DXT2:
  585. return PF_DXT2;
  586. case D3DFMT_DXT3:
  587. return PF_DXT3;
  588. case D3DFMT_DXT4:
  589. return PF_DXT4;
  590. case D3DFMT_DXT5:
  591. return PF_DXT5;
  592. default:
  593. return PF_UNKNOWN;
  594. }
  595. }
  596. /****************************************************************************************/
  597. D3DFORMAT D3D9Mappings::_getPF(PixelFormat ogrePF)
  598. {
  599. switch(ogrePF)
  600. {
  601. case PF_L8:
  602. return D3DFMT_L8;
  603. case PF_L16:
  604. return D3DFMT_L16;
  605. case PF_A8:
  606. return D3DFMT_A8;
  607. case PF_A4L4:
  608. return D3DFMT_A4L4;
  609. case PF_BYTE_LA:
  610. return D3DFMT_A8L8; // Assume little endian here
  611. case PF_R3G3B2:
  612. return D3DFMT_R3G3B2;
  613. case PF_A1R5G5B5:
  614. return D3DFMT_A1R5G5B5;
  615. case PF_R5G6B5:
  616. return D3DFMT_R5G6B5;
  617. case PF_A4R4G4B4:
  618. return D3DFMT_A4R4G4B4;
  619. case PF_R8G8B8:
  620. return D3DFMT_R8G8B8;
  621. case PF_A8R8G8B8:
  622. return D3DFMT_A8R8G8B8;
  623. case PF_A8B8G8R8:
  624. return D3DFMT_A8B8G8R8;
  625. case PF_X8R8G8B8:
  626. return D3DFMT_X8R8G8B8;
  627. case PF_X8B8G8R8:
  628. return D3DFMT_X8B8G8R8;
  629. case PF_A2B10G10R10:
  630. return D3DFMT_A2B10G10R10;
  631. case PF_A2R10G10B10:
  632. return D3DFMT_A2R10G10B10;
  633. case PF_FLOAT16_R:
  634. return D3DFMT_R16F;
  635. case PF_FLOAT16_GR:
  636. return D3DFMT_G16R16F;
  637. case PF_FLOAT16_RGBA:
  638. return D3DFMT_A16B16G16R16F;
  639. case PF_FLOAT32_R:
  640. return D3DFMT_R32F;
  641. case PF_FLOAT32_GR:
  642. return D3DFMT_G32R32F;
  643. case PF_FLOAT32_RGBA:
  644. return D3DFMT_A32B32G32R32F;
  645. case PF_SHORT_RGBA:
  646. return D3DFMT_A16B16G16R16;
  647. case PF_SHORT_GR:
  648. return D3DFMT_G16R16;
  649. case PF_DXT1:
  650. return D3DFMT_DXT1;
  651. case PF_DXT2:
  652. return D3DFMT_DXT2;
  653. case PF_DXT3:
  654. return D3DFMT_DXT3;
  655. case PF_DXT4:
  656. return D3DFMT_DXT4;
  657. case PF_DXT5:
  658. return D3DFMT_DXT5;
  659. case PF_UNKNOWN:
  660. default:
  661. return D3DFMT_UNKNOWN;
  662. }
  663. }
  664. /****************************************************************************************/
  665. PixelFormat D3D9Mappings::_getClosestSupportedPF(PixelFormat ogrePF)
  666. {
  667. if (_getPF(ogrePF) != D3DFMT_UNKNOWN)
  668. {
  669. return ogrePF;
  670. }
  671. switch(ogrePF)
  672. {
  673. case PF_B5G6R5:
  674. return PF_R5G6B5;
  675. case PF_B8G8R8:
  676. return PF_R8G8B8;
  677. case PF_B8G8R8A8:
  678. return PF_A8R8G8B8;
  679. case PF_SHORT_RGB:
  680. return PF_SHORT_RGBA;
  681. case PF_FLOAT16_RGB:
  682. return PF_FLOAT16_RGBA;
  683. case PF_FLOAT32_RGB:
  684. return PF_FLOAT32_RGBA;
  685. case PF_UNKNOWN:
  686. default:
  687. return PF_A8R8G8B8;
  688. }
  689. }
  690. }