Explorar o código

D3D11: Added multi-draw indirect via NVAPI.

Branimir Karadžić %!s(int64=8) %!d(string=hai) anos
pai
achega
d835c09d7b
Modificáronse 3 ficheiros con 51 adicións e 7 borrados
  1. 10 5
      src/nvapi.cpp
  2. 12 0
      src/nvapi.h
  3. 29 2
      src/renderer_d3d11.cpp

+ 10 - 5
src/nvapi.cpp

@@ -53,11 +53,13 @@ namespace bgfx
 	typedef NvApiStatus (NVAPICALL* PFN_NVAPI_GPUGETMEMORYINFO)(NvPhysicalGpuHandle* _handle, NvMemoryInfoV2* _memoryInfo);
 	typedef NvApiStatus (NVAPICALL* PFN_NVAPI_GPUGETMEMORYINFO)(NvPhysicalGpuHandle* _handle, NvMemoryInfoV2* _memoryInfo);
 	typedef NvApiStatus (NVAPICALL* PFN_NVAPI_GPUGETFULLNAME)(NvPhysicalGpuHandle* _physicalGpu, char _name[64]);
 	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_QUERYINTERFACE   nvApiQueryInterface;
 	static PFN_NVAPI_INITIALIZE       nvApiInitialize;
 	static PFN_NVAPI_INITIALIZE       nvApiInitialize;
@@ -97,6 +99,9 @@ namespace bgfx
 				nvApiGpuGetMemoryInfo = (PFN_NVAPI_GPUGETMEMORYINFO )nvApiQueryInterface(NVAPI_GPUGETMEMORYINFO);
 				nvApiGpuGetMemoryInfo = (PFN_NVAPI_GPUGETMEMORYINFO )nvApiQueryInterface(NVAPI_GPUGETMEMORYINFO);
 				nvApiGpuGetFullName   = (PFN_NVAPI_GPUGETFULLNAME   )nvApiQueryInterface(NVAPI_GPUGETFULLNAME);
 				nvApiGpuGetFullName   = (PFN_NVAPI_GPUGETFULLNAME   )nvApiQueryInterface(NVAPI_GPUGETFULLNAME);
 
 
+				nvApiD3D11MultiDrawInstancedIndirect        = (NvMultiDrawIndirectFn)nvApiQueryInterface(NVAPI_MULTIDRAWINSTANCEDINDIRECT);
+				nvApiD3D11MultiDrawIndexedInstancedIndirect = (NvMultiDrawIndirectFn)nvApiQueryInterface(NVAPI_MULTIDRAWINDEXEDINSTANCEDINDIRECT);
+
 				initialized = true
 				initialized = true
 					&& NULL != nvApiInitialize
 					&& NULL != nvApiInitialize
 					&& NULL != nvApiUnload
 					&& NULL != nvApiUnload

+ 12 - 0
src/nvapi.h

@@ -6,10 +6,15 @@
 #ifndef BGFX_NVAPI_H_HEADER_GUARD
 #ifndef BGFX_NVAPI_H_HEADER_GUARD
 #define BGFX_NVAPI_H_HEADER_GUARD
 #define BGFX_NVAPI_H_HEADER_GUARD
 
 
+struct ID3D11DeviceContext;
+struct ID3D11Buffer;
+
 namespace bgfx
 namespace bgfx
 {
 {
 	struct NvPhysicalGpuHandle;
 	struct NvPhysicalGpuHandle;
 
 
+	typedef void (* NvMultiDrawIndirectFn)(ID3D11DeviceContext* _deviceCtx, uint32_t _numDrawIndirect, ID3D11Buffer* _ptr, uint32_t _offset, uint32_t _stride);
+
 	///
 	///
 	struct NvApi
 	struct NvApi
 	{
 	{
@@ -22,11 +27,18 @@ namespace bgfx
 		///
 		///
 		void shutdown();
 		void shutdown();
 
 
+		///
+		bool isInitialized() const { return NULL != m_nvGpu; }
+
 		///
 		///
 		void getMemoryInfo(int64_t& _gpuMemoryUsed, int64_t& _gpuMemoryMax);
 		void getMemoryInfo(int64_t& _gpuMemoryUsed, int64_t& _gpuMemoryMax);
 
 
+		///
 		void* m_nvApiDll;
 		void* m_nvApiDll;
 		NvPhysicalGpuHandle* m_nvGpu;
 		NvPhysicalGpuHandle* m_nvGpu;
+
+		NvMultiDrawIndirectFn nvApiD3D11MultiDrawInstancedIndirect;
+		NvMultiDrawIndirectFn nvApiD3D11MultiDrawIndexedInstancedIndirect;
 	};
 	};
 
 
 } // namespace bgfx
 } // namespace bgfx

+ 29 - 2
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 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 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 multiDrawInstancedIndirect;
 	static MultiDrawIndirectFn multiDrawIndexedInstancedIndirect;
 	static MultiDrawIndirectFn multiDrawIndexedInstancedIndirect;
 
 
@@ -1242,6 +1245,11 @@ BX_PRAGMA_DIAGNOSTIC_POP();
 					;
 					;
 				g_caps.deviceId = (uint16_t)m_adapterDesc.DeviceId;
 				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 (NULL == g_platformData.backBuffer)
 				{
 				{
 #if !BX_PLATFORM_WINDOWS
 #if !BX_PLATFORM_WINDOWS
@@ -1836,6 +1844,13 @@ BX_PRAGMA_DIAGNOSTIC_POP();
 							m_ags = NULL;
 							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);
 		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)
 	int  WINAPI d3d11Annotation_BeginEvent(DWORD _color, LPCWSTR _name)
 	{
 	{
 		BX_UNUSED(_color);
 		BX_UNUSED(_color);
@@ -6609,7 +6634,8 @@ BX_PRAGMA_DIAGNOSTIC_POP();
 								: draw.m_numIndirect
 								: draw.m_numIndirect
 								;
 								;
 
 
-							multiDrawIndexedInstancedIndirect(numDrawIndirect
+							multiDrawIndexedInstancedIndirect(
+								  numDrawIndirect
 								, ptr
 								, ptr
 								, draw.m_startIndirect * BGFX_CONFIG_DRAW_INDIRECT_STRIDE
 								, draw.m_startIndirect * BGFX_CONFIG_DRAW_INDIRECT_STRIDE
 								, BGFX_CONFIG_DRAW_INDIRECT_STRIDE
 								, BGFX_CONFIG_DRAW_INDIRECT_STRIDE
@@ -6622,7 +6648,8 @@ BX_PRAGMA_DIAGNOSTIC_POP();
 								: draw.m_numIndirect
 								: draw.m_numIndirect
 								;
 								;
 
 
-							multiDrawInstancedIndirect(numDrawIndirect
+							multiDrawInstancedIndirect(
+								  numDrawIndirect
 								, ptr
 								, ptr
 								, draw.m_startIndirect * BGFX_CONFIG_DRAW_INDIRECT_STRIDE
 								, draw.m_startIndirect * BGFX_CONFIG_DRAW_INDIRECT_STRIDE
 								, BGFX_CONFIG_DRAW_INDIRECT_STRIDE
 								, BGFX_CONFIG_DRAW_INDIRECT_STRIDE