D3D11: Added multi-draw indirect via NVAPI.

This commit is contained in:
Branimir Karadžić
2018-01-15 21:57:21 -08:00
parent ba8b9a76fe
commit d835c09d7b
3 changed files with 51 additions and 7 deletions

View File

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

View File

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

View File

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