| 61 | } |
| 62 | |
| 63 | SampleBaseApp::InitReturnCodes SampleBaseApp::Init(int argc, const char* const* argv) |
| 64 | { |
| 65 | donut::app::DeviceCreationParameters deviceParams = GetDefaultDeviceParams(); |
| 66 | |
| 67 | std::string preferredScene = "bistro-programmer-art.scene.json"; // "kitchen.scene.json"; |
| 68 | LocalConfig::PreferredSceneOverride(preferredScene); |
| 69 | |
| 70 | // Process command line arguments |
| 71 | if (!ProcessCommandLine(argc, argv, deviceParams, preferredScene)) |
| 72 | { |
| 73 | return InitReturnCodes::FailProcessingCommandLine; |
| 74 | } |
| 75 | |
| 76 | if (!InitDeviceAndWindow(deviceParams)) |
| 77 | { |
| 78 | return InitReturnCodes::FailToCreateDevice; |
| 79 | } |
| 80 | |
| 81 | // Check API feature support |
| 82 | if (!CheckDeviceFeatureSupport(deviceParams)) |
| 83 | { |
| 84 | return InitReturnCodes::FailDeviceFeatureSupport; |
| 85 | } |
| 86 | |
| 87 | CreateShaderFactory(); |
| 88 | |
| 89 | // -- Register render passes into Donut -- |
| 90 | // Create the main render pass. This is where path tracing happens |
| 91 | m_MainSceneRender = CreateMainRenderPass(*m_DeviceManager, m_CmdLine); |
| 92 | m_MainSceneRender->Init(preferredScene, m_ShaderFactory); |
| 93 | m_DeviceManager->AddRenderPassToBack(m_MainSceneRender.get()); |
| 94 | |
| 95 | #if DONUT_WITH_DX12 && (RTXPT_D3D_AGILITY_SDK_VERSION >= 619) // temporary |
| 96 | // When using AgilitySDK >= 619, we require shader model 6.9 |
| 97 | if (m_DeviceManager->GetDevice()->getGraphicsAPI() == nvrhi::GraphicsAPI::D3D12) |
| 98 | { |
| 99 | ID3D12Device* d3d12Device = static_cast<ID3D12Device*>( |
| 100 | m_DeviceManager->GetDevice()->getNativeObject(nvrhi::ObjectTypes::D3D12_Device) |
| 101 | ); |
| 102 | |
| 103 | D3D12_FEATURE_DATA_SHADER_MODEL shaderModel = { D3D_SHADER_MODEL_6_9 }; |
| 104 | |
| 105 | HRESULT hr = d3d12Device->CheckFeatureSupport(D3D12_FEATURE_SHADER_MODEL, &shaderModel, sizeof(shaderModel)); |
| 106 | assert(SUCCEEDED(hr)); |
| 107 | if (shaderModel.HighestShaderModel < D3D_SHADER_MODEL_6_9) |
| 108 | { |
| 109 | donut::log::fatal("Shader Model 6.9 is required when compiled with Agility SDK 1.619 or newer, but is unsupported on the current device. Please check for newer graphics drivers, or recompile without Agility SDK"); |
| 110 | return InitReturnCodes::FailToCreateDevice; |
| 111 | } |
| 112 | } |
| 113 | #endif |
| 114 | |
| 115 | // Optionally create the UP render pass. This exposes run time parameter controls. |
| 116 | if (!m_CmdLine.noWindow) |
| 117 | { |
| 118 | m_UIRender = std::make_unique<SampleUI>(m_DeviceManager.get(), *this, *m_MainSceneRender, g_sampleUIData, IsSERSupported(), m_CmdLine); |
| 119 | m_UIRender->Init(m_ShaderFactory); |
| 120 | m_DeviceManager->AddRenderPassToBack(m_UIRender.get()); |