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();
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 = &params[slot];
D3D12_ROOT_PARAMETER1 *param = &params[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))
{

View File

@ -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