Przeglądaj źródła

D3D9: Enable compilation on Linux.

Бранимир Караџић 3 lat temu
rodzic
commit
d30032984b

+ 1 - 0
3rdparty/directx-headers/include/directx/d3d10.h

@@ -0,0 +1 @@
+#pragma once

+ 1 - 0
3rdparty/directx-headers/include/directx/d3d10_1.h

@@ -0,0 +1 @@
+#pragma once

+ 1 - 0
3rdparty/directx-headers/include/directx/d3d10_1shader.h

@@ -0,0 +1 @@
+#pragma once

+ 1 - 0
3rdparty/directx-headers/include/directx/d3d10effect.h

@@ -0,0 +1 @@
+#pragma once

+ 1 - 0
3rdparty/directx-headers/include/directx/d3d10misc.h

@@ -0,0 +1 @@
+#pragma once

+ 1 - 0
3rdparty/directx-headers/include/directx/d3d10sdklayers.h

@@ -0,0 +1 @@
+#pragma once

+ 1 - 0
3rdparty/directx-headers/include/directx/d3d10shader.h

@@ -0,0 +1 @@
+#pragma once

+ 1 - 0
3rdparty/directx-headers/include/wsl/stubs/basetsd.h

@@ -40,6 +40,7 @@ typedef uint16_t WORD;
 typedef void* PVOID;
 typedef char BOOLEAN;
 typedef uint64_t ULONGLONG;
+typedef int16_t SHORT, *PSHORT;
 typedef uint16_t USHORT, *PUSHORT;
 typedef int64_t LONGLONG, *PLONGLONG;
 typedef int64_t LONG_PTR, *PLONG_PTR;

+ 1 - 0
3rdparty/directx-headers/include/wsl/stubs/objbase.h

@@ -0,0 +1 @@
+#pragma once

+ 18 - 0
3rdparty/directx-headers/include/wsl/stubs/windows.h

@@ -0,0 +1,18 @@
+#pragma once
+#include "basetsd.h"
+
+typedef struct RGNDATAHEADER {
+  DWORD dwSize;
+  DWORD iType;
+  DWORD nCount;
+  DWORD nRgnSize;
+  RECT  rcBound;
+} RGNDATAHEADER;
+
+typedef struct RGNDATA {
+  RGNDATAHEADER rdh;
+  char          Buffer[1];
+} RGNDATA;
+
+#define MAKE_HRESULT(sev,fac,code) \
+    ((HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) )

+ 1 - 0
src/config.h

@@ -39,6 +39,7 @@
 
 #	ifndef BGFX_CONFIG_RENDERER_DIRECT3D9
 #		define BGFX_CONFIG_RENDERER_DIRECT3D9 (0 \
+					|| BX_PLATFORM_LINUX         \
 					|| BX_PLATFORM_WINDOWS       \
 					? 1 : 0)
 #	endif // BGFX_CONFIG_RENDERER_DIRECT3D9

+ 28 - 18
src/renderer_d3d9.cpp

@@ -455,32 +455,37 @@ namespace bgfx { namespace d3d9
 			// Reference(s):
 			// - https://web.archive.org/web/20190207230309/https://docs.microsoft.com/en-us/windows/desktop/direct3d9/d3dpresent-parameters
 			bx::memSet(&m_params, 0, sizeof(m_params) );
-			m_params.BackBufferWidth  = _init.resolution.width;
-			m_params.BackBufferHeight = _init.resolution.height;
-			m_params.BackBufferFormat = adapterFormat;
-			m_params.BackBufferCount  = bx::clamp<uint8_t>(_init.resolution.numBackBuffers, 2, BGFX_CONFIG_MAX_BACK_BUFFERS);
-			m_params.MultiSampleType  = D3DMULTISAMPLE_NONE;
-			m_params.MultiSampleQuality = 0;
+			m_params.BackBufferWidth        = _init.resolution.width;
+			m_params.BackBufferHeight       = _init.resolution.height;
+			m_params.BackBufferFormat       = adapterFormat;
+			m_params.BackBufferCount        = bx::clamp<uint8_t>(_init.resolution.numBackBuffers, 2, BGFX_CONFIG_MAX_BACK_BUFFERS);
+			m_params.MultiSampleType        = D3DMULTISAMPLE_NONE;
+			m_params.MultiSampleQuality     = 0;
 			m_params.EnableAutoDepthStencil = TRUE;
 			m_params.AutoDepthStencilFormat = D3DFMT_D24S8;
-			m_params.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
+			m_params.Flags                  = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
 
 			m_params.FullScreen_RefreshRateInHz = 0;
-			m_params.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
-			m_params.SwapEffect = D3DSWAPEFFECT_DISCARD;
-			m_params.hDeviceWindow = NULL;
-			m_params.Windowed = true;
-
-			RECT rect;
-			GetWindowRect( (HWND)g_platformData.nwh, &rect);
-			m_params.BackBufferWidth  = rect.right-rect.left;
-			m_params.BackBufferHeight = rect.bottom-rect.top;
+			m_params.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;
+			m_params.SwapEffect                 = D3DSWAPEFFECT_DISCARD;
+			m_params.hDeviceWindow              = NULL;
+			m_params.Windowed                   = true;
+			m_params.BackBufferWidth            = _init.resolution.width;
+			m_params.BackBufferHeight           = _init.resolution.height;
+
+			const char* d3d9DllName =
+#if BX_PLATFORM_LINUX
+				"d3d9.so"
+#else
+				"d3d9.dll"
+#endif // BX_PLATFORM_LINUX
+				;
 
-			m_d3d9Dll = bx::dlopen("d3d9.dll");
+			m_d3d9Dll = bx::dlopen(d3d9DllName);
 
 			if (NULL == m_d3d9Dll)
 			{
-				BX_TRACE("Init error: Failed to load d3d9.dll.");
+				BX_TRACE("Init error: Failed to load %s.", d3d9DllName);
 				goto error;
 			}
 
@@ -1231,6 +1236,7 @@ namespace bgfx { namespace d3d9
 
 		void requestScreenShot(FrameBufferHandle _handle, const char* _filePath) override
 		{
+#if BX_PLATFORM_WINDOWS
 			IDirect3DSwapChain9* swapChain = isValid(_handle)
 				? m_frameBuffers[_handle.idx].m_swapChain
 				: m_swapChain
@@ -1294,6 +1300,10 @@ namespace bgfx { namespace d3d9
 
 			DX_CHECK(surface->UnlockRect() );
 			DX_RELEASE(surface, 0);
+#else
+			BX_TRACE("Screenshot not supported!");
+			BX_UNUSED(_handle, _filePath);
+#endif // BX_PLATFORM_WINDOWS
 		}
 
 		void updateViewName(ViewId _id, const char* _name) override

+ 4 - 5
src/renderer_d3d9.h

@@ -6,12 +6,11 @@
 #ifndef BGFX_RENDERER_D3D9_H_HEADER_GUARD
 #define BGFX_RENDERER_D3D9_H_HEADER_GUARD
 
-#define BGFX_CONFIG_RENDERER_DIRECT3D9EX BX_PLATFORM_WINDOWS
+#define BGFX_CONFIG_RENDERER_DIRECT3D9EX (BX_PLATFORM_LINUX || BX_PLATFORM_WINDOWS)
 
-#if BX_PLATFORM_WINDOWS
-#	include <sal.h>
-#	include <d3d9.h>
-#endif // BX_PLATFORM_
+#include <sal.h>
+#include <unknwn.h>
+#include <d3d9.h>
 
 #ifndef D3DSTREAMSOURCE_INDEXEDDATA
 #	define D3DSTREAMSOURCE_INDEXEDDATA  (1<<30)