From a24461187ec292162441e8edd445b993059af7bf Mon Sep 17 00:00:00 2001 From: jacob Date: Mon, 23 Feb 2026 18:33:27 -0600 Subject: [PATCH] add commandline argument to disable d3d12 independent devices since nsight seems to have issues connecting --- src/gpu/gpu_dx12/gpu_dx12_core.c | 107 +++++++++++++++++++++---------- src/gpu/gpu_dx12/gpu_dx12_core.h | 7 +- 2 files changed, 79 insertions(+), 35 deletions(-) diff --git a/src/gpu/gpu_dx12/gpu_dx12_core.c b/src/gpu/gpu_dx12/gpu_dx12_core.c index e9966051..d00464de 100644 --- a/src/gpu/gpu_dx12/gpu_dx12_core.c +++ b/src/gpu/gpu_dx12/gpu_dx12_core.c @@ -9,18 +9,22 @@ void G_Bootstrap(void) TempArena scratch = BeginScratchNoConflict(); Arena *perm = PermArena(); + // NOTE: Nsight seems to have trouble attaching when independent devices are enabled + b32 independent_devices_enabled = !CommandlineArgFromName(Lit("no-independent-d3d12-device")).exists; + LogInfoF("D3D12 independent devices enabled: %F", FmtSint(independent_devices_enabled)); + ////////////////////////////// //- Extract agility SDK String appdir = GetAppDirectory(); - // FIXME: Include actual sdk header for this value u32 sdk_ver_num = 618; String sdk_ver_str = Lit("1.618.5"); - String sdk_dir_path = StringF(scratch.arena, "%FD3D12/%F/", FmtString(appdir), FmtString(sdk_ver_str)); - String core_path = StringF(scratch.arena, "%FD3D12Core.dll", FmtString(sdk_dir_path)); - String layers_path = StringF(scratch.arena, "%Fd3d12SDKLayers.dll", FmtString(sdk_dir_path)); + String sdk_dir_path = StringF(scratch.arena, "%Fd3d12/%F/", FmtString(appdir), FmtString(sdk_ver_str)); { + LogInfoF("D3D12 agility sdk path: \"%F\"", FmtString(sdk_dir_path)); + String core_path = StringF(scratch.arena, "%FD3D12Core.dll", FmtString(sdk_dir_path)); + String layers_path = StringF(scratch.arena, "%Fd3d12SDKLayers.dll", FmtString(sdk_dir_path)); if (!PLT_IsFile(core_path) || !PLT_IsFile(layers_path)) { LogInfoF("Unpacking D3D12 Agility SDK to %F", FmtString(sdk_dir_path)); @@ -55,21 +59,18 @@ void G_Bootstrap(void) ////////////////////////////// //- Create device factory - ID3D12DeviceFactory *device_factory = 0; { - ID3D12SDKConfiguration1 *sdk_config = 0; - D3D12GetInterface(&CLSID_D3D12SDKConfiguration, &IID_ID3D12SDKConfiguration1, (void **)&sdk_config); + D3D12GetInterface(&CLSID_D3D12SDKConfiguration, &IID_ID3D12SDKConfiguration1, (void **)&G_D12.sdk_config); // Create device factory - char *sdk_path_cstr = CstrFromString(scratch.arena, sdk_dir_path); + char *sdk_dir_path_cstr = CstrFromString(scratch.arena, PathFromString(scratch.arena, sdk_dir_path, '\\')); HRESULT hr = ID3D12SDKConfiguration1_CreateDeviceFactory( - sdk_config, + G_D12.sdk_config, sdk_ver_num, - sdk_path_cstr, + sdk_dir_path_cstr, &IID_ID3D12DeviceFactory, - (void **)&device_factory + (void **)&G_D12.device_factory ); - if (FAILED(hr)) { Panic(StringF(scratch.arena, "Failed to create ID3D12DeviceFactory: Error code 0x%F", FmtHex(hr))); @@ -79,9 +80,8 @@ void G_Bootstrap(void) if (GPU_DEBUG) { ID3D12Debug1 *debug = 0; - ID3D12DeviceFactory_GetConfigurationInterface(device_factory, &CLSID_D3D12Debug, &IID_ID3D12Debug1, (void **)&debug); + ID3D12DeviceFactory_GetConfigurationInterface(G_D12.device_factory, &CLSID_D3D12Debug, &IID_ID3D12Debug1, (void **)&debug); ID3D12Debug1_EnableDebugLayer(debug); - if (GPU_DEBUG_VALIDATION) { ID3D12Debug1_SetEnableGPUBasedValidation(debug, 1); @@ -102,7 +102,7 @@ void G_Bootstrap(void) { dxgi_factory_flags |= DXGI_CREATE_FACTORY_DEBUG; } - hr = CreateDXGIFactory2(dxgi_factory_flags, &IID_IDXGIFactory6, (void **)&G_D12.factory); + hr = CreateDXGIFactory2(dxgi_factory_flags, &IID_IDXGIFactory6, (void **)&G_D12.dxgi_factory); if (FAILED(hr)) { Panic(Lit("Failed to initialize DXGI factory")); @@ -120,17 +120,25 @@ void G_Bootstrap(void) i32 skips = 0; // For iGPU testing while (!done) { - hr = IDXGIFactory6_EnumAdapterByGpuPreference(G_D12.factory, adapter_index, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, &IID_IDXGIAdapter3, (void **)&adapter); + hr = IDXGIFactory6_EnumAdapterByGpuPreference(G_D12.dxgi_factory, adapter_index, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, &IID_IDXGIAdapter3, (void **)&adapter); if (SUCCEEDED(hr)) { { DXGI_ADAPTER_DESC1 desc; IDXGIAdapter3_GetDesc1(adapter, &desc); adapter_name = StringFromWstrNoLimit(scratch.arena, desc.Description); + LogInfoF("D3D12 adapter name: '%F'", FmtString(adapter_name)); } if (skips <= 0) { - hr = ID3D12DeviceFactory_CreateDevice(device_factory, (IUnknown *)adapter, D3D_FEATURE_LEVEL_12_0, &IID_ID3D12Device10, (void **)&device); + if (independent_devices_enabled) + { + hr = ID3D12DeviceFactory_CreateDevice(G_D12.device_factory, (IUnknown *)adapter, D3D_FEATURE_LEVEL_12_0, &IID_ID3D12Device10, (void **)&device); + } + else + { + hr = D3D12CreateDevice((IUnknown *)adapter, D3D_FEATURE_LEVEL_12_0, &IID_ID3D12Device10, (void **)&device); + } done = 1; } else @@ -155,7 +163,7 @@ void G_Bootstrap(void) } } - if (!device) + if (!device || !SUCCEEDED(hr)) { if (adapter_name.len > 0) { @@ -225,10 +233,19 @@ void G_Bootstrap(void) } } - G_D12.adapter = adapter; + G_D12.dxgi_adapter = adapter; G_D12.device = device; } + // Retrieve device configuration + { + hr = ID3D12Device_QueryInterface(G_D12.device, &IID_ID3D12DeviceConfiguration, (void **)&G_D12.device_config); + if (FAILED(hr)) + { + Panic(Lit("Failed to query ID3D12DeviceConfiguration interface")); + } + } + // Enable debug layer breaks if (GPU_DEBUG) { @@ -257,6 +274,30 @@ void G_Bootstrap(void) IDXGIInfoQueue_Release(dxgi_info); } } + + // Log device configuration + { + D3D12_DEVICE_CONFIGURATION_DESC desc = Zi; + ID3D12DeviceConfiguration_GetDesc(G_D12.device_config, &desc); + StringList flags_list = Zi; + { + if (desc.Flags & D3D12_DEVICE_FLAG_DEBUG_LAYER_ENABLED) PushStringToList(scratch.arena, &flags_list, Lit("D3D12_DEVICE_FLAG_DEBUG_LAYER_ENABLED")); + if (desc.Flags & D3D12_DEVICE_FLAG_GPU_BASED_VALIDATION_ENABLED) PushStringToList(scratch.arena, &flags_list, Lit("D3D12_DEVICE_FLAG_GPU_BASED_VALIDATION_ENABLED")); + if (desc.Flags & D3D12_DEVICE_FLAG_SYNCHRONIZED_COMMAND_QUEUE_VALIDATION_DISABLED) PushStringToList(scratch.arena, &flags_list, Lit("D3D12_DEVICE_FLAG_SYNCHRONIZED_COMMAND_QUEUE_VALIDATION_DISABLED")); + if (desc.Flags & D3D12_DEVICE_FLAG_DRED_AUTO_BREADCRUMBS_ENABLED) PushStringToList(scratch.arena, &flags_list, Lit("D3D12_DEVICE_FLAG_DRED_AUTO_BREADCRUMBS_ENABLED")); + if (desc.Flags & D3D12_DEVICE_FLAG_DRED_PAGE_FAULT_REPORTING_ENABLED) PushStringToList(scratch.arena, &flags_list, Lit("D3D12_DEVICE_FLAG_DRED_PAGE_FAULT_REPORTING_ENABLED")); + if (desc.Flags & D3D12_DEVICE_FLAG_DRED_WATSON_REPORTING_ENABLED) PushStringToList(scratch.arena, &flags_list, Lit("D3D12_DEVICE_FLAG_DRED_WATSON_REPORTING_ENABLED")); + if (desc.Flags & D3D12_DEVICE_FLAG_DRED_BREADCRUMB_CONTEXT_ENABLED) PushStringToList(scratch.arena, &flags_list, Lit("D3D12_DEVICE_FLAG_DRED_BREADCRUMB_CONTEXT_ENABLED")); + if (desc.Flags & D3D12_DEVICE_FLAG_DRED_USE_MARKERS_ONLY_BREADCRUMBS) PushStringToList(scratch.arena, &flags_list, Lit("D3D12_DEVICE_FLAG_DRED_USE_MARKERS_ONLY_BREADCRUMBS")); + if (desc.Flags & D3D12_DEVICE_FLAG_SHADER_INSTRUMENTATION_ENABLED) PushStringToList(scratch.arena, &flags_list, Lit("D3D12_DEVICE_FLAG_SHADER_INSTRUMENTATION_ENABLED")); + if (desc.Flags & D3D12_DEVICE_FLAG_AUTO_DEBUG_NAME_ENABLED) PushStringToList(scratch.arena, &flags_list, Lit("D3D12_DEVICE_FLAG_AUTO_DEBUG_NAME_ENABLED")); + if (desc.Flags & D3D12_DEVICE_FLAG_FORCE_LEGACY_STATE_VALIDATION) PushStringToList(scratch.arena, &flags_list, Lit("D3D12_DEVICE_FLAG_FORCE_LEGACY_STATE_VALIDATION")); + } + String flags_str = flags_list.count > 0 ? StringFromList(scratch.arena, flags_list, Lit(", ")) : Lit("None"); + LogInfoF("D3D12 SDKVersion: %F", FmtUint(desc.SDKVersion)); + LogInfoF("D3D12 NumEnabledExperimentalFeatures: %F", FmtUint(desc.NumEnabledExperimentalFeatures)); + LogInfoF("D3D12 device configuration flags: %F", FmtString(flags_str)); + } } ////////////////////////////// @@ -365,10 +406,10 @@ void G_Bootstrap(void) ID3D10Blob *blob = 0; if (SUCCEEDED(hr)) { - D3D12_ROOT_PARAMETER params[G_NumConstants] = Zi; + D3D12_ROOT_PARAMETER1 params[G_NumConstants] = Zi; for (i32 slot = 0; slot < G_NumConstants; ++slot) { - D3D12_ROOT_PARAMETER *param = ¶ms[slot]; + D3D12_ROOT_PARAMETER1 *param = ¶ms[slot]; param->ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; param->ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; param->Constants.ShaderRegister = slot; @@ -376,14 +417,14 @@ void G_Bootstrap(void) param->Constants.Num32BitValues = 1; } - D3D12_ROOT_SIGNATURE_DESC desc = Zi; - desc.NumParameters = countof(params); - desc.pParameters = params; - desc.NumStaticSamplers = 0; - desc.pStaticSamplers = 0; - desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_CBV_SRV_UAV_HEAP_DIRECTLY_INDEXED | D3D12_ROOT_SIGNATURE_FLAG_SAMPLER_HEAP_DIRECTLY_INDEXED; - - hr = D3D12SerializeRootSignature(&desc, D3D_ROOT_SIGNATURE_VERSION_1, &blob, 0); + D3D12_VERSIONED_ROOT_SIGNATURE_DESC desc = Zi; + desc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1; + desc.Desc_1_1.NumParameters = countof(params); + desc.Desc_1_1.pParameters = params; + desc.Desc_1_1.NumStaticSamplers = 0; + desc.Desc_1_1.pStaticSamplers = 0; + desc.Desc_1_1.Flags = D3D12_ROOT_SIGNATURE_FLAG_CBV_SRV_UAV_HEAP_DIRECTLY_INDEXED | D3D12_ROOT_SIGNATURE_FLAG_SAMPLER_HEAP_DIRECTLY_INDEXED; + hr = ID3D12DeviceConfiguration_SerializeVersionedRootSignature(G_D12.device_config, &desc, &blob, 0); } // Create root signature @@ -3259,13 +3300,13 @@ G_Stats G_QueryStats(void) G_Stats result = Zi; { DXGI_QUERY_VIDEO_MEMORY_INFO info = Zi; - IDXGIAdapter3_QueryVideoMemoryInfo(G_D12.adapter, 0, DXGI_MEMORY_SEGMENT_GROUP_LOCAL, &info); + IDXGIAdapter3_QueryVideoMemoryInfo(G_D12.dxgi_adapter, 0, DXGI_MEMORY_SEGMENT_GROUP_LOCAL, &info); result.device_committed = info.CurrentUsage; result.device_budget = info.Budget; } { DXGI_QUERY_VIDEO_MEMORY_INFO info = Zi; - IDXGIAdapter3_QueryVideoMemoryInfo(G_D12.adapter, 0, DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL, &info); + IDXGIAdapter3_QueryVideoMemoryInfo(G_D12.dxgi_adapter, 0, DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL, &info); result.host_budget = info.Budget; result.host_committed = info.CurrentUsage; } @@ -3324,7 +3365,7 @@ G_ResourceHandle G_PrepareBackbuffer(G_SwapchainHandle swapchain_handle, G_Forma desc.Flags = G_D12_SwapchainFlags; desc.AlphaMode = DXGI_ALPHA_MODE_IGNORE; desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; - hr = IDXGIFactory2_CreateSwapChainForHwnd(G_D12.factory, (IUnknown *)direct_queue->d3d_queue, swapchain->window_hwnd, &desc, 0, 0, &swapchain1); + hr = IDXGIFactory2_CreateSwapChainForHwnd(G_D12.dxgi_factory, (IUnknown *)direct_queue->d3d_queue, swapchain->window_hwnd, &desc, 0, 0, &swapchain1); } // Upgrade to swapchain3 @@ -3364,7 +3405,7 @@ G_ResourceHandle G_PrepareBackbuffer(G_SwapchainHandle swapchain_handle, G_Forma } // Disable Alt+Enter - IDXGIFactory_MakeWindowAssociation(G_D12.factory, swapchain->window_hwnd, DXGI_MWA_NO_ALT_ENTER); + IDXGIFactory_MakeWindowAssociation(G_D12.dxgi_factory, swapchain->window_hwnd, DXGI_MWA_NO_ALT_ENTER); if (FAILED(hr)) { diff --git a/src/gpu/gpu_dx12/gpu_dx12_core.h b/src/gpu/gpu_dx12/gpu_dx12_core.h index 72d7d6fe..20670a47 100644 --- a/src/gpu/gpu_dx12/gpu_dx12_core.h +++ b/src/gpu/gpu_dx12/gpu_dx12_core.h @@ -476,8 +476,11 @@ Struct(G_D12_Ctx) G_D12_Swapchain *first_free_swapchain; // Device - IDXGIFactory6 *factory; - IDXGIAdapter3 *adapter; + ID3D12SDKConfiguration1 *sdk_config; + ID3D12DeviceConfiguration *device_config; + ID3D12DeviceFactory *device_factory; + IDXGIFactory6 *dxgi_factory; + IDXGIAdapter3 *dxgi_adapter; ID3D12Device10 *device; // Release-queue