BsD3D11Mappings.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsD3D11Mappings.h"
  4. #include "Debug/BsDebug.h"
  5. #include "Error/BsException.h"
  6. #include "Math/BsMath.h"
  7. namespace bs { namespace ct
  8. {
  9. D3D11_TEXTURE_ADDRESS_MODE D3D11Mappings::get(TextureAddressingMode tam)
  10. {
  11. switch(tam)
  12. {
  13. case TAM_WRAP:
  14. return D3D11_TEXTURE_ADDRESS_WRAP;
  15. case TAM_MIRROR:
  16. return D3D11_TEXTURE_ADDRESS_MIRROR;
  17. case TAM_CLAMP:
  18. return D3D11_TEXTURE_ADDRESS_CLAMP;
  19. case TAM_BORDER:
  20. return D3D11_TEXTURE_ADDRESS_BORDER;
  21. }
  22. return D3D11_TEXTURE_ADDRESS_MIRROR_ONCE;
  23. }
  24. D3D11_BLEND D3D11Mappings::get(BlendFactor bf)
  25. {
  26. switch(bf)
  27. {
  28. case BF_ONE:
  29. return D3D11_BLEND_ONE;
  30. case BF_ZERO:
  31. return D3D11_BLEND_ZERO;
  32. case BF_DEST_COLOR:
  33. return D3D11_BLEND_DEST_COLOR;
  34. case BF_SOURCE_COLOR:
  35. return D3D11_BLEND_SRC_COLOR;
  36. case BF_INV_DEST_COLOR:
  37. return D3D11_BLEND_INV_DEST_COLOR;
  38. case BF_INV_SOURCE_COLOR:
  39. return D3D11_BLEND_INV_SRC_COLOR;
  40. case BF_DEST_ALPHA:
  41. return D3D11_BLEND_DEST_ALPHA;
  42. case BF_SOURCE_ALPHA:
  43. return D3D11_BLEND_SRC_ALPHA;
  44. case BF_INV_DEST_ALPHA:
  45. return D3D11_BLEND_INV_DEST_ALPHA;
  46. case BF_INV_SOURCE_ALPHA:
  47. return D3D11_BLEND_INV_SRC_ALPHA;
  48. }
  49. // Unsupported type
  50. return D3D11_BLEND_ZERO;
  51. }
  52. D3D11_BLEND_OP D3D11Mappings::get(BlendOperation bo)
  53. {
  54. switch(bo)
  55. {
  56. case BO_ADD:
  57. return D3D11_BLEND_OP_ADD;
  58. case BO_SUBTRACT:
  59. return D3D11_BLEND_OP_SUBTRACT;
  60. case BO_REVERSE_SUBTRACT:
  61. return D3D11_BLEND_OP_REV_SUBTRACT;
  62. case BO_MIN:
  63. return D3D11_BLEND_OP_MIN;
  64. case BO_MAX:
  65. return D3D11_BLEND_OP_MAX;
  66. }
  67. // Unsupported type
  68. return D3D11_BLEND_OP_ADD;
  69. }
  70. D3D11_COMPARISON_FUNC D3D11Mappings::get(CompareFunction cf)
  71. {
  72. switch(cf)
  73. {
  74. case CMPF_ALWAYS_FAIL:
  75. return D3D11_COMPARISON_NEVER;
  76. case CMPF_ALWAYS_PASS:
  77. return D3D11_COMPARISON_ALWAYS;
  78. case CMPF_LESS:
  79. return D3D11_COMPARISON_LESS;
  80. case CMPF_LESS_EQUAL:
  81. return D3D11_COMPARISON_LESS_EQUAL;
  82. case CMPF_EQUAL:
  83. return D3D11_COMPARISON_EQUAL;
  84. case CMPF_NOT_EQUAL:
  85. return D3D11_COMPARISON_NOT_EQUAL;
  86. case CMPF_GREATER_EQUAL:
  87. return D3D11_COMPARISON_GREATER_EQUAL;
  88. case CMPF_GREATER:
  89. return D3D11_COMPARISON_GREATER;
  90. };
  91. // Unsupported type
  92. return D3D11_COMPARISON_ALWAYS;
  93. }
  94. D3D11_CULL_MODE D3D11Mappings::get(CullingMode cm)
  95. {
  96. switch(cm)
  97. {
  98. case CULL_NONE:
  99. return D3D11_CULL_NONE;
  100. case CULL_CLOCKWISE:
  101. return D3D11_CULL_FRONT;
  102. case CULL_COUNTERCLOCKWISE:
  103. return D3D11_CULL_BACK;
  104. }
  105. // Unsupported type
  106. return D3D11_CULL_NONE;
  107. }
  108. D3D11_FILL_MODE D3D11Mappings::get(PolygonMode mode)
  109. {
  110. switch(mode)
  111. {
  112. case PM_WIREFRAME:
  113. return D3D11_FILL_WIREFRAME;
  114. case PM_SOLID:
  115. return D3D11_FILL_SOLID;
  116. }
  117. return D3D11_FILL_SOLID;
  118. }
  119. D3D11_STENCIL_OP D3D11Mappings::get(StencilOperation op, bool invert)
  120. {
  121. switch(op)
  122. {
  123. case SOP_KEEP:
  124. return D3D11_STENCIL_OP_KEEP;
  125. case SOP_ZERO:
  126. return D3D11_STENCIL_OP_ZERO;
  127. case SOP_REPLACE:
  128. return D3D11_STENCIL_OP_REPLACE;
  129. case SOP_INCREMENT:
  130. return invert ? D3D11_STENCIL_OP_DECR_SAT : D3D11_STENCIL_OP_INCR_SAT;
  131. case SOP_DECREMENT:
  132. return invert ? D3D11_STENCIL_OP_INCR_SAT : D3D11_STENCIL_OP_DECR_SAT;
  133. case SOP_INCREMENT_WRAP:
  134. return invert ? D3D11_STENCIL_OP_DECR : D3D11_STENCIL_OP_INCR;
  135. case SOP_DECREMENT_WRAP:
  136. return invert ? D3D11_STENCIL_OP_INCR : D3D11_STENCIL_OP_DECR;
  137. case SOP_INVERT:
  138. return D3D11_STENCIL_OP_INVERT;
  139. }
  140. // Unsupported type
  141. return D3D11_STENCIL_OP_KEEP;
  142. }
  143. DWORD D3D11Mappings::get(FilterType ft)
  144. {
  145. switch (ft)
  146. {
  147. case FT_MIN:
  148. return D3D11_MIN_FILTER_SHIFT;
  149. case FT_MAG:
  150. return D3D11_MAG_FILTER_SHIFT;
  151. case FT_MIP:
  152. return D3D11_MIP_FILTER_SHIFT;
  153. }
  154. // Unsupported type
  155. return D3D11_MIP_FILTER_SHIFT;
  156. }
  157. D3D11_FILTER D3D11Mappings::get(const FilterOptions min, const FilterOptions mag, const FilterOptions mip, const bool comparison)
  158. {
  159. D3D11_FILTER res;
  160. #define MERGE_FOR_SWITCH(_comparison_, _min_ , _mag_, _mip_ ) ((_comparison_ << 16) | (_min_ << 8) | (_mag_ << 4) | (_mip_))
  161. switch((MERGE_FOR_SWITCH(comparison, min, mag, mip)))
  162. {
  163. case MERGE_FOR_SWITCH(true, FO_POINT, FO_POINT, FO_POINT):
  164. res = D3D11_FILTER_COMPARISON_MIN_MAG_MIP_POINT;
  165. break;
  166. case MERGE_FOR_SWITCH(true, FO_POINT, FO_POINT, FO_LINEAR):
  167. res = D3D11_FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR;
  168. break;
  169. case MERGE_FOR_SWITCH(true, FO_POINT, FO_LINEAR, FO_POINT):
  170. res = D3D11_FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT;
  171. break;
  172. case MERGE_FOR_SWITCH(true, FO_POINT, FO_LINEAR, FO_LINEAR):
  173. res = D3D11_FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR;
  174. break;
  175. case MERGE_FOR_SWITCH(true, FO_LINEAR, FO_POINT, FO_POINT):
  176. res = D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT;
  177. break;
  178. case MERGE_FOR_SWITCH(true, FO_LINEAR, FO_POINT, FO_LINEAR):
  179. res = D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR;
  180. break;
  181. case MERGE_FOR_SWITCH(true, FO_LINEAR, FO_LINEAR, FO_POINT):
  182. res = D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT;
  183. break;
  184. case MERGE_FOR_SWITCH(true, FO_LINEAR, FO_LINEAR, FO_LINEAR):
  185. res = D3D11_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR;
  186. break;
  187. case MERGE_FOR_SWITCH(true, FO_ANISOTROPIC, FO_ANISOTROPIC, FO_ANISOTROPIC):
  188. res = D3D11_FILTER_COMPARISON_ANISOTROPIC;
  189. break;
  190. case MERGE_FOR_SWITCH(false, FO_POINT, FO_POINT, FO_POINT):
  191. res = D3D11_FILTER_MIN_MAG_MIP_POINT;
  192. break;
  193. case MERGE_FOR_SWITCH(false, FO_POINT, FO_POINT, FO_LINEAR):
  194. res = D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR;
  195. break;
  196. case MERGE_FOR_SWITCH(false, FO_POINT, FO_LINEAR, FO_POINT):
  197. res = D3D11_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT;
  198. break;
  199. case MERGE_FOR_SWITCH(false, FO_POINT, FO_LINEAR, FO_LINEAR):
  200. res = D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR;
  201. break;
  202. case MERGE_FOR_SWITCH(false, FO_LINEAR, FO_POINT, FO_POINT):
  203. res = D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT;
  204. break;
  205. case MERGE_FOR_SWITCH(false, FO_LINEAR, FO_POINT, FO_LINEAR):
  206. res = D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR;
  207. break;
  208. case MERGE_FOR_SWITCH(false, FO_LINEAR, FO_LINEAR, FO_POINT):
  209. res = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT;
  210. break;
  211. case MERGE_FOR_SWITCH(false, FO_LINEAR, FO_LINEAR, FO_LINEAR):
  212. res = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
  213. break;
  214. case MERGE_FOR_SWITCH(false, FO_ANISOTROPIC, FO_ANISOTROPIC, FO_ANISOTROPIC):
  215. res = D3D11_FILTER_ANISOTROPIC;
  216. break;
  217. default:
  218. res = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
  219. }
  220. return res;
  221. }
  222. DWORD D3D11Mappings::get(GpuBufferUsage usage)
  223. {
  224. DWORD ret = D3D11_USAGE_DEFAULT;
  225. if (usage & GBU_DYNAMIC)
  226. ret = D3D11_USAGE_DYNAMIC;
  227. return ret;
  228. }
  229. D3D11_MAP D3D11Mappings::get(GpuLockOptions options, GpuBufferUsage usage)
  230. {
  231. D3D11_MAP ret = D3D11_MAP_READ_WRITE;
  232. if (options == GBL_WRITE_ONLY_DISCARD)
  233. {
  234. // D3D doesn't like discard on non-dynamic buffers
  235. if (usage & GBU_DYNAMIC)
  236. ret = D3D11_MAP_WRITE_DISCARD;
  237. else
  238. ret = D3D11_MAP_WRITE;
  239. }
  240. else if (options == GBL_READ_ONLY)
  241. {
  242. ret = D3D11_MAP_READ;
  243. }
  244. else if (options == GBL_WRITE_ONLY_NO_OVERWRITE)
  245. {
  246. ret = D3D11_MAP_WRITE_NO_OVERWRITE; // Only allowed for vertex/index buffers
  247. }
  248. return ret;
  249. }
  250. DXGI_FORMAT D3D11Mappings::get(VertexElementType type)
  251. {
  252. switch (type)
  253. {
  254. case VET_COLOR:
  255. case VET_COLOR_ABGR:
  256. case VET_COLOR_ARGB:
  257. case VET_UBYTE4_NORM:
  258. return DXGI_FORMAT_R8G8B8A8_UNORM;
  259. case VET_FLOAT1:
  260. return DXGI_FORMAT_R32_FLOAT;
  261. case VET_FLOAT2:
  262. return DXGI_FORMAT_R32G32_FLOAT;
  263. case VET_FLOAT3:
  264. return DXGI_FORMAT_R32G32B32_FLOAT;
  265. case VET_FLOAT4:
  266. return DXGI_FORMAT_R32G32B32A32_FLOAT;
  267. case VET_USHORT1:
  268. return DXGI_FORMAT_R16_UINT;
  269. case VET_USHORT2:
  270. return DXGI_FORMAT_R16G16_UINT;
  271. case VET_USHORT4:
  272. return DXGI_FORMAT_R16G16B16A16_UINT;
  273. case VET_SHORT1:
  274. return DXGI_FORMAT_R16_SINT;
  275. case VET_SHORT2:
  276. return DXGI_FORMAT_R16G16_SINT;
  277. case VET_SHORT4:
  278. return DXGI_FORMAT_R16G16B16A16_SINT;
  279. case VET_UINT1:
  280. return DXGI_FORMAT_R32_UINT;
  281. case VET_UINT2:
  282. return DXGI_FORMAT_R32G32_UINT;
  283. case VET_UINT3:
  284. return DXGI_FORMAT_R32G32B32_UINT;
  285. case VET_UINT4:
  286. return DXGI_FORMAT_R32G32B32A32_UINT;
  287. case VET_INT1:
  288. return DXGI_FORMAT_R32_SINT;
  289. case VET_INT2:
  290. return DXGI_FORMAT_R32G32_SINT;
  291. case VET_INT3:
  292. return DXGI_FORMAT_R32G32B32_SINT;
  293. case VET_INT4:
  294. return DXGI_FORMAT_R32G32B32A32_SINT;
  295. case VET_UBYTE4:
  296. return DXGI_FORMAT_R8G8B8A8_UINT;
  297. }
  298. // Unsupported type
  299. return DXGI_FORMAT_R32G32B32A32_FLOAT;
  300. }
  301. VertexElementSemantic D3D11Mappings::get(LPCSTR sem)
  302. {
  303. if(strcmp(sem, "BLENDINDICES") == 0)
  304. return VES_BLEND_INDICES;
  305. if(strcmp(sem, "BLENDWEIGHT") == 0)
  306. return VES_BLEND_WEIGHTS;
  307. if(strcmp(sem, "COLOR") == 0)
  308. return VES_COLOR;
  309. if(strcmp(sem, "NORMAL") == 0)
  310. return VES_NORMAL;
  311. if(strcmp(sem, "POSITION") == 0)
  312. return VES_POSITION;
  313. if(strcmp(sem, "TEXCOORD") == 0)
  314. return VES_TEXCOORD;
  315. if(strcmp(sem, "BINORMAL") == 0)
  316. return VES_BITANGENT;
  317. if(strcmp(sem, "TANGENT") == 0)
  318. return VES_TANGENT;
  319. if(strcmp(sem, "POSITIONT") == 0)
  320. return VES_POSITIONT;
  321. if(strcmp(sem, "PSIZE") == 0)
  322. return VES_PSIZE;
  323. // Unsupported type
  324. return VES_POSITION;
  325. }
  326. LPCSTR D3D11Mappings::get(VertexElementSemantic sem)
  327. {
  328. switch (sem)
  329. {
  330. case VES_BLEND_INDICES:
  331. return "BLENDINDICES";
  332. case VES_BLEND_WEIGHTS:
  333. return "BLENDWEIGHT";
  334. case VES_COLOR:
  335. return "COLOR";
  336. case VES_NORMAL:
  337. return "NORMAL";
  338. case VES_POSITION:
  339. return "POSITION";
  340. case VES_TEXCOORD:
  341. return "TEXCOORD";
  342. case VES_BITANGENT:
  343. return "BINORMAL";
  344. case VES_TANGENT:
  345. return "TANGENT";
  346. case VES_POSITIONT:
  347. return "POSITIONT";
  348. case VES_PSIZE:
  349. return "PSIZE";
  350. }
  351. // Unsupported type
  352. return "";
  353. }
  354. VertexElementType D3D11Mappings::getInputType(D3D_REGISTER_COMPONENT_TYPE type)
  355. {
  356. switch(type)
  357. {
  358. case D3D_REGISTER_COMPONENT_FLOAT32:
  359. return VET_FLOAT4;
  360. case D3D_REGISTER_COMPONENT_SINT32:
  361. return VET_INT4;
  362. case D3D_REGISTER_COMPONENT_UINT32:
  363. return VET_UINT4;
  364. default:
  365. return VET_FLOAT4;
  366. }
  367. }
  368. void D3D11Mappings::get(const Color& inColor, float* outColor)
  369. {
  370. outColor[0] = inColor.r;
  371. outColor[1] = inColor.g;
  372. outColor[2] = inColor.b;
  373. outColor[3] = inColor.a;
  374. }
  375. PixelFormat D3D11Mappings::getPF(DXGI_FORMAT pf)
  376. {
  377. switch(pf)
  378. {
  379. case DXGI_FORMAT_UNKNOWN:
  380. return PF_UNKNOWN;
  381. case DXGI_FORMAT_R32G32B32A32_TYPELESS:
  382. return PF_UNKNOWN;
  383. case DXGI_FORMAT_R32G32B32A32_FLOAT:
  384. return PF_RGBA32F;
  385. case DXGI_FORMAT_R32G32B32A32_UINT:
  386. return PF_RGBA32U;
  387. case DXGI_FORMAT_R32G32B32A32_SINT:
  388. return PF_RGBA32I;
  389. case DXGI_FORMAT_R32G32B32_TYPELESS:
  390. return PF_UNKNOWN;
  391. case DXGI_FORMAT_R32G32B32_FLOAT:
  392. return PF_RGB32F;
  393. case DXGI_FORMAT_R32G32B32_UINT:
  394. return PF_RGB32U;
  395. case DXGI_FORMAT_R32G32B32_SINT:
  396. return PF_RGB32I;
  397. case DXGI_FORMAT_R16G16B16A16_TYPELESS:
  398. return PF_UNKNOWN;
  399. case DXGI_FORMAT_R16G16B16A16_FLOAT:
  400. return PF_RGBA16F;
  401. case DXGI_FORMAT_R16G16B16A16_UNORM:
  402. return PF_RGBA16;
  403. case DXGI_FORMAT_R16G16B16A16_UINT:
  404. return PF_RGBA16U;
  405. case DXGI_FORMAT_R16G16B16A16_SNORM:
  406. return PF_RGBA16S;
  407. case DXGI_FORMAT_R16G16B16A16_SINT:
  408. return PF_RGBA16I;
  409. case DXGI_FORMAT_R32G32_TYPELESS:
  410. return PF_UNKNOWN;
  411. case DXGI_FORMAT_R32G32_FLOAT:
  412. return PF_RG32F;
  413. case DXGI_FORMAT_R32G32_UINT:
  414. return PF_RG32U;
  415. case DXGI_FORMAT_R32G32_SINT:
  416. return PF_RG32I;
  417. case DXGI_FORMAT_R32G8X24_TYPELESS:
  418. return PF_UNKNOWN;
  419. case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
  420. return PF_D32_S8X24;
  421. case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
  422. return PF_UNKNOWN;
  423. case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
  424. return PF_UNKNOWN;
  425. case DXGI_FORMAT_R10G10B10A2_TYPELESS:
  426. return PF_UNKNOWN;
  427. case DXGI_FORMAT_R10G10B10A2_UNORM:
  428. return PF_RGB10A2;
  429. case DXGI_FORMAT_R10G10B10A2_UINT:
  430. return PF_UNKNOWN;
  431. case DXGI_FORMAT_R11G11B10_FLOAT:
  432. return PF_RG11B10F;
  433. case DXGI_FORMAT_R8G8B8A8_TYPELESS:
  434. return PF_UNKNOWN;
  435. case DXGI_FORMAT_R8G8B8A8_UNORM:
  436. case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
  437. return PF_RGBA8;
  438. case DXGI_FORMAT_R8G8B8A8_UINT:
  439. return PF_RGBA8U;
  440. case DXGI_FORMAT_R8G8B8A8_SNORM:
  441. return PF_RGBA8S;
  442. case DXGI_FORMAT_R8G8B8A8_SINT:
  443. return PF_RGBA8I;
  444. case DXGI_FORMAT_R16G16_TYPELESS:
  445. return PF_UNKNOWN;
  446. case DXGI_FORMAT_R16G16_FLOAT:
  447. return PF_RG16F;
  448. case DXGI_FORMAT_R16G16_UNORM:
  449. return PF_RG16;
  450. case DXGI_FORMAT_R16G16_UINT:
  451. return PF_RG16U;
  452. case DXGI_FORMAT_R16G16_SNORM:
  453. return PF_RG16S;
  454. case DXGI_FORMAT_R16G16_SINT:
  455. return PF_RG16I;
  456. case DXGI_FORMAT_R32_TYPELESS:
  457. return PF_UNKNOWN;
  458. case DXGI_FORMAT_D32_FLOAT:
  459. return PF_D32;
  460. case DXGI_FORMAT_R32_FLOAT:
  461. return PF_R32F;
  462. case DXGI_FORMAT_R32_UINT:
  463. return PF_R32U;
  464. case DXGI_FORMAT_R32_SINT:
  465. return PF_R32I;
  466. case DXGI_FORMAT_R24G8_TYPELESS:
  467. return PF_UNKNOWN;
  468. case DXGI_FORMAT_D24_UNORM_S8_UINT:
  469. return PF_D24S8;
  470. case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
  471. return PF_UNKNOWN;
  472. case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
  473. return PF_UNKNOWN;
  474. case DXGI_FORMAT_R8G8_TYPELESS:
  475. return PF_UNKNOWN;
  476. case DXGI_FORMAT_R8G8_UNORM:
  477. return PF_RG8;
  478. case DXGI_FORMAT_R8G8_UINT:
  479. return PF_RG8U;
  480. case DXGI_FORMAT_R8G8_SNORM:
  481. return PF_RG8S;
  482. case DXGI_FORMAT_R8G8_SINT:
  483. return PF_RG8I;
  484. case DXGI_FORMAT_R16_TYPELESS:
  485. return PF_UNKNOWN;
  486. case DXGI_FORMAT_R16_FLOAT:
  487. return PF_R16F;
  488. case DXGI_FORMAT_D16_UNORM:
  489. return PF_D16;
  490. case DXGI_FORMAT_R16_UNORM:
  491. return PF_R16;
  492. case DXGI_FORMAT_R16_UINT:
  493. return PF_R16U;
  494. case DXGI_FORMAT_R16_SNORM:
  495. return PF_R16S;
  496. case DXGI_FORMAT_R16_SINT:
  497. return PF_R16I;
  498. case DXGI_FORMAT_R8_TYPELESS:
  499. return PF_UNKNOWN;
  500. case DXGI_FORMAT_R8_UNORM:
  501. return PF_R8;
  502. case DXGI_FORMAT_R8_UINT:
  503. return PF_R8U;
  504. case DXGI_FORMAT_R8_SNORM:
  505. return PF_R8S;
  506. case DXGI_FORMAT_R8_SINT:
  507. return PF_R8I;
  508. case DXGI_FORMAT_A8_UNORM:
  509. return PF_UNKNOWN;
  510. case DXGI_FORMAT_R1_UNORM:
  511. return PF_UNKNOWN;
  512. case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
  513. return PF_UNKNOWN;
  514. case DXGI_FORMAT_R8G8_B8G8_UNORM:
  515. return PF_UNKNOWN;
  516. case DXGI_FORMAT_G8R8_G8B8_UNORM:
  517. return PF_UNKNOWN;
  518. case DXGI_FORMAT_BC1_TYPELESS:
  519. return PF_UNKNOWN;
  520. case DXGI_FORMAT_BC1_UNORM:
  521. case DXGI_FORMAT_BC1_UNORM_SRGB:
  522. return PF_BC1;
  523. case DXGI_FORMAT_BC2_TYPELESS:
  524. return PF_BC2;
  525. case DXGI_FORMAT_BC2_UNORM:
  526. case DXGI_FORMAT_BC2_UNORM_SRGB:
  527. return PF_BC2;
  528. case DXGI_FORMAT_BC3_TYPELESS:
  529. return PF_BC3;
  530. case DXGI_FORMAT_BC3_UNORM:
  531. case DXGI_FORMAT_BC3_UNORM_SRGB:
  532. return PF_BC3;
  533. case DXGI_FORMAT_BC4_TYPELESS:
  534. return PF_BC4;
  535. case DXGI_FORMAT_BC4_UNORM:
  536. return PF_BC4;
  537. case DXGI_FORMAT_BC4_SNORM:
  538. return PF_BC4;
  539. case DXGI_FORMAT_BC5_TYPELESS:
  540. return PF_BC5;
  541. case DXGI_FORMAT_BC5_UNORM:
  542. return PF_BC5;
  543. case DXGI_FORMAT_BC5_SNORM:
  544. return PF_BC5;
  545. case DXGI_FORMAT_BC6H_UF16:
  546. return PF_BC6H;
  547. case DXGI_FORMAT_BC6H_SF16:
  548. return PF_BC6H;
  549. case DXGI_FORMAT_BC6H_TYPELESS:
  550. return PF_BC6H;
  551. case DXGI_FORMAT_BC7_UNORM:
  552. case DXGI_FORMAT_BC7_UNORM_SRGB:
  553. return PF_BC7;
  554. case DXGI_FORMAT_BC7_TYPELESS:
  555. return PF_BC7;
  556. case DXGI_FORMAT_B5G6R5_UNORM:
  557. return PF_UNKNOWN;
  558. case DXGI_FORMAT_B5G5R5A1_UNORM:
  559. return PF_UNKNOWN;
  560. case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
  561. case DXGI_FORMAT_B8G8R8X8_UNORM:
  562. return PF_BGR8;
  563. case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
  564. case DXGI_FORMAT_B8G8R8A8_UNORM:
  565. return PF_BGRA8;
  566. default:
  567. return PF_UNKNOWN;
  568. }
  569. }
  570. DXGI_FORMAT D3D11Mappings::getPF(PixelFormat pf, bool gamma)
  571. {
  572. switch(pf)
  573. {
  574. case PF_R8:
  575. return DXGI_FORMAT_R8_UNORM;
  576. case PF_R8S:
  577. return DXGI_FORMAT_R8_SNORM;
  578. case PF_R8I:
  579. return DXGI_FORMAT_R8_SINT;
  580. case PF_R8U:
  581. return DXGI_FORMAT_R8_UINT;
  582. case PF_RG8:
  583. return DXGI_FORMAT_R8G8_UNORM;
  584. case PF_RG8S:
  585. return DXGI_FORMAT_R8G8_SNORM;
  586. case PF_RG8I:
  587. return DXGI_FORMAT_R8G8_SINT;
  588. case PF_RG8U:
  589. return DXGI_FORMAT_R8G8_UINT;
  590. case PF_BGR8:
  591. if (gamma)
  592. return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB;
  593. return DXGI_FORMAT_B8G8R8X8_UNORM;
  594. case PF_RGB8:
  595. case PF_RGBA8:
  596. if (gamma)
  597. return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
  598. return DXGI_FORMAT_R8G8B8A8_UNORM;
  599. case PF_RGBA8I:
  600. return DXGI_FORMAT_R8G8B8A8_SINT;
  601. case PF_RGBA8U:
  602. return DXGI_FORMAT_R8G8B8A8_UINT;
  603. case PF_RGBA8S:
  604. return DXGI_FORMAT_R8G8B8A8_SNORM;
  605. case PF_BGRA8:
  606. if (gamma)
  607. return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
  608. return DXGI_FORMAT_B8G8R8A8_UNORM;
  609. case PF_R16F:
  610. return DXGI_FORMAT_R16_FLOAT;
  611. case PF_RG16F:
  612. return DXGI_FORMAT_R16G16_FLOAT;
  613. case PF_RGBA16F:
  614. return DXGI_FORMAT_R16G16B16A16_FLOAT;
  615. case PF_R32F:
  616. return DXGI_FORMAT_R32_FLOAT;
  617. case PF_RG32F:
  618. return DXGI_FORMAT_R32G32_FLOAT;
  619. case PF_RGB32F:
  620. return DXGI_FORMAT_R32G32B32_FLOAT;
  621. case PF_RGBA32F:
  622. return DXGI_FORMAT_R32G32B32A32_FLOAT;
  623. case PF_R16I:
  624. return DXGI_FORMAT_R16_SINT;
  625. case PF_RG16I:
  626. return DXGI_FORMAT_R16G16_SINT;
  627. case PF_RGBA16I:
  628. return DXGI_FORMAT_R16G16B16A16_SINT;
  629. case PF_R16U:
  630. return DXGI_FORMAT_R16_UINT;
  631. case PF_RG16U:
  632. return DXGI_FORMAT_R16G16_UINT;
  633. case PF_RGBA16U:
  634. return DXGI_FORMAT_R16G16B16A16_UINT;
  635. case PF_R32I:
  636. return DXGI_FORMAT_R32_SINT;
  637. case PF_RG32I:
  638. return DXGI_FORMAT_R32G32_SINT;
  639. case PF_RGB32I:
  640. return DXGI_FORMAT_R32G32B32_SINT;
  641. case PF_R32U:
  642. return DXGI_FORMAT_R32_UINT;
  643. case PF_RG32U:
  644. return DXGI_FORMAT_R32G32_UINT;
  645. case PF_RGB32U:
  646. return DXGI_FORMAT_R32G32B32_UINT;
  647. case PF_RGBA32U:
  648. return DXGI_FORMAT_R32G32B32A32_UINT;
  649. case PF_R16S:
  650. return DXGI_FORMAT_R16_SNORM;
  651. case PF_RG16S:
  652. return DXGI_FORMAT_R16G16_SNORM;
  653. case PF_RGBA16S:
  654. return DXGI_FORMAT_R16G16B16A16_SNORM;
  655. case PF_R16:
  656. return DXGI_FORMAT_R16_UNORM;
  657. case PF_RG16:
  658. return DXGI_FORMAT_R16G16_UNORM;
  659. case PF_RGBA16:
  660. return DXGI_FORMAT_R16G16B16A16_UNORM;
  661. case PF_BC1:
  662. case PF_BC1a:
  663. if(gamma)
  664. return DXGI_FORMAT_BC1_UNORM_SRGB;
  665. return DXGI_FORMAT_BC1_UNORM;
  666. case PF_BC2:
  667. if (gamma)
  668. return DXGI_FORMAT_BC2_UNORM_SRGB;
  669. return DXGI_FORMAT_BC2_UNORM;
  670. case PF_BC3:
  671. if (gamma)
  672. return DXGI_FORMAT_BC3_UNORM_SRGB;
  673. return DXGI_FORMAT_BC3_UNORM;
  674. case PF_BC4:
  675. return DXGI_FORMAT_BC4_UNORM;
  676. case PF_BC5:
  677. return DXGI_FORMAT_BC5_UNORM;
  678. case PF_BC6H:
  679. return DXGI_FORMAT_BC6H_UF16;
  680. case PF_BC7:
  681. if (gamma)
  682. return DXGI_FORMAT_BC7_UNORM_SRGB;
  683. return DXGI_FORMAT_BC7_UNORM;
  684. case PF_D32_S8X24:
  685. return DXGI_FORMAT_D32_FLOAT_S8X24_UINT;
  686. case PF_D24S8:
  687. return DXGI_FORMAT_D24_UNORM_S8_UINT;
  688. case PF_D32:
  689. return DXGI_FORMAT_D32_FLOAT;
  690. case PF_D16:
  691. return DXGI_FORMAT_D16_UNORM;
  692. case PF_RG11B10F:
  693. return DXGI_FORMAT_R11G11B10_FLOAT;
  694. case PF_RGB10A2:
  695. return DXGI_FORMAT_R10G10B10A2_UNORM;
  696. case PF_UNKNOWN:
  697. default:
  698. return DXGI_FORMAT_UNKNOWN;
  699. }
  700. }
  701. DXGI_FORMAT D3D11Mappings::getBF(GpuBufferFormat format)
  702. {
  703. static bool lookupInitialized = false;
  704. static DXGI_FORMAT lookup[BF_COUNT];
  705. if (!lookupInitialized)
  706. {
  707. lookup[BF_16X1F] = DXGI_FORMAT_R16_FLOAT;
  708. lookup[BF_16X2F] = DXGI_FORMAT_R16G16_FLOAT;
  709. lookup[BF_16X4F] = DXGI_FORMAT_R16G16B16A16_FLOAT;
  710. lookup[BF_32X1F] = DXGI_FORMAT_R32_FLOAT;
  711. lookup[BF_32X2F] = DXGI_FORMAT_R32G32_FLOAT;
  712. lookup[BF_32X3F] = DXGI_FORMAT_R32G32B32_FLOAT;
  713. lookup[BF_32X4F] = DXGI_FORMAT_R32G32B32A32_FLOAT;
  714. lookup[BF_8X1] = DXGI_FORMAT_R8_UNORM;
  715. lookup[BF_8X2] = DXGI_FORMAT_R8G8_UNORM;
  716. lookup[BF_8X4] = DXGI_FORMAT_R8G8B8A8_UNORM;
  717. lookup[BF_16X1] = DXGI_FORMAT_R16_UNORM;
  718. lookup[BF_16X2] = DXGI_FORMAT_R16G16_UNORM;
  719. lookup[BF_16X4] = DXGI_FORMAT_R16G16B16A16_UNORM;
  720. lookup[BF_8X1S] = DXGI_FORMAT_R8_SINT;
  721. lookup[BF_8X2S] = DXGI_FORMAT_R8G8_SINT;
  722. lookup[BF_8X4S] = DXGI_FORMAT_R8G8B8A8_SINT;
  723. lookup[BF_16X1S] = DXGI_FORMAT_R16_SINT;
  724. lookup[BF_16X2S] = DXGI_FORMAT_R16G16_SINT;
  725. lookup[BF_16X4S] = DXGI_FORMAT_R16G16B16A16_SINT;
  726. lookup[BF_32X1S] = DXGI_FORMAT_R32_SINT;
  727. lookup[BF_32X2S] = DXGI_FORMAT_R32G32_SINT;
  728. lookup[BF_32X3S] = DXGI_FORMAT_R32G32B32_SINT;
  729. lookup[BF_32X4S] = DXGI_FORMAT_R32G32B32A32_SINT;
  730. lookup[BF_8X1U] = DXGI_FORMAT_R8_UINT;
  731. lookup[BF_8X2U] = DXGI_FORMAT_R8G8_UINT;
  732. lookup[BF_8X4U] = DXGI_FORMAT_R8G8B8A8_UINT;
  733. lookup[BF_16X1U] = DXGI_FORMAT_R16_UINT;
  734. lookup[BF_16X2U] = DXGI_FORMAT_R16G16_UINT;
  735. lookup[BF_16X4U] = DXGI_FORMAT_R16G16B16A16_UINT;
  736. lookup[BF_32X1U] = DXGI_FORMAT_R32_UINT;
  737. lookup[BF_32X2U] = DXGI_FORMAT_R32G32_UINT;
  738. lookup[BF_32X3U] = DXGI_FORMAT_R32G32B32_UINT;
  739. lookup[BF_32X4U] = DXGI_FORMAT_R32G32B32A32_UINT;
  740. lookupInitialized = true;
  741. }
  742. if (format >= BF_COUNT)
  743. return DXGI_FORMAT_UNKNOWN;
  744. return lookup[(UINT32)format];
  745. }
  746. DXGI_FORMAT D3D11Mappings::getTypelessDepthStencilPF(PixelFormat format)
  747. {
  748. switch(format)
  749. {
  750. case PF_D32_S8X24:
  751. return DXGI_FORMAT_R32G8X24_TYPELESS;
  752. case PF_D24S8:
  753. return DXGI_FORMAT_R24G8_TYPELESS;
  754. case PF_D32:
  755. return DXGI_FORMAT_R32_TYPELESS;
  756. case PF_D16:
  757. return DXGI_FORMAT_R16_TYPELESS;
  758. default:
  759. return DXGI_FORMAT_UNKNOWN;
  760. }
  761. }
  762. DXGI_FORMAT D3D11Mappings::getShaderResourceDepthStencilPF(PixelFormat format)
  763. {
  764. switch (format)
  765. {
  766. case PF_D32_S8X24:
  767. return DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS;
  768. case PF_D24S8:
  769. return DXGI_FORMAT_R24_UNORM_X8_TYPELESS;
  770. case PF_D32:
  771. return DXGI_FORMAT_R32_FLOAT;
  772. case PF_D16:
  773. return DXGI_FORMAT_R16_UNORM;
  774. default:
  775. return DXGI_FORMAT_UNKNOWN;
  776. }
  777. }
  778. PixelFormat D3D11Mappings::getClosestSupportedPF(PixelFormat pf, TextureType texType, int usage)
  779. {
  780. // Check for any obvious issues first
  781. PixelUtil::checkFormat(pf, texType, usage);
  782. // Check for formats that are not supported at all by DX11
  783. switch(pf)
  784. {
  785. case PF_RGB8:
  786. pf = PF_RGBA8;
  787. break;
  788. default:
  789. break;
  790. }
  791. // Check for usage specific format restrictions
  792. if((usage & TU_LOADSTORE) != 0)
  793. {
  794. switch (pf)
  795. {
  796. case PF_BGRA8:
  797. pf = PF_RGBA8;
  798. break;
  799. default:
  800. break;
  801. }
  802. }
  803. return pf;
  804. }
  805. D3D11_USAGE D3D11Mappings::getUsage(GpuBufferUsage usage)
  806. {
  807. if (isDynamic(usage))
  808. return D3D11_USAGE_DYNAMIC;
  809. else
  810. return D3D11_USAGE_DEFAULT;
  811. }
  812. bool D3D11Mappings::isDynamic(GpuBufferUsage usage)
  813. {
  814. return (usage & GBU_DYNAMIC) != 0;
  815. }
  816. bool D3D11Mappings::isMappingWrite(D3D11_MAP map)
  817. {
  818. if(map == D3D11_MAP_READ)
  819. return false;
  820. return true;
  821. }
  822. bool D3D11Mappings::isMappingRead(D3D11_MAP map)
  823. {
  824. if(map == D3D11_MAP_READ || map == D3D11_MAP_READ_WRITE)
  825. return true;
  826. return false;
  827. }
  828. UINT D3D11Mappings::getAccessFlags(GpuBufferUsage usage)
  829. {
  830. if(isDynamic(usage))
  831. return D3D11_CPU_ACCESS_WRITE;
  832. else
  833. return 0;
  834. }
  835. D3D11_PRIMITIVE_TOPOLOGY D3D11Mappings::getPrimitiveType(DrawOperationType type)
  836. {
  837. switch(type)
  838. {
  839. case DOT_POINT_LIST:
  840. return D3D11_PRIMITIVE_TOPOLOGY_POINTLIST;
  841. case DOT_LINE_LIST:
  842. return D3D11_PRIMITIVE_TOPOLOGY_LINELIST;
  843. case DOT_LINE_STRIP:
  844. return D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP;
  845. case DOT_TRIANGLE_LIST:
  846. return D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
  847. case DOT_TRIANGLE_STRIP:
  848. return D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP;
  849. case DOT_TRIANGLE_FAN:
  850. BS_EXCEPT(InvalidParametersException, "D3D11 doesn't support triangle fan primitive type.");
  851. }
  852. return D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
  853. }
  854. UINT32 D3D11Mappings::getSizeInBytes(PixelFormat pf, UINT32 width, UINT32 height)
  855. {
  856. if(PixelUtil::isCompressed(pf))
  857. {
  858. UINT32 blockWidth = Math::divideAndRoundUp(width, 4U);
  859. UINT32 blockHeight = Math::divideAndRoundUp(height, 4U);
  860. // D3D wants the width of one row of cells in bytes
  861. if (pf == PF_BC1 || pf == PF_BC4)
  862. {
  863. // 64 bits (8 bytes) per 4x4 block
  864. return blockWidth * blockHeight * 8;
  865. }
  866. else
  867. {
  868. // 128 bits (16 bytes) per 4x4 block
  869. return blockWidth * blockHeight * 16;
  870. }
  871. }
  872. else
  873. {
  874. return width * height * PixelUtil::getNumElemBytes(pf);
  875. }
  876. }
  877. D3D11_MAP D3D11Mappings::getLockOptions(GpuLockOptions lockOptions)
  878. {
  879. switch(lockOptions)
  880. {
  881. case GBL_WRITE_ONLY_NO_OVERWRITE:
  882. return D3D11_MAP_WRITE_NO_OVERWRITE;
  883. break;
  884. case GBL_READ_WRITE:
  885. return D3D11_MAP_READ_WRITE;
  886. break;
  887. case GBL_WRITE_ONLY_DISCARD:
  888. return D3D11_MAP_WRITE_DISCARD;
  889. break;
  890. case GBL_READ_ONLY:
  891. return D3D11_MAP_READ;
  892. break;
  893. case GBL_WRITE_ONLY:
  894. return D3D11_MAP_WRITE;
  895. break;
  896. default:
  897. break;
  898. };
  899. BS_EXCEPT(RenderingAPIException, "Invalid lock option. No DX11 equivalent of: " + toString(lockOptions));
  900. return D3D11_MAP_WRITE;
  901. }
  902. }}