diff --git a/demos/demo_d3d12.h b/demos/demo_d3d12.h index 0b86ed2e2..08f4fc2f6 100644 --- a/demos/demo_d3d12.h +++ b/demos/demo_d3d12.h @@ -71,6 +71,7 @@ struct demo_swapchain { IDXGISwapChain3 *swapchain; unsigned int buffer_count; + char device_name[128]; }; static inline void demo_cleanup(struct demo *demo) @@ -98,6 +99,11 @@ static inline void demo_get_dpi(struct demo *demo, double *dpi_x, double *dpi_y) demo_win32_get_dpi(demo, dpi_x, dpi_y); } +static inline const char *demo_get_platform_name(void) +{ + return "Direct3D 12"; +} + static inline void demo_process_events(struct demo *demo) { demo_win32_process_events(demo); @@ -138,9 +144,14 @@ static inline struct demo_swapchain *demo_swapchain_create(ID3D12CommandQueue *c struct demo_window_win32 *window_win32 = CONTAINING_RECORD(window, struct demo_window_win32, w); DXGI_SWAP_CHAIN_DESC1 swapchain_desc; struct demo_swapchain *swapchain; + DXGI_ADAPTER_DESC adapter_desc; IDXGISwapChain1 *swapchain1; IDXGIFactory2 *factory; + IDXGIAdapter *adapter; + ID3D12Device *device; + unsigned int i; HRESULT hr; + LUID luid; if (!(swapchain = malloc(sizeof(*swapchain)))) return NULL; @@ -148,6 +159,27 @@ static inline struct demo_swapchain *demo_swapchain_create(ID3D12CommandQueue *c if (FAILED(CreateDXGIFactory1(&IID_IDXGIFactory2, (void **)&factory))) goto fail; + if (FAILED(ID3D12CommandQueue_GetDevice(command_queue, &IID_ID3D12Device, (void **)&device))) + goto fail; + luid = ID3D12Device_GetAdapterLuid(device); + ID3D12Device_Release(device); + + sprintf(swapchain->device_name, "Unknown"); + for (i = 0; IDXGIFactory2_EnumAdapters(factory, i, &adapter) == S_OK; ++i) + { + hr = IDXGIAdapter_GetDesc(adapter, &adapter_desc); + IDXGIAdapter_Release(adapter); + if (FAILED(hr)) + continue; + + if (adapter_desc.AdapterLuid.LowPart == luid.LowPart + && adapter_desc.AdapterLuid.HighPart == luid.HighPart) + { + snprintf(swapchain->device_name, ARRAY_SIZE(swapchain->device_name), "%ls", adapter_desc.Description); + break; + } + } + memset(&swapchain_desc, 0, sizeof(swapchain_desc)); swapchain_desc.BufferCount = desc->buffer_count; swapchain_desc.Width = desc->width; @@ -176,6 +208,11 @@ fail: return NULL; } +static inline const char *demo_swapchain_get_device_name(struct demo_swapchain *swapchain) +{ + return swapchain->device_name; +} + static inline unsigned int demo_swapchain_get_current_back_buffer_index(struct demo_swapchain *swapchain) { return IDXGISwapChain3_GetCurrentBackBufferIndex(swapchain->swapchain); diff --git a/demos/demo_vkd3d.h b/demos/demo_vkd3d.h index d25275f16..0418caf28 100644 --- a/demos/demo_vkd3d.h +++ b/demos/demo_vkd3d.h @@ -59,6 +59,7 @@ DECLARE_VK_PFN(vkCreateXcbSurfaceKHR) DECLARE_VK_PFN(vkDestroyFence) DECLARE_VK_PFN(vkDestroySurfaceKHR) DECLARE_VK_PFN(vkDestroySwapchainKHR) +DECLARE_VK_PFN(vkGetPhysicalDeviceProperties) DECLARE_VK_PFN(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) DECLARE_VK_PFN(vkGetPhysicalDeviceSurfaceFormatsKHR) DECLARE_VK_PFN(vkGetPhysicalDeviceSurfaceSupportKHR) @@ -228,6 +229,7 @@ static void load_vulkan_procs(void) LOAD_VK_PFN(vkDestroyFence) LOAD_VK_PFN(vkDestroySurfaceKHR) LOAD_VK_PFN(vkDestroySwapchainKHR) + LOAD_VK_PFN(vkGetPhysicalDeviceProperties) LOAD_VK_PFN(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) LOAD_VK_PFN(vkGetPhysicalDeviceSurfaceFormatsKHR) LOAD_VK_PFN(vkGetPhysicalDeviceSurfaceSupportKHR) @@ -239,6 +241,7 @@ static void load_vulkan_procs(void) struct demo_swapchain { + VkPhysicalDeviceProperties vk_device_properties; VkSurfaceKHR vk_surface; VkSwapchainKHR vk_swapchain; VkFence vk_fence; @@ -310,6 +313,11 @@ static inline void demo_get_dpi(struct demo *demo, double *dpi_x, double *dpi_y) demo->get_dpi(demo, dpi_x, dpi_y); } +static inline const char *demo_get_platform_name(void) +{ + return "vkd3d"; +} + static inline void demo_process_events(struct demo *demo) { demo->process_events(demo); @@ -475,6 +483,7 @@ static inline struct demo_swapchain *demo_swapchain_create(ID3D12CommandQueue *c free(vk_images); goto fail; } + vkGetPhysicalDeviceProperties(vk_physical_device, &swapchain->vk_device_properties); swapchain->vk_surface = vk_surface; swapchain->vk_swapchain = vk_swapchain; swapchain->vk_fence = vk_fence; @@ -544,6 +553,11 @@ fail: return NULL; } +static inline const char *demo_swapchain_get_device_name(struct demo_swapchain *swapchain) +{ + return swapchain->vk_device_properties.deviceName; +} + static inline unsigned int demo_swapchain_get_current_back_buffer_index(struct demo_swapchain *swapchain) { return swapchain->current_buffer; diff --git a/demos/gears.c b/demos/gears.c index 1ffe6fbbc..90979ca5f 100644 --- a/demos/gears.c +++ b/demos/gears.c @@ -891,6 +891,8 @@ static int cxg_main(void) cxg_populate_command_list(&cxg, i); } + printf("vkd3d-gears: Running on \"%s\" using %s.\n", + demo_swapchain_get_device_name(cxg.swapchain), demo_get_platform_name()); demo_process_events(&cxg.demo); cxg_wait_for_previous_frame(&cxg); diff --git a/demos/triangle.c b/demos/triangle.c index 35ebc145c..e01c54622 100644 --- a/demos/triangle.c +++ b/demos/triangle.c @@ -400,6 +400,8 @@ static int cxt_main(void) cxt_load_pipeline(&cxt); cxt_load_assets(&cxt); + printf("vkd3d-triangle: Running on \"%s\" using %s.\n", + demo_swapchain_get_device_name(cxt.swapchain), demo_get_platform_name()); demo_process_events(&cxt.demo); cxt_wait_for_previous_frame(&cxt);