diff --git a/src/nvapi.cpp b/src/nvapi.cpp index 8a761874c..e9a77e00d 100644 --- a/src/nvapi.cpp +++ b/src/nvapi.cpp @@ -53,11 +53,13 @@ namespace bgfx typedef NvApiStatus (NVAPICALL* PFN_NVAPI_GPUGETMEMORYINFO)(NvPhysicalGpuHandle* _handle, NvMemoryInfoV2* _memoryInfo); typedef NvApiStatus (NVAPICALL* PFN_NVAPI_GPUGETFULLNAME)(NvPhysicalGpuHandle* _physicalGpu, char _name[64]); -#define NVAPI_INITIALIZE UINT32_C(0x0150e828) -#define NVAPI_UNLOAD UINT32_C(0xd22bdd7e) -#define NVAPI_ENUMPHYSICALGPUS UINT32_C(0xe5ac921f) -#define NVAPI_GPUGETMEMORYINFO UINT32_C(0x07f9b368) -#define NVAPI_GPUGETFULLNAME UINT32_C(0xceee8e9f) +#define NVAPI_INITIALIZE UINT32_C(0x0150e828) +#define NVAPI_UNLOAD UINT32_C(0xd22bdd7e) +#define NVAPI_ENUMPHYSICALGPUS UINT32_C(0xe5ac921f) +#define NVAPI_GPUGETMEMORYINFO UINT32_C(0x07f9b368) +#define NVAPI_GPUGETFULLNAME UINT32_C(0xceee8e9f) +#define NVAPI_MULTIDRAWINSTANCEDINDIRECT UINT32_C(0xd4e26bbf) +#define NVAPI_MULTIDRAWINDEXEDINSTANCEDINDIRECT UINT32_C(0x59e890f9) static PFN_NVAPI_QUERYINTERFACE nvApiQueryInterface; static PFN_NVAPI_INITIALIZE nvApiInitialize; @@ -97,6 +99,9 @@ namespace bgfx nvApiGpuGetMemoryInfo = (PFN_NVAPI_GPUGETMEMORYINFO )nvApiQueryInterface(NVAPI_GPUGETMEMORYINFO); nvApiGpuGetFullName = (PFN_NVAPI_GPUGETFULLNAME )nvApiQueryInterface(NVAPI_GPUGETFULLNAME); + nvApiD3D11MultiDrawInstancedIndirect = (NvMultiDrawIndirectFn)nvApiQueryInterface(NVAPI_MULTIDRAWINSTANCEDINDIRECT); + nvApiD3D11MultiDrawIndexedInstancedIndirect = (NvMultiDrawIndirectFn)nvApiQueryInterface(NVAPI_MULTIDRAWINDEXEDINSTANCEDINDIRECT); + initialized = true && NULL != nvApiInitialize && NULL != nvApiUnload diff --git a/src/nvapi.h b/src/nvapi.h index be7b16347..f6f71c8a2 100644 --- a/src/nvapi.h +++ b/src/nvapi.h @@ -6,10 +6,15 @@ #ifndef BGFX_NVAPI_H_HEADER_GUARD #define BGFX_NVAPI_H_HEADER_GUARD +struct ID3D11DeviceContext; +struct ID3D11Buffer; + namespace bgfx { struct NvPhysicalGpuHandle; + typedef void (* NvMultiDrawIndirectFn)(ID3D11DeviceContext* _deviceCtx, uint32_t _numDrawIndirect, ID3D11Buffer* _ptr, uint32_t _offset, uint32_t _stride); + /// struct NvApi { @@ -22,11 +27,18 @@ namespace bgfx /// void shutdown(); + /// + bool isInitialized() const { return NULL != m_nvGpu; } + /// void getMemoryInfo(int64_t& _gpuMemoryUsed, int64_t& _gpuMemoryMax); + /// void* m_nvApiDll; NvPhysicalGpuHandle* m_nvGpu; + + NvMultiDrawIndirectFn nvApiD3D11MultiDrawInstancedIndirect; + NvMultiDrawIndirectFn nvApiD3D11MultiDrawIndexedInstancedIndirect; }; } // namespace bgfx diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 35014fe4e..24069e893 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -674,6 +674,9 @@ namespace bgfx { namespace d3d11 void amdAgsMultiDrawInstancedIndirect(uint32_t _numDrawIndirect, ID3D11Buffer* _ptr, uint32_t _offset, uint32_t _stride); void amdAgsMultiDrawIndexedInstancedIndirect(uint32_t _numDrawIndirect, ID3D11Buffer* _ptr, uint32_t _offset, uint32_t _stride); + void nvapiMultiDrawInstancedIndirect(uint32_t _numDrawIndirect, ID3D11Buffer* _ptr, uint32_t _offset, uint32_t _stride); + void nvapiMultiDrawIndexedInstancedIndirect(uint32_t _numDrawIndirect, ID3D11Buffer* _ptr, uint32_t _offset, uint32_t _stride); + static MultiDrawIndirectFn multiDrawInstancedIndirect; static MultiDrawIndirectFn multiDrawIndexedInstancedIndirect; @@ -1242,6 +1245,11 @@ BX_PRAGMA_DIAGNOSTIC_POP(); ; g_caps.deviceId = (uint16_t)m_adapterDesc.DeviceId; + if (BGFX_PCI_ID_NVIDIA != m_adapterDesc.VendorId) + { + m_nvapi.shutdown(); + } + if (NULL == g_platformData.backBuffer) { #if !BX_PLATFORM_WINDOWS @@ -1836,6 +1844,13 @@ BX_PRAGMA_DIAGNOSTIC_POP(); m_ags = NULL; } } + else if (m_nvapi.isInitialized() + && NULL != m_nvapi.nvApiD3D11MultiDrawInstancedIndirect + && NULL != m_nvapi.nvApiD3D11MultiDrawIndexedInstancedIndirect) + { + multiDrawInstancedIndirect = nvapiMultiDrawInstancedIndirect; + multiDrawIndexedInstancedIndirect = nvapiMultiDrawIndexedInstancedIndirect; + } } // @@ -3993,6 +4008,16 @@ BX_PRAGMA_DIAGNOSTIC_POP(); agsDriverExtensions_MultiDrawIndexedInstancedIndirect(s_renderD3D11->m_ags, _numDrawIndirect, _ptr, _offset, _stride); } + void nvapiMultiDrawInstancedIndirect(uint32_t _numDrawIndirect, ID3D11Buffer* _ptr, uint32_t _offset, uint32_t _stride) + { + s_renderD3D11->m_nvapi.nvApiD3D11MultiDrawInstancedIndirect(s_renderD3D11->m_deviceCtx, _numDrawIndirect, _ptr, _offset, _stride); + } + + void nvapiMultiDrawIndexedInstancedIndirect(uint32_t _numDrawIndirect, ID3D11Buffer* _ptr, uint32_t _offset, uint32_t _stride) + { + s_renderD3D11->m_nvapi.nvApiD3D11MultiDrawIndexedInstancedIndirect(s_renderD3D11->m_deviceCtx, _numDrawIndirect, _ptr, _offset, _stride); + } + int WINAPI d3d11Annotation_BeginEvent(DWORD _color, LPCWSTR _name) { BX_UNUSED(_color); @@ -6609,7 +6634,8 @@ BX_PRAGMA_DIAGNOSTIC_POP(); : draw.m_numIndirect ; - multiDrawIndexedInstancedIndirect(numDrawIndirect + multiDrawIndexedInstancedIndirect( + numDrawIndirect , ptr , draw.m_startIndirect * BGFX_CONFIG_DRAW_INDIRECT_STRIDE , BGFX_CONFIG_DRAW_INDIRECT_STRIDE @@ -6622,7 +6648,8 @@ BX_PRAGMA_DIAGNOSTIC_POP(); : draw.m_numIndirect ; - multiDrawInstancedIndirect(numDrawIndirect + multiDrawInstancedIndirect( + numDrawIndirect , ptr , draw.m_startIndirect * BGFX_CONFIG_DRAW_INDIRECT_STRIDE , BGFX_CONFIG_DRAW_INDIRECT_STRIDE