add commandline argument to disable d3d12 independent devices since nsight seems to have issues connecting
This commit is contained in:
parent
ab0e241496
commit
a24461187e
@ -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 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))
|
||||
{
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user