From d25c56e62cd3a022c28a1cd53baa8e5e903edac5 Mon Sep 17 00:00:00 2001 From: dzhdan Date: Tue, 24 Dec 2024 12:39:39 +0800 Subject: [PATCH] D3DExt changes: - fixed compilation with "NRI_ENABLE_EXTERNAL_LIBRARIES = OFF" - PIX: doesn't depend on "NRI_ENABLE_EXTERNAL_LIBRARIES" - PIX: added function table validation - D3D11: removed dummy D3D12 funcs - D3D12: removed dummy D3D11 funcs - camel case related refactoring --- CMakeLists.txt | 6 +- Source/D3D11/CommandBufferD3D11.hpp | 2 +- Source/D3D11/DescriptorD3D11.hpp | 2 +- Source/D3D11/DeviceD3D11.hpp | 22 ++-- Source/D3D11/PipelineD3D11.hpp | 2 +- Source/D3D11/SwapChainD3D11.hpp | 2 +- Source/D3D12/CommandBufferD3D12.hpp | 6 +- Source/D3D12/DeviceD3D12.hpp | 18 +-- Source/D3D12/SwapChainD3D12.hpp | 2 +- Source/Shared/D3DExt.h | 104 ++++++++++------ Source/Shared/D3DExt.hpp | 186 +++++++++++++++++----------- 11 files changed, 211 insertions(+), 141 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b7150e78..c010c3d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ set (NRI_AGILITY_SDK_PATH "C:/AgilitySDK" CACHE STRING "Path to a directory cont set (NRI_AGILITY_SDK_VERSION "614" CACHE STRING "Agility SDK version") set (NRI_AGILITY_SDK_DIR "AgilitySDK" CACHE STRING "Directory where Agility SDK binaries will be copied to relative to 'CMAKE_RUNTIME_OUTPUT_DIRECTORY'") -# Options: D3D11/D3D12 specific +# Options: D3D11/D3D12 specific (PIX events are always enabled if "WinPixEventRuntime.dll" is nearby) option (NRI_ENABLE_EXTERNAL_LIBRARIES "Enable vendor specific extension libraries (NVAPI and AMD AGS)" ON) # Is submodule? @@ -98,7 +98,7 @@ if (WIN32) find_library (INPUT_LIB_D3D11 NAMES d3d11 HINTS ${WINDOWS_SDK_LIB_PATH} REQUIRED) find_library (INPUT_LIB_D3D12 NAMES d3d12 HINTS ${WINDOWS_SDK_LIB_PATH} REQUIRED) find_library (INPUT_LIB_DXGI NAMES dxgi HINTS ${WINDOWS_SDK_LIB_PATH} REQUIRED) - find_library (INPUT_LIB_DXGUID NAMES dxguid HINTS ${WINDOWS_SDK_LIB_PATH} REQUIRED) + find_library (INPUT_LIB_DXGUID NAMES dxguid HINTS ${WINDOWS_SDK_LIB_PATH} REQUIRED) # for nriReportLiveObjects endif () # Globals? @@ -325,7 +325,7 @@ target_compile_options (${PROJECT_NAME} PRIVATE ${COMPILE_OPTIONS}) target_link_libraries (${PROJECT_NAME} PRIVATE NRI_Shared NRI_Validation) if (WIN32) - target_link_libraries (${PROJECT_NAME} PRIVATE ${INPUT_LIB_DXGI} ${INPUT_LIB_DXGUID}) # for nriReportLiveObjects + target_link_libraries (${PROJECT_NAME} PRIVATE ${INPUT_LIB_DXGI} ${INPUT_LIB_DXGUID}) else () target_link_libraries (${PROJECT_NAME} PRIVATE ${CMAKE_DL_LIBS}) endif () diff --git a/Source/D3D11/CommandBufferD3D11.hpp b/Source/D3D11/CommandBufferD3D11.hpp index 30931260..dcba635e 100644 --- a/Source/D3D11/CommandBufferD3D11.hpp +++ b/Source/D3D11/CommandBufferD3D11.hpp @@ -238,7 +238,7 @@ NRI_INLINE void CommandBufferD3D11::BeginRendering(const AttachmentsDesc& attach // Shading rate #if NRI_USE_EXT_LIBS - if (m_Device.GetExt()->HasNVAPI() && m_Device.GetDesc().shadingRateTier >= 2) { + if (m_Device.GetExt()->HasNvapi() && m_Device.GetDesc().shadingRateTier >= 2) { ID3D11NvShadingRateResourceView* shadingRateImage = nullptr; if (attachmentsDesc.shadingRate) { const DescriptorD3D11& descriptor = *(DescriptorD3D11*)attachmentsDesc.shadingRate; diff --git a/Source/D3D11/DescriptorD3D11.hpp b/Source/D3D11/DescriptorD3D11.hpp index afbf13df..2a178b0e 100644 --- a/Source/D3D11/DescriptorD3D11.hpp +++ b/Source/D3D11/DescriptorD3D11.hpp @@ -298,7 +298,7 @@ Result DescriptorD3D11::Create(const Texture2DViewDesc& textureViewDesc) { } case Texture2DViewType::SHADING_RATE_ATTACHMENT: { #if NRI_USE_EXT_LIBS - if (m_Device.GetExt()->HasNVAPI()) { + if (m_Device.GetExt()->HasNvapi()) { NV_D3D11_SHADING_RATE_RESOURCE_VIEW_DESC desc = {NV_D3D11_SHADING_RATE_RESOURCE_VIEW_DESC_VER}; desc.Format = format; desc.ViewDimension = NV_SRRV_DIMENSION_TEXTURE2D; diff --git a/Source/D3D11/DeviceD3D11.hpp b/Source/D3D11/DeviceD3D11.hpp index 4bc38cc0..dc198136 100644 --- a/Source/D3D11/DeviceD3D11.hpp +++ b/Source/D3D11/DeviceD3D11.hpp @@ -37,8 +37,8 @@ DeviceD3D11::~DeviceD3D11() { DeleteCriticalSection(&m_CriticalSection); #if NRI_USE_EXT_LIBS - if (m_Ext.HasAGS() && !m_IsWrapped) - m_Ext.m_AGS.DestroyDeviceD3D11(m_Ext.m_AGSContext, m_Device, nullptr, m_ImmediateContext, nullptr); + if (m_Ext.HasAgs() && !m_IsWrapped) + m_Ext.m_Ags.DestroyDeviceD3D11(m_Ext.m_AgsContext, m_Device, nullptr, m_ImmediateContext, nullptr); #endif for (CommandQueueD3D11* commandQueue : m_CommandQueues) { @@ -85,9 +85,9 @@ Result DeviceD3D11::Create(const DeviceCreationDesc& deviceCreationDesc, ID3D11D // Extensions if (m_Desc.adapterDesc.vendor == Vendor::NVIDIA) - m_Ext.InitializeNVExt(this, isNVAPILoadedInApp, device != nullptr); + m_Ext.InitializeNvExt(this, isNVAPILoadedInApp, device != nullptr); else if (m_Desc.adapterDesc.vendor == Vendor::AMD) - m_Ext.InitializeAMDExt(this, agsContext, device != nullptr); + m_Ext.InitializeAmdExt(this, agsContext, device != nullptr); // Device ComPtr deviceTemp = (ID3D11DeviceBest*)device; @@ -101,7 +101,7 @@ Result DeviceD3D11::Create(const DeviceCreationDesc& deviceCreationDesc, ID3D11D #if NRI_USE_EXT_LIBS uint32_t shaderExtRegister = deviceCreationDesc.shaderExtRegister ? deviceCreationDesc.shaderExtRegister : 63; - if (m_Ext.HasAGS()) { + if (m_Ext.HasAgs()) { AGSDX11DeviceCreationParams deviceCreationParams = {}; deviceCreationParams.pAdapter = m_Adapter; deviceCreationParams.DriverType = D3D_DRIVER_TYPE_UNKNOWN; @@ -114,11 +114,11 @@ Result DeviceD3D11::Create(const DeviceCreationDesc& deviceCreationDesc, ID3D11D extensionsParams.uavSlot = shaderExtRegister; AGSDX11ReturnedParams agsParams = {}; - AGSReturnCode result = m_Ext.m_AGS.CreateDeviceD3D11(m_Ext.m_AGSContext, &deviceCreationParams, &extensionsParams, &agsParams); + AGSReturnCode result = m_Ext.m_Ags.CreateDeviceD3D11(m_Ext.m_AgsContext, &deviceCreationParams, &extensionsParams, &agsParams); if (flags != 0 && result != AGS_SUCCESS) { // If Debug Layer is not available, try without D3D11_CREATE_DEVICE_DEBUG deviceCreationParams.Flags = 0; - result = m_Ext.m_AGS.CreateDeviceD3D11(m_Ext.m_AGSContext, &deviceCreationParams, &extensionsParams, &agsParams); + result = m_Ext.m_Ags.CreateDeviceD3D11(m_Ext.m_AgsContext, &deviceCreationParams, &extensionsParams, &agsParams); } RETURN_ON_FAILURE(this, result == AGS_SUCCESS, Result::FAILURE, "agsDriverExtensionsDX11_CreateDevice() returned %d", (int32_t)result); @@ -138,7 +138,7 @@ Result DeviceD3D11::Create(const DeviceCreationDesc& deviceCreationDesc, ID3D11D RETURN_ON_BAD_HRESULT(this, hr, "D3D11CreateDevice()"); #if NRI_USE_EXT_LIBS - if (m_Ext.HasNVAPI()) { + if (m_Ext.HasNvapi()) { REPORT_ERROR_ON_BAD_STATUS(this, NvAPI_D3D_RegisterDevice(deviceTemp)); REPORT_ERROR_ON_BAD_STATUS(this, NvAPI_D3D11_SetNvShaderExtnSlot(deviceTemp, shaderExtRegister)); REPORT_ERROR_ON_BAD_STATUS(this, NvAPI_D3D11_IsNvShaderExtnOpCodeSupported(deviceTemp, NV_EXTN_OP_UINT64_ATOMIC, &isShaderAtomicsI64Supported)); @@ -173,7 +173,7 @@ Result DeviceD3D11::Create(const DeviceCreationDesc& deviceCreationDesc, ID3D11D if (FAILED(hr) || !threadingCaps.DriverConcurrentCreates) REPORT_WARNING(this, "Concurrent resource creation is not supported by the driver!"); - m_IsDeferredContextEmulated = !m_Ext.HasNVAPI() || deviceCreationDesc.enableD3D11CommandBufferEmulation; + m_IsDeferredContextEmulated = !m_Ext.HasNvapi() || deviceCreationDesc.enableD3D11CommandBufferEmulation; if (!threadingCaps.DriverCommandLists) { REPORT_WARNING(this, "Deferred Contexts are not supported by the driver and will be emulated!"); m_IsDeferredContextEmulated = true; @@ -358,7 +358,7 @@ void DeviceD3D11::FillDesc() { NV_D3D11_FEATURE_DATA_RASTERIZER_SUPPORT rasterizerFeatures = {}; NV_D3D1x_GRAPHICS_CAPS caps = {}; - if (m_Ext.HasNVAPI()) { + if (m_Ext.HasNvapi()) { REPORT_ERROR_ON_BAD_STATUS(this, NvAPI_D3D11_IsNvShaderExtnOpCodeSupported(m_Device, NV_EXTN_OP_FP16_ATOMIC, &isShaderAtomicsF16Supported)); REPORT_ERROR_ON_BAD_STATUS(this, NvAPI_D3D11_IsNvShaderExtnOpCodeSupported(m_Device, NV_EXTN_OP_FP32_ATOMIC, &isShaderAtomicsF32Supported)); REPORT_ERROR_ON_BAD_STATUS(this, NvAPI_D3D11_CheckFeatureSupport(m_Device, NV_D3D11_FEATURE_RASTERIZER, &rasterizerFeatures, sizeof(rasterizerFeatures))); @@ -386,7 +386,7 @@ void DeviceD3D11::FillDesc() { m_Desc.isShaderAtomicsF32Supported = isShaderAtomicsF32Supported; m_Desc.isSwapChainSupported = HasOutput(); - m_Desc.isLowLatencySupported = m_Ext.HasNVAPI(); + m_Desc.isLowLatencySupported = m_Ext.HasNvapi(); } void DeviceD3D11::GetMemoryDesc(const BufferDesc& bufferDesc, MemoryLocation memoryLocation, MemoryDesc& memoryDesc) const { diff --git a/Source/D3D11/PipelineD3D11.hpp b/Source/D3D11/PipelineD3D11.hpp index de85b467..76a5704e 100644 --- a/Source/D3D11/PipelineD3D11.hpp +++ b/Source/D3D11/PipelineD3D11.hpp @@ -233,7 +233,7 @@ void PipelineD3D11::ChangeSamplePositions(ID3D11DeviceContextBest* deferredConte m_RasterizerDesc.SamplePositionsY[j] = samplePositionState.positions[j].y + 8; } - if (m_Device.GetExt()->HasNVAPI()) + if (m_Device.GetExt()->HasNvapi()) REPORT_ERROR_ON_BAD_STATUS(&m_Device, NvAPI_D3D11_CreateRasterizerState(m_Device.GetNativeObject(), &m_RasterizerDesc, (ID3D11RasterizerState**)&newState.ptr)); if (newState.ptr) diff --git a/Source/D3D11/SwapChainD3D11.hpp b/Source/D3D11/SwapChainD3D11.hpp index c0edb397..ab09d5a5 100644 --- a/Source/D3D11/SwapChainD3D11.hpp +++ b/Source/D3D11/SwapChainD3D11.hpp @@ -138,7 +138,7 @@ Result SwapChainD3D11::Create(const SwapChainDesc& swapChainDesc) { m_Flags = desc.Flags; m_Desc = swapChainDesc; m_Desc.textureNum = 1; // IMPORTANT: only 1 texture is available in D3D11 - m_Desc.allowLowLatency = swapChainDesc.allowLowLatency && m_Device.GetExt()->HasNVAPI(); + m_Desc.allowLowLatency = swapChainDesc.allowLowLatency && m_Device.GetExt()->HasNvapi(); m_Textures.reserve(m_Desc.textureNum); for (uint32_t i = 0; i < m_Desc.textureNum; i++) { diff --git a/Source/D3D12/CommandBufferD3D12.hpp b/Source/D3D12/CommandBufferD3D12.hpp index b78c7c07..9a7343e8 100644 --- a/Source/D3D12/CommandBufferD3D12.hpp +++ b/Source/D3D12/CommandBufferD3D12.hpp @@ -933,21 +933,21 @@ NRI_INLINE void CommandBufferD3D12::CopyQueries(const QueryPool& queryPool, uint } NRI_INLINE void CommandBufferD3D12::BeginAnnotation(const char* name, uint32_t bgra) { - if (m_Device.GetExt()->m_Pix.BeginEventOnCommandList) + if (m_Device.GetExt()->HasPix()) m_Device.GetExt()->m_Pix.BeginEventOnCommandList(m_GraphicsCommandList, bgra, name); else PIXBeginEvent(m_GraphicsCommandList, bgra, name); } NRI_INLINE void CommandBufferD3D12::EndAnnotation() { - if (m_Device.GetExt()->m_Pix.EndEventOnCommandList) + if (m_Device.GetExt()->HasPix()) m_Device.GetExt()->m_Pix.EndEventOnCommandList(m_GraphicsCommandList); else PIXEndEvent(m_GraphicsCommandList); } NRI_INLINE void CommandBufferD3D12::Annotation(const char* name, uint32_t bgra) { - if (m_Device.GetExt()->m_Pix.SetMarkerOnCommandList) + if (m_Device.GetExt()->HasPix()) m_Device.GetExt()->m_Pix.SetMarkerOnCommandList(m_GraphicsCommandList, bgra, name); else PIXSetMarker(m_GraphicsCommandList, bgra, name); diff --git a/Source/D3D12/DeviceD3D12.hpp b/Source/D3D12/DeviceD3D12.hpp index d799aba5..a15851e4 100644 --- a/Source/D3D12/DeviceD3D12.hpp +++ b/Source/D3D12/DeviceD3D12.hpp @@ -75,8 +75,8 @@ DeviceD3D12::~DeviceD3D12() { } #if NRI_USE_EXT_LIBS - if (m_Ext.HasAGS() && !m_IsWrapped) - m_Ext.m_AGS.DestroyDeviceD3D12(m_Ext.m_AGSContext, m_Device, nullptr); + if (m_Ext.HasAgs() && !m_IsWrapped) + m_Ext.m_Ags.DestroyDeviceD3D12(m_Ext.m_AgsContext, m_Device, nullptr); #endif } @@ -120,9 +120,9 @@ Result DeviceD3D12::Create(const DeviceCreationDesc& deviceCreationDesc, const D // Extensions m_Ext.InitializePixExt(); if (m_Desc.adapterDesc.vendor == Vendor::NVIDIA) - m_Ext.InitializeNVExt(this, deviceCreationD3D12Desc.isNVAPILoaded, deviceCreationD3D12Desc.d3d12Device != nullptr); + m_Ext.InitializeNvExt(this, deviceCreationD3D12Desc.isNVAPILoaded, deviceCreationD3D12Desc.d3d12Device != nullptr); else if (m_Desc.adapterDesc.vendor == Vendor::AMD) - m_Ext.InitializeAMDExt(this, deviceCreationD3D12Desc.agsContext, deviceCreationD3D12Desc.d3d12Device != nullptr); + m_Ext.InitializeAmdExt(this, deviceCreationD3D12Desc.agsContext, deviceCreationD3D12Desc.d3d12Device != nullptr); // Device ComPtr deviceTemp = (ID3D12DeviceBest*)deviceCreationD3D12Desc.d3d12Device; @@ -130,7 +130,7 @@ Result DeviceD3D12::Create(const DeviceCreationDesc& deviceCreationDesc, const D #if NRI_USE_EXT_LIBS bool isShaderAtomicsI64Supported = false; uint32_t shaderExtRegister = deviceCreationDesc.shaderExtRegister ? deviceCreationDesc.shaderExtRegister : 63; - if (m_Ext.HasAGS()) { + if (m_Ext.HasAgs()) { AGSDX12DeviceCreationParams deviceCreationParams = {}; deviceCreationParams.pAdapter = m_Adapter; deviceCreationParams.iid = __uuidof(ID3D12DeviceBest); @@ -140,7 +140,7 @@ Result DeviceD3D12::Create(const DeviceCreationDesc& deviceCreationDesc, const D extensionsParams.uavSlot = shaderExtRegister; AGSDX12ReturnedParams agsParams = {}; - AGSReturnCode result = m_Ext.m_AGS.CreateDeviceD3D12(m_Ext.m_AGSContext, &deviceCreationParams, &extensionsParams, &agsParams); + AGSReturnCode result = m_Ext.m_Ags.CreateDeviceD3D12(m_Ext.m_AgsContext, &deviceCreationParams, &extensionsParams, &agsParams); RETURN_ON_FAILURE(this, result == AGS_SUCCESS, Result::FAILURE, "agsDriverExtensionsDX11_CreateDevice() failed: %d", (int32_t)result); deviceTemp = (ID3D12DeviceBest*)agsParams.pDevice; @@ -151,7 +151,7 @@ Result DeviceD3D12::Create(const DeviceCreationDesc& deviceCreationDesc, const D RETURN_ON_BAD_HRESULT(this, hr, "D3D12CreateDevice()"); #if NRI_USE_EXT_LIBS - if (m_Ext.HasNVAPI()) { + if (m_Ext.HasNvapi()) { REPORT_ERROR_ON_BAD_STATUS(this, NvAPI_D3D12_SetNvShaderExtnSlotSpace(deviceTemp, shaderExtRegister, deviceCreationDesc.shaderExtSpace)); REPORT_ERROR_ON_BAD_STATUS(this, NvAPI_D3D12_IsNvShaderExtnOpCodeSupported(deviceTemp, NV_EXTN_OP_UINT64_ATOMIC, &isShaderAtomicsI64Supported)); } @@ -537,7 +537,7 @@ void DeviceD3D12::FillDesc(const DeviceCreationDesc& deviceCreationDesc) { bool isShaderAtomicsF16Supported = false; bool isShaderAtomicsF32Supported = false; #if NRI_USE_EXT_LIBS - if (m_Ext.HasNVAPI()) { + if (m_Ext.HasNvapi()) { REPORT_ERROR_ON_BAD_STATUS(this, NvAPI_D3D12_IsNvShaderExtnOpCodeSupported(m_Device, NV_EXTN_OP_FP16_ATOMIC, &isShaderAtomicsF16Supported)); REPORT_ERROR_ON_BAD_STATUS(this, NvAPI_D3D12_IsNvShaderExtnOpCodeSupported(m_Device, NV_EXTN_OP_FP32_ATOMIC, &isShaderAtomicsF32Supported)); } @@ -553,7 +553,7 @@ void DeviceD3D12::FillDesc(const DeviceCreationDesc& deviceCreationDesc) { m_Desc.isDrawParametersEmulationEnabled = deviceCreationDesc.enableD3D12DrawParametersEmulation && shaderModel.HighestShaderModel <= D3D_SHADER_MODEL_6_7; m_Desc.isSwapChainSupported = HasOutput(); - m_Desc.isLowLatencySupported = m_Ext.HasNVAPI(); + m_Desc.isLowLatencySupported = m_Ext.HasNvapi(); } Result DeviceD3D12::CreateCpuOnlyVisibleDescriptorHeap(D3D12_DESCRIPTOR_HEAP_TYPE type) { diff --git a/Source/D3D12/SwapChainD3D12.hpp b/Source/D3D12/SwapChainD3D12.hpp index 8259b6af..e918e9b5 100644 --- a/Source/D3D12/SwapChainD3D12.hpp +++ b/Source/D3D12/SwapChainD3D12.hpp @@ -139,7 +139,7 @@ Result SwapChainD3D12::Create(const SwapChainDesc& swapChainDesc) { m_PresentId = GetSwapChainId(); m_Flags = desc.Flags; m_Desc = swapChainDesc; - m_Desc.allowLowLatency = swapChainDesc.allowLowLatency && m_Device.GetExt()->HasNVAPI(); + m_Desc.allowLowLatency = swapChainDesc.allowLowLatency && m_Device.GetExt()->HasNvapi(); m_Textures.reserve(m_Desc.textureNum); for (uint32_t i = 0; i < m_Desc.textureNum; i++) { diff --git a/Source/Shared/D3DExt.h b/Source/Shared/D3DExt.h index 2d26d23c..6ebc56b3 100644 --- a/Source/Shared/D3DExt.h +++ b/Source/Shared/D3DExt.h @@ -1,11 +1,31 @@ #pragma once +// TODO: D3DExt reading requires mental gymnastics... + +// PIX events // TODO: currently the DLL doesn't export markers for CPU-only timeline and counters +#if !defined(__d3d11_h__) + +typedef HRESULT(WINAPI* PIX_BEGINEVENTONCOMMANDLIST)(ID3D12GraphicsCommandList* commandList, UINT64 color, _In_ PCSTR formatString); +typedef HRESULT(WINAPI* PIX_ENDEVENTONCOMMANDLIST)(ID3D12GraphicsCommandList* commandList); +typedef HRESULT(WINAPI* PIX_SETMARKERONCOMMANDLIST)(ID3D12GraphicsCommandList* commandList, UINT64 color, _In_ PCSTR formatString); + +struct PixFuncTable { + PIX_BEGINEVENTONCOMMANDLIST BeginEventOnCommandList; + PIX_ENDEVENTONCOMMANDLIST EndEventOnCommandList; + PIX_SETMARKERONCOMMANDLIST SetMarkerOnCommandList; +}; + +#endif + #if NRI_USE_EXT_LIBS -struct AGSFunctionTable { +// AMD AGS +struct AgsFuncTable { AGS_INITIALIZE Initialize; AGS_DEINITIALIZE Deinitialize; +# if defined(__d3d11_h__) + AGS_DRIVEREXTENSIONSDX11_CREATEDEVICE CreateDeviceD3D11; AGS_DRIVEREXTENSIONSDX11_DESTROYDEVICE DestroyDeviceD3D11; AGS_DRIVEREXTENSIONSDX11_BEGINUAVOVERLAP BeginUAVOverlap; @@ -16,78 +36,77 @@ struct AGSFunctionTable { AGS_DRIVEREXTENSIONSDX11_MULTIDRAWINSTANCEDINDIRECTCOUNTINDIRECT DrawIndirectCount; AGS_DRIVEREXTENSIONSDX11_MULTIDRAWINDEXEDINSTANCEDINDIRECTCOUNTINDIRECT DrawIndexedIndirectCount; +#else + AGS_DRIVEREXTENSIONSDX12_CREATEDEVICE CreateDeviceD3D12; AGS_DRIVEREXTENSIONSDX12_DESTROYDEVICE DestroyDeviceD3D12; -}; -# if defined(__d3d11_h__) -typedef void ID3D12GraphicsCommandList; # endif - -typedef HRESULT(WINAPI* PIX_BEGINEVENTONCOMMANDLIST)(ID3D12GraphicsCommandList* commandList, UINT64 color, _In_ PCSTR formatString); -typedef HRESULT(WINAPI* PIX_ENDEVENTONCOMMANDLIST)(ID3D12GraphicsCommandList* commandList); -typedef HRESULT(WINAPI* PIX_SETMARKERONCOMMANDLIST)(ID3D12GraphicsCommandList* commandList, UINT64 color, _In_ PCSTR formatString); - -struct PixFunctionTable { - PIX_BEGINEVENTONCOMMANDLIST BeginEventOnCommandList; - PIX_ENDEVENTONCOMMANDLIST EndEventOnCommandList; - PIX_SETMARKERONCOMMANDLIST SetMarkerOnCommandList; }; struct Ext { ~Ext(); - inline bool HasNVAPI() const { - return m_IsNvAPIAvailable; + inline bool HasNvapi() const { + return m_IsNvapiAvailable; } - inline bool HasAGS() const { - return m_AGSContext != nullptr; + inline bool HasAgs() const { + return m_AgsContext != nullptr; } - void InitializeNVExt(const nri::DeviceBase* deviceBase, bool isNVAPILoadedInApp, bool isImported); - void InitializeAMDExt(const nri::DeviceBase* deviceBase, AGSContext* agsContext, bool isImported); - void InitializePixExt(); + void InitializeNvExt(const nri::DeviceBase* deviceBase, bool isNVAPILoadedInApp, bool isImported); + void InitializeAmdExt(const nri::DeviceBase* deviceBase, AGSContext* agsContext, bool isImported); - // D3D11 # if defined(__d3d11_h__) + void BeginUAVOverlap(ID3D11DeviceContext* deviceContext) const; void EndUAVOverlap(ID3D11DeviceContext* deviceContext) const; void WaitForDrain(ID3D11DeviceContext* deviceContext, uint32_t flags) const; void SetDepthBounds(ID3D11DeviceContext* deviceContext, float minBound, float maxBound) const; void DrawIndirect(ID3D11DeviceContext* deviceContext, ID3D11Buffer* buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, ID3D11Buffer* countBuffer, uint32_t countBufferOffset) const; void DrawIndexedIndirect(ID3D11DeviceContext* deviceContext, ID3D11Buffer* buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, ID3D11Buffer* countBuffer, uint32_t countBufferOffset) const; + +# else + + inline bool HasPix() const { + return m_PixLibrary != nullptr; + } + + void InitializePixExt(); + + PixFuncTable m_Pix = {}; + Library* m_PixLibrary = nullptr; + # endif const nri::DeviceBase* m_DeviceBase = nullptr; - AGSContext* m_AGSContext = nullptr; - AGSFunctionTable m_AGS = {}; - Library* m_AGSLibrary = nullptr; - PixFunctionTable m_Pix = {}; - Library* m_PixLibrary = nullptr; - bool m_IsNvAPIAvailable = false; + AGSContext* m_AgsContext = nullptr; + AgsFuncTable m_Ags = {}; + Library* m_AgsLibrary = nullptr; + bool m_IsNvapiAvailable = false; bool m_IsImported = false; }; #else struct Ext { - inline bool HasNVAPI() const { + inline bool HasNvapi() const { return false; } - inline bool HasAGS() const { + inline bool HasAgs() const { return false; } - inline void InitializeNVExt(const nri::DeviceBase*, bool, bool) { + inline void InitializeNvExt(const nri::DeviceBase*, bool, bool) { } - inline void InitializeAMDExt(const nri::DeviceBase*, AGSContext*, bool) { + inline void InitializeAmdExt(const nri::DeviceBase*, AGSContext*, bool) { } - // D3D11 # if defined(__d3d11_h__) + inline void BeginUAVOverlap(ID3D11DeviceContext*) const { } @@ -100,10 +119,23 @@ struct Ext { inline void SetDepthBounds(ID3D11DeviceContext*, float, float) const { } - void DrawIndirect( - ID3D11DeviceContext* deviceContext, ID3D11Buffer* buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, ID3D11Buffer* countBuffer, uint32_t countBufferOffset) const; - void DrawIndexedIndirect( - ID3D11DeviceContext* deviceContext, ID3D11Buffer* buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, ID3D11Buffer* countBuffer, uint32_t countBufferOffset) const; + void DrawIndirect(ID3D11DeviceContext* deviceContext, ID3D11Buffer* buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, ID3D11Buffer* countBuffer, uint32_t countBufferOffset) const; + void DrawIndexedIndirect(ID3D11DeviceContext* deviceContext, ID3D11Buffer* buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, ID3D11Buffer* countBuffer, uint32_t countBufferOffset) const; + +# else + + ~Ext(); + + inline bool HasPix() const { + return m_PixLibrary != nullptr; + } + + void InitializePixExt(); + + const nri::DeviceBase* m_DeviceBase = nullptr; + PixFuncTable m_Pix = {}; + Library* m_PixLibrary = nullptr; + # endif }; diff --git a/Source/Shared/D3DExt.hpp b/Source/Shared/D3DExt.hpp index 8c9a3289..2cafdfaa 100644 --- a/Source/Shared/D3DExt.hpp +++ b/Source/Shared/D3DExt.hpp @@ -1,27 +1,58 @@ // © 2021 NVIDIA Corporation +#if !defined(__d3d11_h__) + +void Ext::InitializePixExt() { + // Load library + m_PixLibrary = LoadSharedLibrary("WinPixEventRuntime.dll"); + if (!m_PixLibrary) + return; + + // Get functions + m_Pix.BeginEventOnCommandList = (PIX_BEGINEVENTONCOMMANDLIST)GetSharedLibraryFunction(*m_PixLibrary, "PIXBeginEventOnCommandList"); + m_Pix.EndEventOnCommandList = (PIX_ENDEVENTONCOMMANDLIST)GetSharedLibraryFunction(*m_PixLibrary, "PIXEndEventOnCommandList"); + m_Pix.SetMarkerOnCommandList = (PIX_SETMARKERONCOMMANDLIST)GetSharedLibraryFunction(*m_PixLibrary, "PIXSetMarkerOnCommandList"); + + // Verify + const void** functionArray = (const void**)&m_Pix; + const size_t functionArraySize = sizeof(m_Pix) / sizeof(void*); + size_t i = 0; + for (; i < functionArraySize && functionArray[i] != nullptr; i++) + ; + + if (i != functionArraySize) { + REPORT_WARNING(m_DeviceBase, "PIX is disabled, because not all functions are found in the DLL"); + UnloadSharedLibrary(*m_PixLibrary); + m_PixLibrary = nullptr; + } +} + +#endif + #if NRI_USE_EXT_LIBS Ext::~Ext() { - if (m_IsNvAPIAvailable) + if (m_IsNvapiAvailable) NvAPI_Unload(); - if (m_AGSContext) { + if (m_AgsContext) { if (!m_IsImported) - m_AGS.Deinitialize(m_AGSContext); - m_AGSContext = nullptr; + m_Ags.Deinitialize(m_AgsContext); + m_AgsContext = nullptr; - UnloadSharedLibrary(*m_AGSLibrary); - m_AGSLibrary = nullptr; + UnloadSharedLibrary(*m_AgsLibrary); + m_AgsLibrary = nullptr; } +# if !defined(__d3d11_h__) if (m_PixLibrary) { UnloadSharedLibrary(*m_PixLibrary); m_PixLibrary = nullptr; } +# endif } -void Ext::InitializeNVExt(const nri::DeviceBase* deviceBase, bool isNVAPILoadedInApp, bool isImported) { +void Ext::InitializeNvExt(const nri::DeviceBase* deviceBase, bool isNVAPILoadedInApp, bool isImported) { if (GetModuleHandleA("renderdoc.dll") != nullptr) { REPORT_WARNING(deviceBase, "NVAPI is disabled, because RenderDoc library has been loaded"); return; @@ -34,13 +65,13 @@ void Ext::InitializeNVExt(const nri::DeviceBase* deviceBase, bool isNVAPILoadedI REPORT_WARNING(m_DeviceBase, "NVAPI is disabled, because it's not loaded on the application side"); else { const NvAPI_Status status = NvAPI_Initialize(); - m_IsNvAPIAvailable = (status == NVAPI_OK); - if (!m_IsNvAPIAvailable) + m_IsNvapiAvailable = (status == NVAPI_OK); + if (!m_IsNvapiAvailable) REPORT_ERROR(m_DeviceBase, "Failed to initialize NVAPI: %d", (int32_t)status); } } -void Ext::InitializeAMDExt(const nri::DeviceBase* deviceBase, AGSContext* agsContext, bool isImported) { +void Ext::InitializeAmdExt(const nri::DeviceBase* deviceBase, AGSContext* agsContext, bool isImported) { m_DeviceBase = deviceBase; m_IsImported = isImported; @@ -49,95 +80,97 @@ void Ext::InitializeAMDExt(const nri::DeviceBase* deviceBase, AGSContext* agsCon return; } - m_AGSLibrary = LoadSharedLibrary("amd_ags_x64.dll"); - if (!m_AGSLibrary) { + // Load library + m_AgsLibrary = LoadSharedLibrary("amd_ags_x64.dll"); + if (!m_AgsLibrary) { REPORT_WARNING(m_DeviceBase, "AMDAGS is disabled, because 'amd_ags_x64' is not found"); return; } - m_AGS.Initialize = (AGS_INITIALIZE)GetSharedLibraryFunction(*m_AGSLibrary, "agsInitialize"); - m_AGS.Deinitialize = (AGS_DEINITIALIZE)GetSharedLibraryFunction(*m_AGSLibrary, "agsDeInitialize"); - m_AGS.CreateDeviceD3D11 = (AGS_DRIVEREXTENSIONSDX11_CREATEDEVICE)GetSharedLibraryFunction(*m_AGSLibrary, "agsDriverExtensionsDX11_CreateDevice"); - m_AGS.DestroyDeviceD3D11 = (AGS_DRIVEREXTENSIONSDX11_DESTROYDEVICE)GetSharedLibraryFunction(*m_AGSLibrary, "agsDriverExtensionsDX11_DestroyDevice"); - m_AGS.BeginUAVOverlap = (AGS_DRIVEREXTENSIONSDX11_BEGINUAVOVERLAP)GetSharedLibraryFunction(*m_AGSLibrary, "agsDriverExtensionsDX11_BeginUAVOverlap"); - m_AGS.EndUAVOverlap = (AGS_DRIVEREXTENSIONSDX11_ENDUAVOVERLAP)GetSharedLibraryFunction(*m_AGSLibrary, "agsDriverExtensionsDX11_EndUAVOverlap"); - m_AGS.SetDepthBounds = (AGS_DRIVEREXTENSIONSDX11_SETDEPTHBOUNDS)GetSharedLibraryFunction(*m_AGSLibrary, "agsDriverExtensionsDX11_SetDepthBounds"); - m_AGS.DrawIndirect = (AGS_DRIVEREXTENSIONSDX11_MULTIDRAWINSTANCEDINDIRECT)GetSharedLibraryFunction(*m_AGSLibrary, "agsDriverExtensionsDX11_MultiDrawInstancedIndirect"); - m_AGS.DrawIndexedIndirect = (AGS_DRIVEREXTENSIONSDX11_MULTIDRAWINDEXEDINSTANCEDINDIRECT)GetSharedLibraryFunction(*m_AGSLibrary, "agsDriverExtensionsDX11_MultiDrawIndexedInstancedIndirect"); - m_AGS.DrawIndirectCount = (AGS_DRIVEREXTENSIONSDX11_MULTIDRAWINSTANCEDINDIRECTCOUNTINDIRECT)GetSharedLibraryFunction(*m_AGSLibrary, "agsDriverExtensionsDX11_MultiDrawInstancedIndirectCountIndirect"); - m_AGS.DrawIndexedIndirectCount = (AGS_DRIVEREXTENSIONSDX11_MULTIDRAWINDEXEDINSTANCEDINDIRECTCOUNTINDIRECT)GetSharedLibraryFunction(*m_AGSLibrary, "agsDriverExtensionsDX11_MultiDrawIndexedInstancedIndirectCountIndirect"); - m_AGS.CreateDeviceD3D12 = (AGS_DRIVEREXTENSIONSDX12_CREATEDEVICE)GetSharedLibraryFunction(*m_AGSLibrary, "agsDriverExtensionsDX12_CreateDevice"); - m_AGS.DestroyDeviceD3D12 = (AGS_DRIVEREXTENSIONSDX12_DESTROYDEVICE)GetSharedLibraryFunction(*m_AGSLibrary, "agsDriverExtensionsDX12_DestroyDevice"); - - const void** functionArray = (const void**)&m_AGS; - const size_t functionArraySize = sizeof(AGSFunctionTable) / sizeof(void*); + // Get functions + m_Ags.Initialize = (AGS_INITIALIZE)GetSharedLibraryFunction(*m_AgsLibrary, "agsInitialize"); + m_Ags.Deinitialize = (AGS_DEINITIALIZE)GetSharedLibraryFunction(*m_AgsLibrary, "agsDeInitialize"); + +# if defined(__d3d11_h__) + + m_Ags.CreateDeviceD3D11 = (AGS_DRIVEREXTENSIONSDX11_CREATEDEVICE)GetSharedLibraryFunction(*m_AgsLibrary, "agsDriverExtensionsDX11_CreateDevice"); + m_Ags.DestroyDeviceD3D11 = (AGS_DRIVEREXTENSIONSDX11_DESTROYDEVICE)GetSharedLibraryFunction(*m_AgsLibrary, "agsDriverExtensionsDX11_DestroyDevice"); + m_Ags.BeginUAVOverlap = (AGS_DRIVEREXTENSIONSDX11_BEGINUAVOVERLAP)GetSharedLibraryFunction(*m_AgsLibrary, "agsDriverExtensionsDX11_BeginUAVOverlap"); + m_Ags.EndUAVOverlap = (AGS_DRIVEREXTENSIONSDX11_ENDUAVOVERLAP)GetSharedLibraryFunction(*m_AgsLibrary, "agsDriverExtensionsDX11_EndUAVOverlap"); + m_Ags.SetDepthBounds = (AGS_DRIVEREXTENSIONSDX11_SETDEPTHBOUNDS)GetSharedLibraryFunction(*m_AgsLibrary, "agsDriverExtensionsDX11_SetDepthBounds"); + m_Ags.DrawIndirect = (AGS_DRIVEREXTENSIONSDX11_MULTIDRAWINSTANCEDINDIRECT)GetSharedLibraryFunction(*m_AgsLibrary, "agsDriverExtensionsDX11_MultiDrawInstancedIndirect"); + m_Ags.DrawIndexedIndirect = (AGS_DRIVEREXTENSIONSDX11_MULTIDRAWINDEXEDINSTANCEDINDIRECT)GetSharedLibraryFunction(*m_AgsLibrary, "agsDriverExtensionsDX11_MultiDrawIndexedInstancedIndirect"); + m_Ags.DrawIndirectCount = (AGS_DRIVEREXTENSIONSDX11_MULTIDRAWINSTANCEDINDIRECTCOUNTINDIRECT)GetSharedLibraryFunction(*m_AgsLibrary, "agsDriverExtensionsDX11_MultiDrawInstancedIndirectCountIndirect"); + m_Ags.DrawIndexedIndirectCount = (AGS_DRIVEREXTENSIONSDX11_MULTIDRAWINDEXEDINSTANCEDINDIRECTCOUNTINDIRECT)GetSharedLibraryFunction(*m_AgsLibrary, "agsDriverExtensionsDX11_MultiDrawIndexedInstancedIndirectCountIndirect"); + +# else + + m_Ags.CreateDeviceD3D12 = (AGS_DRIVEREXTENSIONSDX12_CREATEDEVICE)GetSharedLibraryFunction(*m_AgsLibrary, "agsDriverExtensionsDX12_CreateDevice"); + m_Ags.DestroyDeviceD3D12 = (AGS_DRIVEREXTENSIONSDX12_DESTROYDEVICE)GetSharedLibraryFunction(*m_AgsLibrary, "agsDriverExtensionsDX12_DestroyDevice"); + +# endif + + // Verify + const void** functionArray = (const void**)&m_Ags; + const size_t functionArraySize = sizeof(m_Ags) / sizeof(void*); size_t i = 0; for (; i < functionArraySize && functionArray[i] != nullptr; i++) ; if (i != functionArraySize) { REPORT_WARNING(m_DeviceBase, "AMDAGS is disabled, because not all functions are found in the DLL"); - UnloadSharedLibrary(*m_AGSLibrary); - m_AGSLibrary = nullptr; + UnloadSharedLibrary(*m_AgsLibrary); + m_AgsLibrary = nullptr; return; } + // Initialize AGSGPUInfo gpuInfo = {}; AGSConfiguration config = {}; if (!agsContext) { - const AGSReturnCode result = m_AGS.Initialize(AGS_CURRENT_VERSION, &config, &agsContext, &gpuInfo); + const AGSReturnCode result = m_Ags.Initialize(AGS_CURRENT_VERSION, &config, &agsContext, &gpuInfo); if (result != AGS_SUCCESS || !agsContext) { REPORT_ERROR(m_DeviceBase, "Failed to initialize AMDAGS: %d", (int32_t)result); - UnloadSharedLibrary(*m_AGSLibrary); - m_AGSLibrary = nullptr; + UnloadSharedLibrary(*m_AgsLibrary); + m_AgsLibrary = nullptr; } } - m_AGSContext = agsContext; -} - -void Ext::InitializePixExt() { - m_PixLibrary = LoadSharedLibrary("WinPixEventRuntime.dll"); - if (m_PixLibrary) { - m_Pix.BeginEventOnCommandList = (PIX_BEGINEVENTONCOMMANDLIST)GetSharedLibraryFunction(*m_PixLibrary, "PIXBeginEventOnCommandList"); - m_Pix.EndEventOnCommandList = (PIX_ENDEVENTONCOMMANDLIST)GetSharedLibraryFunction(*m_PixLibrary, "PIXEndEventOnCommandList"); - m_Pix.SetMarkerOnCommandList = (PIX_SETMARKERONCOMMANDLIST)GetSharedLibraryFunction(*m_PixLibrary, "PIXSetMarkerOnCommandList"); - } + m_AgsContext = agsContext; } -// D3D11 # if defined(__d3d11_h__) void Ext::BeginUAVOverlap(ID3D11DeviceContext* deviceContext) const { - if (m_IsNvAPIAvailable) { + if (m_IsNvapiAvailable) { const NvAPI_Status res = NvAPI_D3D11_BeginUAVOverlap(deviceContext); RETURN_ON_FAILURE(m_DeviceBase, res == NVAPI_OK, ReturnVoid(), "NvAPI_D3D11_BeginUAVOverlap() failed!"); - } else if (m_AGSContext) { - const AGSReturnCode res = m_AGS.BeginUAVOverlap(m_AGSContext, deviceContext); + } else if (m_AgsContext) { + const AGSReturnCode res = m_Ags.BeginUAVOverlap(m_AgsContext, deviceContext); RETURN_ON_FAILURE(m_DeviceBase, res == AGS_SUCCESS, ReturnVoid(), "agsDriverExtensionsDX11_BeginUAVOverlap() failed!"); } } void Ext::EndUAVOverlap(ID3D11DeviceContext* deviceContext) const { - if (m_IsNvAPIAvailable) { + if (m_IsNvapiAvailable) { const NvAPI_Status status = NvAPI_D3D11_EndUAVOverlap(deviceContext); RETURN_ON_FAILURE(m_DeviceBase, status == NVAPI_OK, ReturnVoid(), "NvAPI_D3D11_EndUAVOverlap() failed!"); - } else if (m_AGSContext) { - const AGSReturnCode res = m_AGS.EndUAVOverlap(m_AGSContext, deviceContext); + } else if (m_AgsContext) { + const AGSReturnCode res = m_Ags.EndUAVOverlap(m_AgsContext, deviceContext); RETURN_ON_FAILURE(m_DeviceBase, res == AGS_SUCCESS, ReturnVoid(), "agsDriverExtensionsDX11_EndUAVOverlap() failed!"); } } void Ext::WaitForDrain(ID3D11DeviceContext* deviceContext, uint32_t flags) const { - if (m_IsNvAPIAvailable) { + if (m_IsNvapiAvailable) { const NvAPI_Status res = NvAPI_D3D11_BeginUAVOverlapEx(deviceContext, flags); RETURN_ON_FAILURE(m_DeviceBase, res == NVAPI_OK, ReturnVoid(), "NvAPI_D3D11_BeginUAVOverlap() failed!"); - } else if (m_AGSContext) { + } else if (m_AgsContext) { // TODO: verify that this code actually works on AMD! - const AGSReturnCode res1 = m_AGS.EndUAVOverlap(m_AGSContext, deviceContext); + const AGSReturnCode res1 = m_Ags.EndUAVOverlap(m_AgsContext, deviceContext); RETURN_ON_FAILURE(m_DeviceBase, res1 == AGS_SUCCESS, ReturnVoid(), "agsDriverExtensionsDX11_EndUAVOverlap() failed!"); - const AGSReturnCode res2 = m_AGS.BeginUAVOverlap(m_AGSContext, deviceContext); + const AGSReturnCode res2 = m_Ags.BeginUAVOverlap(m_AgsContext, deviceContext); RETURN_ON_FAILURE(m_DeviceBase, res2 == AGS_SUCCESS, ReturnVoid(), "agsDriverExtensionsDX11_BeginUAVOverlap() failed!"); } } @@ -145,28 +178,27 @@ void Ext::WaitForDrain(ID3D11DeviceContext* deviceContext, uint32_t flags) const void Ext::SetDepthBounds(ID3D11DeviceContext* deviceContext, float minBound, float maxBound) const { bool isEnabled = minBound != 0.0f || maxBound != 1.0f; - if (m_IsNvAPIAvailable) { + if (m_IsNvapiAvailable) { const NvAPI_Status status = NvAPI_D3D11_SetDepthBoundsTest(deviceContext, isEnabled, minBound, maxBound); RETURN_ON_FAILURE(m_DeviceBase, status == NVAPI_OK, ReturnVoid(), "NvAPI_D3D11_SetDepthBoundsTest() failed!"); - } else if (m_AGSContext) { - const AGSReturnCode res = m_AGS.SetDepthBounds(m_AGSContext, deviceContext, isEnabled, minBound, maxBound); + } else if (m_AgsContext) { + const AGSReturnCode res = m_Ags.SetDepthBounds(m_AgsContext, deviceContext, isEnabled, minBound, maxBound); RETURN_ON_FAILURE(m_DeviceBase, res == AGS_SUCCESS, ReturnVoid(), "agsDriverExtensionsDX11_SetDepthBounds() failed!"); } } -void Ext::DrawIndirect( - ID3D11DeviceContext* deviceContext, ID3D11Buffer* buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, ID3D11Buffer* countBuffer, uint32_t countBufferOffset) const { +void Ext::DrawIndirect(ID3D11DeviceContext* deviceContext, ID3D11Buffer* buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, ID3D11Buffer* countBuffer, uint32_t countBufferOffset) const { if (countBuffer) { - if (m_AGSContext) { - const AGSReturnCode res = m_AGS.DrawIndirectCount(m_AGSContext, deviceContext, countBuffer, countBufferOffset, buffer, (uint32_t)offset, stride); + if (m_AgsContext) { + const AGSReturnCode res = m_Ags.DrawIndirectCount(m_AgsContext, deviceContext, countBuffer, countBufferOffset, buffer, (uint32_t)offset, stride); RETURN_ON_FAILURE(m_DeviceBase, res == AGS_SUCCESS, ReturnVoid(), "agsDriverExtensionsDX11_MultiDrawInstancedIndirectCountIndirect() failed!"); } } else { - if (m_IsNvAPIAvailable && drawNum > 1) { + if (m_IsNvapiAvailable && drawNum > 1) { const NvAPI_Status status = NvAPI_D3D11_MultiDrawInstancedIndirect(deviceContext, drawNum, buffer, (uint32_t)offset, stride); RETURN_ON_FAILURE(m_DeviceBase, status == NVAPI_OK, ReturnVoid(), "NvAPI_D3D11_MultiDrawInstancedIndirect() failed!"); - } else if (m_AGSContext && drawNum > 1) { - const AGSReturnCode res = m_AGS.DrawIndirect(m_AGSContext, deviceContext, drawNum, buffer, (uint32_t)offset, stride); + } else if (m_AgsContext && drawNum > 1) { + const AGSReturnCode res = m_Ags.DrawIndirect(m_AgsContext, deviceContext, drawNum, buffer, (uint32_t)offset, stride); RETURN_ON_FAILURE(m_DeviceBase, res == AGS_SUCCESS, ReturnVoid(), "agsDriverExtensionsDX11_MultiDrawInstancedIndirect() failed!"); } else { for (uint32_t i = 0; i < drawNum; i++) { @@ -177,19 +209,18 @@ void Ext::DrawIndirect( } } -void Ext::DrawIndexedIndirect( - ID3D11DeviceContext* deviceContext, ID3D11Buffer* buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, ID3D11Buffer* countBuffer, uint32_t countBufferOffset) const { +void Ext::DrawIndexedIndirect(ID3D11DeviceContext* deviceContext, ID3D11Buffer* buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, ID3D11Buffer* countBuffer, uint32_t countBufferOffset) const { if (countBuffer) { - if (m_AGSContext) { - const AGSReturnCode res = m_AGS.DrawIndexedIndirectCount(m_AGSContext, deviceContext, countBuffer, countBufferOffset, buffer, (uint32_t)offset, stride); + if (m_AgsContext) { + const AGSReturnCode res = m_Ags.DrawIndexedIndirectCount(m_AgsContext, deviceContext, countBuffer, countBufferOffset, buffer, (uint32_t)offset, stride); RETURN_ON_FAILURE(m_DeviceBase, res == AGS_SUCCESS, ReturnVoid(), "agsDriverExtensionsDX11_MultiDrawIndexedInstancedIndirectCountIndirect() failed!"); } } else { - if (m_IsNvAPIAvailable && drawNum > 1) { + if (m_IsNvapiAvailable && drawNum > 1) { const NvAPI_Status status = NvAPI_D3D11_MultiDrawIndexedInstancedIndirect(deviceContext, drawNum, buffer, (uint32_t)offset, stride); RETURN_ON_FAILURE(m_DeviceBase, status == NVAPI_OK, ReturnVoid(), "NvAPI_D3D11_MultiDrawIndexedInstancedIndirect() failed!"); - } else if (m_AGSContext && drawNum > 1) { - const AGSReturnCode res = m_AGS.DrawIndexedIndirect(m_AGSContext, deviceContext, drawNum, buffer, (uint32_t)offset, stride); + } else if (m_AgsContext && drawNum > 1) { + const AGSReturnCode res = m_Ags.DrawIndexedIndirect(m_AgsContext, deviceContext, drawNum, buffer, (uint32_t)offset, stride); RETURN_ON_FAILURE(m_DeviceBase, res == AGS_SUCCESS, ReturnVoid(), "agsDriverExtensionsDX11_MultiDrawIndexedInstancedIndirect() failed!"); } else { for (uint32_t i = 0; i < drawNum; i++) { @@ -204,7 +235,6 @@ void Ext::DrawIndexedIndirect( #else -// D3D11 # if defined(__d3d11_h__) void Ext::DrawIndirect(ID3D11DeviceContext* deviceContext, ID3D11Buffer* buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, ID3D11Buffer* countBuffer, uint32_t) const { @@ -216,8 +246,7 @@ void Ext::DrawIndirect(ID3D11DeviceContext* deviceContext, ID3D11Buffer* buffer, } } -void Ext::DrawIndexedIndirect( - ID3D11DeviceContext* deviceContext, ID3D11Buffer* buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, ID3D11Buffer* countBuffer, uint32_t) const { +void Ext::DrawIndexedIndirect(ID3D11DeviceContext* deviceContext, ID3D11Buffer* buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, ID3D11Buffer* countBuffer, uint32_t) const { if (!countBuffer) { for (uint32_t i = 0; i < drawNum; i++) { deviceContext->DrawIndexedInstancedIndirect(buffer, (uint32_t)offset); @@ -226,6 +255,15 @@ void Ext::DrawIndexedIndirect( } } +# else + +Ext::~Ext() { + if (m_PixLibrary) { + UnloadSharedLibrary(*m_PixLibrary); + m_PixLibrary = nullptr; + } +} + # endif #endif