add commandline argument to disable d3d12 independent devices since nsight seems to have issues connecting

This commit is contained in:
jacob 2026-02-23 18:33:27 -06:00
parent ab0e241496
commit a24461187e
2 changed files with 79 additions and 35 deletions

View File

@ -9,18 +9,22 @@ void G_Bootstrap(void)
TempArena scratch = BeginScratchNoConflict(); TempArena scratch = BeginScratchNoConflict();
Arena *perm = PermArena(); 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 //- Extract agility SDK
String appdir = GetAppDirectory(); String appdir = GetAppDirectory();
// FIXME: Include actual sdk header for this value
u32 sdk_ver_num = 618; u32 sdk_ver_num = 618;
String sdk_ver_str = Lit("1.618.5"); String sdk_ver_str = Lit("1.618.5");
String sdk_dir_path = StringF(scratch.arena, "%FD3D12/%F/", FmtString(appdir), FmtString(sdk_ver_str)); 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));
{ {
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)) if (!PLT_IsFile(core_path) || !PLT_IsFile(layers_path))
{ {
LogInfoF("Unpacking D3D12 Agility SDK to %F", FmtString(sdk_dir_path)); LogInfoF("Unpacking D3D12 Agility SDK to %F", FmtString(sdk_dir_path));
@ -55,21 +59,18 @@ void G_Bootstrap(void)
////////////////////////////// //////////////////////////////
//- Create device factory //- Create device factory
ID3D12DeviceFactory *device_factory = 0;
{ {
ID3D12SDKConfiguration1 *sdk_config = 0; D3D12GetInterface(&CLSID_D3D12SDKConfiguration, &IID_ID3D12SDKConfiguration1, (void **)&G_D12.sdk_config);
D3D12GetInterface(&CLSID_D3D12SDKConfiguration, &IID_ID3D12SDKConfiguration1, (void **)&sdk_config);
// Create device factory // 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( HRESULT hr = ID3D12SDKConfiguration1_CreateDeviceFactory(
sdk_config, G_D12.sdk_config,
sdk_ver_num, sdk_ver_num,
sdk_path_cstr, sdk_dir_path_cstr,
&IID_ID3D12DeviceFactory, &IID_ID3D12DeviceFactory,
(void **)&device_factory (void **)&G_D12.device_factory
); );
if (FAILED(hr)) if (FAILED(hr))
{ {
Panic(StringF(scratch.arena, "Failed to create ID3D12DeviceFactory: Error code 0x%F", FmtHex(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) if (GPU_DEBUG)
{ {
ID3D12Debug1 *debug = 0; 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); ID3D12Debug1_EnableDebugLayer(debug);
if (GPU_DEBUG_VALIDATION) if (GPU_DEBUG_VALIDATION)
{ {
ID3D12Debug1_SetEnableGPUBasedValidation(debug, 1); ID3D12Debug1_SetEnableGPUBasedValidation(debug, 1);
@ -102,7 +102,7 @@ void G_Bootstrap(void)
{ {
dxgi_factory_flags |= DXGI_CREATE_FACTORY_DEBUG; 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)) if (FAILED(hr))
{ {
Panic(Lit("Failed to initialize DXGI factory")); Panic(Lit("Failed to initialize DXGI factory"));
@ -120,17 +120,25 @@ void G_Bootstrap(void)
i32 skips = 0; // For iGPU testing i32 skips = 0; // For iGPU testing
while (!done) 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)) if (SUCCEEDED(hr))
{ {
{ {
DXGI_ADAPTER_DESC1 desc; DXGI_ADAPTER_DESC1 desc;
IDXGIAdapter3_GetDesc1(adapter, &desc); IDXGIAdapter3_GetDesc1(adapter, &desc);
adapter_name = StringFromWstrNoLimit(scratch.arena, desc.Description); adapter_name = StringFromWstrNoLimit(scratch.arena, desc.Description);
LogInfoF("D3D12 adapter name: '%F'", FmtString(adapter_name));
} }
if (skips <= 0) 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; done = 1;
} }
else else
@ -155,7 +163,7 @@ void G_Bootstrap(void)
} }
} }
if (!device) if (!device || !SUCCEEDED(hr))
{ {
if (adapter_name.len > 0) 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; 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 // Enable debug layer breaks
if (GPU_DEBUG) if (GPU_DEBUG)
{ {
@ -257,6 +274,30 @@ void G_Bootstrap(void)
IDXGIInfoQueue_Release(dxgi_info); 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; ID3D10Blob *blob = 0;
if (SUCCEEDED(hr)) 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) for (i32 slot = 0; slot < G_NumConstants; ++slot)
{ {
D3D12_ROOT_PARAMETER *param = &params[slot]; D3D12_ROOT_PARAMETER1 *param = &params[slot];
param->ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; param->ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
param->ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; param->ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
param->Constants.ShaderRegister = slot; param->Constants.ShaderRegister = slot;
@ -376,14 +417,14 @@ void G_Bootstrap(void)
param->Constants.Num32BitValues = 1; param->Constants.Num32BitValues = 1;
} }
D3D12_ROOT_SIGNATURE_DESC desc = Zi; D3D12_VERSIONED_ROOT_SIGNATURE_DESC desc = Zi;
desc.NumParameters = countof(params); desc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
desc.pParameters = params; desc.Desc_1_1.NumParameters = countof(params);
desc.NumStaticSamplers = 0; desc.Desc_1_1.pParameters = params;
desc.pStaticSamplers = 0; desc.Desc_1_1.NumStaticSamplers = 0;
desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_CBV_SRV_UAV_HEAP_DIRECTLY_INDEXED | D3D12_ROOT_SIGNATURE_FLAG_SAMPLER_HEAP_DIRECTLY_INDEXED; 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 = D3D12SerializeRootSignature(&desc, D3D_ROOT_SIGNATURE_VERSION_1, &blob, 0); hr = ID3D12DeviceConfiguration_SerializeVersionedRootSignature(G_D12.device_config, &desc, &blob, 0);
} }
// Create root signature // Create root signature
@ -3259,13 +3300,13 @@ G_Stats G_QueryStats(void)
G_Stats result = Zi; G_Stats result = Zi;
{ {
DXGI_QUERY_VIDEO_MEMORY_INFO info = 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_committed = info.CurrentUsage;
result.device_budget = info.Budget; result.device_budget = info.Budget;
} }
{ {
DXGI_QUERY_VIDEO_MEMORY_INFO info = Zi; 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_budget = info.Budget;
result.host_committed = info.CurrentUsage; 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.Flags = G_D12_SwapchainFlags;
desc.AlphaMode = DXGI_ALPHA_MODE_IGNORE; desc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; 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 // Upgrade to swapchain3
@ -3364,7 +3405,7 @@ G_ResourceHandle G_PrepareBackbuffer(G_SwapchainHandle swapchain_handle, G_Forma
} }
// Disable Alt+Enter // 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)) if (FAILED(hr))
{ {

View File

@ -476,8 +476,11 @@ Struct(G_D12_Ctx)
G_D12_Swapchain *first_free_swapchain; G_D12_Swapchain *first_free_swapchain;
// Device // Device
IDXGIFactory6 *factory; ID3D12SDKConfiguration1 *sdk_config;
IDXGIAdapter3 *adapter; ID3D12DeviceConfiguration *device_config;
ID3D12DeviceFactory *device_factory;
IDXGIFactory6 *dxgi_factory;
IDXGIAdapter3 *dxgi_adapter;
ID3D12Device10 *device; ID3D12Device10 *device;
// Release-queue // Release-queue