openxr_d3d12_extension.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. /**************************************************************************/
  2. /* openxr_d3d12_extension.cpp */
  3. /**************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /**************************************************************************/
  8. /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
  9. /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /**************************************************************************/
  30. #include "openxr_d3d12_extension.h"
  31. #ifdef D3D12_ENABLED
  32. #include "../../openxr_util.h"
  33. #include "servers/rendering/rendering_server_globals.h"
  34. #include "servers/rendering_server.h"
  35. HashMap<String, bool *> OpenXRD3D12Extension::get_requested_extensions() {
  36. HashMap<String, bool *> request_extensions;
  37. request_extensions[XR_KHR_D3D12_ENABLE_EXTENSION_NAME] = nullptr;
  38. return request_extensions;
  39. }
  40. void OpenXRD3D12Extension::on_instance_created(const XrInstance p_instance) {
  41. // Obtain pointers to functions we're accessing here.
  42. ERR_FAIL_NULL(OpenXRAPI::get_singleton());
  43. EXT_INIT_XR_FUNC(xrGetD3D12GraphicsRequirementsKHR);
  44. EXT_INIT_XR_FUNC(xrEnumerateSwapchainImages);
  45. }
  46. D3D_FEATURE_LEVEL OpenXRD3D12Extension::get_feature_level() const {
  47. XrGraphicsRequirementsD3D12KHR d3d12_requirements = {
  48. XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR, // type
  49. nullptr, // next
  50. { 0, 0 }, // adapterLuid
  51. (D3D_FEATURE_LEVEL)0 // minFeatureLevel
  52. };
  53. XrResult result = xrGetD3D12GraphicsRequirementsKHR(OpenXRAPI::get_singleton()->get_instance(), OpenXRAPI::get_singleton()->get_system_id(), &d3d12_requirements);
  54. if (XR_FAILED(result)) {
  55. print_line("OpenXR: Failed to get Direct3D 12 graphics requirements [", OpenXRAPI::get_singleton()->get_error_string(result), "]");
  56. return D3D_FEATURE_LEVEL_11_0; // Good default.
  57. }
  58. // #ifdef DEBUG
  59. print_line("OpenXR: xrGetD3D12GraphicsRequirementsKHR:");
  60. print_line(" - minFeatureLevel: ", (uint32_t)d3d12_requirements.minFeatureLevel);
  61. // #endif
  62. return d3d12_requirements.minFeatureLevel;
  63. }
  64. LUID OpenXRD3D12Extension::get_adapter_luid() const {
  65. XrGraphicsRequirementsD3D12KHR d3d12_requirements = {
  66. XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR, // type
  67. nullptr, // next
  68. { 0, 0 }, // adapterLuid
  69. (D3D_FEATURE_LEVEL)0 // minFeatureLevel
  70. };
  71. XrResult result = xrGetD3D12GraphicsRequirementsKHR(OpenXRAPI::get_singleton()->get_instance(), OpenXRAPI::get_singleton()->get_system_id(), &d3d12_requirements);
  72. if (XR_FAILED(result)) {
  73. print_line("OpenXR: Failed to get Direct3D 12 graphics requirements [", OpenXRAPI::get_singleton()->get_error_string(result), "]");
  74. return {};
  75. }
  76. return d3d12_requirements.adapterLuid;
  77. }
  78. void OpenXRD3D12Extension::set_device(ID3D12Device *p_device) {
  79. graphics_device = p_device;
  80. }
  81. void OpenXRD3D12Extension::set_command_queue(ID3D12CommandQueue *p_queue) {
  82. command_queue = p_queue;
  83. }
  84. void OpenXRD3D12Extension::cleanup_device() {
  85. command_queue.Reset();
  86. graphics_device.Reset();
  87. }
  88. XrGraphicsBindingD3D12KHR OpenXRD3D12Extension::graphics_binding_d3d12;
  89. void *OpenXRD3D12Extension::set_session_create_and_get_next_pointer(void *p_next_pointer) {
  90. DEV_ASSERT(graphics_device && "Graphics Device was not specified yet.");
  91. DEV_ASSERT(command_queue && "Command queue was not specified yet.");
  92. graphics_binding_d3d12.type = XR_TYPE_GRAPHICS_BINDING_D3D12_KHR,
  93. graphics_binding_d3d12.next = p_next_pointer;
  94. graphics_binding_d3d12.device = graphics_device.Get();
  95. graphics_binding_d3d12.queue = command_queue.Get();
  96. return &graphics_binding_d3d12;
  97. }
  98. void OpenXRD3D12Extension::get_usable_swapchain_formats(Vector<int64_t> &p_usable_swap_chains) {
  99. p_usable_swap_chains.push_back(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB);
  100. p_usable_swap_chains.push_back(DXGI_FORMAT_B8G8R8A8_UNORM_SRGB);
  101. p_usable_swap_chains.push_back(DXGI_FORMAT_R8G8B8A8_UNORM);
  102. p_usable_swap_chains.push_back(DXGI_FORMAT_B8G8R8A8_UNORM);
  103. }
  104. void OpenXRD3D12Extension::get_usable_depth_formats(Vector<int64_t> &p_usable_depth_formats) {
  105. p_usable_depth_formats.push_back(DXGI_FORMAT_D32_FLOAT);
  106. p_usable_depth_formats.push_back(DXGI_FORMAT_D32_FLOAT_S8X24_UINT);
  107. p_usable_depth_formats.push_back(DXGI_FORMAT_D24_UNORM_S8_UINT);
  108. p_usable_depth_formats.push_back(DXGI_FORMAT_D16_UNORM);
  109. }
  110. bool OpenXRD3D12Extension::get_swapchain_image_data(XrSwapchain p_swapchain, int64_t p_swapchain_format, uint32_t p_width, uint32_t p_height, uint32_t p_sample_count, uint32_t p_array_size, void **r_swapchain_graphics_data) {
  111. RenderingServer *rendering_server = RenderingServer::get_singleton();
  112. ERR_FAIL_NULL_V(rendering_server, false);
  113. RenderingDevice *rendering_device = rendering_server->get_rendering_device();
  114. ERR_FAIL_NULL_V(rendering_device, false);
  115. uint32_t swapchain_length;
  116. XrResult result = xrEnumerateSwapchainImages(p_swapchain, 0, &swapchain_length, nullptr);
  117. if (XR_FAILED(result)) {
  118. print_line("OpenXR: Failed to get swapchain image count [", OpenXRAPI::get_singleton()->get_error_string(result), "]");
  119. return false;
  120. }
  121. LocalVector<XrSwapchainImageD3D12KHR> images;
  122. images.resize(swapchain_length);
  123. for (XrSwapchainImageD3D12KHR &image : images) {
  124. image.type = XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR;
  125. image.next = nullptr;
  126. image.texture = nullptr;
  127. }
  128. result = xrEnumerateSwapchainImages(p_swapchain, swapchain_length, &swapchain_length, (XrSwapchainImageBaseHeader *)images.ptr());
  129. if (XR_FAILED(result)) {
  130. print_line("OpenXR: Failed to get swapchain images [", OpenXRAPI::get_singleton()->get_error_string(result), "]");
  131. return false;
  132. }
  133. SwapchainGraphicsData *data = memnew(SwapchainGraphicsData);
  134. if (data == nullptr) {
  135. print_line("OpenXR: Failed to allocate memory for swapchain data");
  136. return false;
  137. }
  138. *r_swapchain_graphics_data = data;
  139. data->is_multiview = (p_array_size > 1);
  140. RenderingDevice::DataFormat format = RenderingDevice::DATA_FORMAT_R8G8B8A8_SRGB;
  141. RenderingDevice::TextureSamples samples = RenderingDevice::TEXTURE_SAMPLES_1;
  142. uint64_t usage_flags = RenderingDevice::TEXTURE_USAGE_SAMPLING_BIT;
  143. switch (p_swapchain_format) {
  144. case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
  145. // Even though this is an sRGB framebuffer format we're using UNORM here.
  146. // The reason here is because Godot does a linear to sRGB conversion while
  147. // with the sRGB format, this conversion would be doubled by the hardware.
  148. // This also means we're reading the values as is for our preview on screen.
  149. // The OpenXR runtime however is still treating this as an sRGB format and
  150. // will thus do an sRGB -> Linear conversion as expected.
  151. //format = RenderingDevice::DATA_FORMAT_R8G8B8A8_SRGB;
  152. format = RenderingDevice::DATA_FORMAT_R8G8B8A8_UNORM;
  153. usage_flags |= RenderingDevice::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT;
  154. break;
  155. case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
  156. //format = RenderingDevice::DATA_FORMAT_B8G8R8A8_SRGB;
  157. format = RenderingDevice::DATA_FORMAT_B8G8R8A8_UNORM;
  158. usage_flags |= RenderingDevice::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT;
  159. break;
  160. case DXGI_FORMAT_R8G8B8A8_UNORM:
  161. format = RenderingDevice::DATA_FORMAT_R8G8B8A8_UINT;
  162. usage_flags |= RenderingDevice::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT;
  163. break;
  164. case DXGI_FORMAT_B8G8R8A8_UNORM:
  165. format = RenderingDevice::DATA_FORMAT_B8G8R8A8_UINT;
  166. usage_flags |= RenderingDevice::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT;
  167. break;
  168. case DXGI_FORMAT_D32_FLOAT:
  169. format = RenderingDevice::DATA_FORMAT_D32_SFLOAT;
  170. usage_flags |= RenderingDevice::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
  171. break;
  172. case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
  173. format = RenderingDevice::DATA_FORMAT_D32_SFLOAT_S8_UINT;
  174. usage_flags |= RenderingDevice::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
  175. break;
  176. case DXGI_FORMAT_D24_UNORM_S8_UINT:
  177. format = RenderingDevice::DATA_FORMAT_D24_UNORM_S8_UINT;
  178. usage_flags |= RenderingDevice::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
  179. break;
  180. case DXGI_FORMAT_D16_UNORM:
  181. format = RenderingDevice::DATA_FORMAT_D16_UNORM;
  182. usage_flags |= RenderingDevice::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
  183. break;
  184. default:
  185. // continue with our default value
  186. print_line("OpenXR: Unsupported swapchain format", p_swapchain_format);
  187. break;
  188. }
  189. switch (p_sample_count) {
  190. case 1:
  191. samples = RenderingDevice::TEXTURE_SAMPLES_1;
  192. break;
  193. case 2:
  194. samples = RenderingDevice::TEXTURE_SAMPLES_2;
  195. break;
  196. case 4:
  197. samples = RenderingDevice::TEXTURE_SAMPLES_4;
  198. break;
  199. case 8:
  200. samples = RenderingDevice::TEXTURE_SAMPLES_8;
  201. break;
  202. case 16:
  203. samples = RenderingDevice::TEXTURE_SAMPLES_16;
  204. break;
  205. case 32:
  206. samples = RenderingDevice::TEXTURE_SAMPLES_32;
  207. break;
  208. case 64:
  209. samples = RenderingDevice::TEXTURE_SAMPLES_64;
  210. break;
  211. default:
  212. // continue with our default value
  213. print_line("OpenXR: Unsupported sample count", p_sample_count);
  214. break;
  215. }
  216. Vector<RID> texture_rids;
  217. for (const XrSwapchainImageD3D12KHR &swapchain_image : images) {
  218. RID texture_rid = rendering_device->texture_create_from_extension(
  219. p_array_size == 1 ? RenderingDevice::TEXTURE_TYPE_2D : RenderingDevice::TEXTURE_TYPE_2D_ARRAY,
  220. format,
  221. samples,
  222. usage_flags,
  223. (uint64_t)swapchain_image.texture,
  224. p_width,
  225. p_height,
  226. 1,
  227. p_array_size);
  228. texture_rids.push_back(texture_rid);
  229. }
  230. data->texture_rids = texture_rids;
  231. return true;
  232. }
  233. bool OpenXRD3D12Extension::create_projection_fov(const XrFovf p_fov, double p_z_near, double p_z_far, Projection &r_camera_matrix) {
  234. OpenXRUtil::XrMatrix4x4f matrix;
  235. OpenXRUtil::XrMatrix4x4f_CreateProjectionFov(&matrix, OpenXRUtil::GRAPHICS_D3D, p_fov, (float)p_z_near, (float)p_z_far);
  236. for (int j = 0; j < 4; j++) {
  237. for (int i = 0; i < 4; i++) {
  238. r_camera_matrix.columns[j][i] = matrix.m[j * 4 + i];
  239. }
  240. }
  241. return true;
  242. }
  243. RID OpenXRD3D12Extension::get_texture(void *p_swapchain_graphics_data, int p_image_index) {
  244. SwapchainGraphicsData *data = (SwapchainGraphicsData *)p_swapchain_graphics_data;
  245. ERR_FAIL_NULL_V(data, RID());
  246. ERR_FAIL_INDEX_V(p_image_index, data->texture_rids.size(), RID());
  247. return data->texture_rids[p_image_index];
  248. }
  249. void OpenXRD3D12Extension::cleanup_swapchain_graphics_data(void **p_swapchain_graphics_data) {
  250. if (*p_swapchain_graphics_data == nullptr) {
  251. return;
  252. }
  253. RenderingServer *rendering_server = RenderingServer::get_singleton();
  254. ERR_FAIL_NULL(rendering_server);
  255. RenderingDevice *rendering_device = rendering_server->get_rendering_device();
  256. ERR_FAIL_NULL(rendering_device);
  257. SwapchainGraphicsData *data = (SwapchainGraphicsData *)*p_swapchain_graphics_data;
  258. for (const RID &texture_rid : data->texture_rids) {
  259. // This should clean up our RIDs and associated texture objects but shouldn't destroy the images, they are owned by our XrSwapchain.
  260. rendering_device->free(texture_rid);
  261. }
  262. data->texture_rids.clear();
  263. memdelete(data);
  264. *p_swapchain_graphics_data = nullptr;
  265. }
  266. #define ENUM_TO_STRING_CASE(e) \
  267. case e: { \
  268. return String(#e); \
  269. } break;
  270. String OpenXRD3D12Extension::get_swapchain_format_name(int64_t p_swapchain_format) const {
  271. // These are somewhat different per platform, will need to weed some stuff out...
  272. switch (p_swapchain_format) {
  273. ENUM_TO_STRING_CASE(DXGI_FORMAT_UNKNOWN)
  274. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32G32B32A32_TYPELESS)
  275. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32G32B32A32_FLOAT)
  276. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32G32B32A32_UINT)
  277. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32G32B32A32_SINT)
  278. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32G32B32_TYPELESS)
  279. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32G32B32_FLOAT)
  280. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32G32B32_UINT)
  281. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32G32B32_SINT)
  282. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16G16B16A16_TYPELESS)
  283. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16G16B16A16_FLOAT)
  284. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16G16B16A16_UNORM)
  285. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16G16B16A16_UINT)
  286. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16G16B16A16_SNORM)
  287. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16G16B16A16_SINT)
  288. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32G32_TYPELESS)
  289. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32G32_FLOAT)
  290. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32G32_UINT)
  291. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32G32_SINT)
  292. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32G8X24_TYPELESS)
  293. ENUM_TO_STRING_CASE(DXGI_FORMAT_D32_FLOAT_S8X24_UINT)
  294. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS)
  295. ENUM_TO_STRING_CASE(DXGI_FORMAT_X32_TYPELESS_G8X24_UINT)
  296. ENUM_TO_STRING_CASE(DXGI_FORMAT_R10G10B10A2_TYPELESS)
  297. ENUM_TO_STRING_CASE(DXGI_FORMAT_R10G10B10A2_UNORM)
  298. ENUM_TO_STRING_CASE(DXGI_FORMAT_R10G10B10A2_UINT)
  299. ENUM_TO_STRING_CASE(DXGI_FORMAT_R11G11B10_FLOAT)
  300. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8G8B8A8_TYPELESS)
  301. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8G8B8A8_UNORM)
  302. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB)
  303. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8G8B8A8_UINT)
  304. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8G8B8A8_SNORM)
  305. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8G8B8A8_SINT)
  306. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16G16_TYPELESS)
  307. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16G16_FLOAT)
  308. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16G16_UNORM)
  309. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16G16_UINT)
  310. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16G16_SNORM)
  311. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16G16_SINT)
  312. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32_TYPELESS)
  313. ENUM_TO_STRING_CASE(DXGI_FORMAT_D32_FLOAT)
  314. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32_FLOAT)
  315. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32_UINT)
  316. ENUM_TO_STRING_CASE(DXGI_FORMAT_R32_SINT)
  317. ENUM_TO_STRING_CASE(DXGI_FORMAT_R24G8_TYPELESS)
  318. ENUM_TO_STRING_CASE(DXGI_FORMAT_D24_UNORM_S8_UINT)
  319. ENUM_TO_STRING_CASE(DXGI_FORMAT_R24_UNORM_X8_TYPELESS)
  320. ENUM_TO_STRING_CASE(DXGI_FORMAT_X24_TYPELESS_G8_UINT)
  321. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8G8_TYPELESS)
  322. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8G8_UNORM)
  323. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8G8_UINT)
  324. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8G8_SNORM)
  325. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8G8_SINT)
  326. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16_TYPELESS)
  327. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16_FLOAT)
  328. ENUM_TO_STRING_CASE(DXGI_FORMAT_D16_UNORM)
  329. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16_UNORM)
  330. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16_UINT)
  331. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16_SNORM)
  332. ENUM_TO_STRING_CASE(DXGI_FORMAT_R16_SINT)
  333. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8_TYPELESS)
  334. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8_UNORM)
  335. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8_UINT)
  336. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8_SNORM)
  337. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8_SINT)
  338. ENUM_TO_STRING_CASE(DXGI_FORMAT_A8_UNORM)
  339. ENUM_TO_STRING_CASE(DXGI_FORMAT_R1_UNORM)
  340. ENUM_TO_STRING_CASE(DXGI_FORMAT_R9G9B9E5_SHAREDEXP)
  341. ENUM_TO_STRING_CASE(DXGI_FORMAT_R8G8_B8G8_UNORM)
  342. ENUM_TO_STRING_CASE(DXGI_FORMAT_G8R8_G8B8_UNORM)
  343. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC1_TYPELESS)
  344. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC1_UNORM)
  345. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC1_UNORM_SRGB)
  346. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC2_TYPELESS)
  347. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC2_UNORM)
  348. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC2_UNORM_SRGB)
  349. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC3_TYPELESS)
  350. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC3_UNORM)
  351. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC3_UNORM_SRGB)
  352. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC4_TYPELESS)
  353. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC4_UNORM)
  354. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC4_SNORM)
  355. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC5_TYPELESS)
  356. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC5_UNORM)
  357. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC5_SNORM)
  358. ENUM_TO_STRING_CASE(DXGI_FORMAT_B5G6R5_UNORM)
  359. ENUM_TO_STRING_CASE(DXGI_FORMAT_B5G5R5A1_UNORM)
  360. ENUM_TO_STRING_CASE(DXGI_FORMAT_B8G8R8A8_UNORM)
  361. ENUM_TO_STRING_CASE(DXGI_FORMAT_B8G8R8X8_UNORM)
  362. ENUM_TO_STRING_CASE(DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM)
  363. ENUM_TO_STRING_CASE(DXGI_FORMAT_B8G8R8A8_TYPELESS)
  364. ENUM_TO_STRING_CASE(DXGI_FORMAT_B8G8R8A8_UNORM_SRGB)
  365. ENUM_TO_STRING_CASE(DXGI_FORMAT_B8G8R8X8_TYPELESS)
  366. ENUM_TO_STRING_CASE(DXGI_FORMAT_B8G8R8X8_UNORM_SRGB)
  367. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC6H_TYPELESS)
  368. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC6H_UF16)
  369. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC6H_SF16)
  370. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC7_TYPELESS)
  371. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC7_UNORM)
  372. ENUM_TO_STRING_CASE(DXGI_FORMAT_BC7_UNORM_SRGB)
  373. ENUM_TO_STRING_CASE(DXGI_FORMAT_AYUV)
  374. ENUM_TO_STRING_CASE(DXGI_FORMAT_Y410)
  375. ENUM_TO_STRING_CASE(DXGI_FORMAT_Y416)
  376. ENUM_TO_STRING_CASE(DXGI_FORMAT_NV12)
  377. ENUM_TO_STRING_CASE(DXGI_FORMAT_P010)
  378. ENUM_TO_STRING_CASE(DXGI_FORMAT_P016)
  379. ENUM_TO_STRING_CASE(DXGI_FORMAT_420_OPAQUE)
  380. ENUM_TO_STRING_CASE(DXGI_FORMAT_YUY2)
  381. ENUM_TO_STRING_CASE(DXGI_FORMAT_Y210)
  382. ENUM_TO_STRING_CASE(DXGI_FORMAT_Y216)
  383. ENUM_TO_STRING_CASE(DXGI_FORMAT_NV11)
  384. ENUM_TO_STRING_CASE(DXGI_FORMAT_AI44)
  385. ENUM_TO_STRING_CASE(DXGI_FORMAT_IA44)
  386. ENUM_TO_STRING_CASE(DXGI_FORMAT_P8)
  387. ENUM_TO_STRING_CASE(DXGI_FORMAT_A8P8)
  388. ENUM_TO_STRING_CASE(DXGI_FORMAT_B4G4R4A4_UNORM)
  389. ENUM_TO_STRING_CASE(DXGI_FORMAT_P208)
  390. ENUM_TO_STRING_CASE(DXGI_FORMAT_V208)
  391. ENUM_TO_STRING_CASE(DXGI_FORMAT_V408)
  392. ENUM_TO_STRING_CASE(DXGI_FORMAT_A4B4G4R4_UNORM)
  393. default: {
  394. return String("Swapchain format ") + String::num_int64(int64_t(p_swapchain_format));
  395. } break;
  396. }
  397. }
  398. #endif // D3D12_ENABLED