mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-19 05:23:00 +01:00
D3D11: Added multi-draw indirect via NVAPI.
This commit is contained in:
@@ -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
|
||||
|
||||
12
src/nvapi.h
12
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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user