55
66#include < cassert>
77#include < cstdint>
8+ #include < cstring>
89#include < iostream>
910#include < memory>
1011#include < utility>
1112
1213#ifdef _WIN32
1314#include < Windows.h>
15+ #else
16+ #include < dlfcn.h>
1417#endif
1518
1619namespace
@@ -64,6 +67,19 @@ namespace
6467#define OAT_D3DCOMPILE_DEBUG_NAME_FOR_SOURCE 0x00400000
6568#define OAT_D3DCOMPILE_DEBUG_NAME_FOR_BINARY 0x00800000
6669
70+ #ifndef _WIN32
71+ #ifdef __x86_64__
72+ #define __stdcall __attribute__ ((ms_abi))
73+ #else
74+ #if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 2)) || defined(__APPLE__)
75+ #define __stdcall __attribute__ ((__stdcall__)) __attribute__((__force_align_arg_pointer__))
76+ #else
77+ #define __stdcall __attribute__ ((__stdcall__))
78+ #endif
79+ #endif
80+ #endif
81+ #define STDMETHODCALLTYPE __stdcall
82+
6783 enum OAT_D3D_INCLUDE_TYPE : uint32_t
6884 {
6985 OAT_D3D_INCLUDE_LOCAL = 0 ,
@@ -72,9 +88,10 @@ namespace
7288
7389 struct OAT_ID3DInclude
7490 {
75- virtual OAT_HRESULT __stdcall Open (
76- OAT_D3D_INCLUDE_TYPE includeType, const char * fileName, const void * parentData, const void ** data, unsigned int * size) = 0;
77- virtual OAT_HRESULT __stdcall Close (const void * data) = 0;
91+ // clang-format off
92+ virtual OAT_HRESULT STDMETHODCALLTYPE Open (OAT_D3D_INCLUDE_TYPE includeType, const char * fileName, const void * parentData, const void ** data, unsigned int * size) = 0;
93+ virtual OAT_HRESULT STDMETHODCALLTYPE Close (const void * data) = 0;
94+ // clang-format on
7895 };
7996
8097 struct OAT_GUID
@@ -89,18 +106,18 @@ namespace
89106
90107 struct OAT_IUnknown
91108 {
92- virtual OAT_HRESULT __stdcall QueryInterface (const OAT_IID & riid, void ** object) = 0;
109+ virtual OAT_HRESULT STDMETHODCALLTYPE QueryInterface (const OAT_IID & riid, void ** object) = 0;
93110
94- virtual OAT_ULONG __stdcall AddRef () = 0;
111+ virtual OAT_ULONG STDMETHODCALLTYPE AddRef () = 0;
95112
96- virtual OAT_ULONG __stdcall Release () = 0;
113+ virtual OAT_ULONG STDMETHODCALLTYPE Release () = 0;
97114 };
98115
99116 struct OAT_ID3DBlob : OAT_IUnknown
100117 {
101- virtual void * __stdcall GetBufferPointer () = 0;
118+ virtual void * STDMETHODCALLTYPE GetBufferPointer () = 0;
102119
103- virtual OAT_SIZE_T __stdcall GetBufferSize () = 0;
120+ virtual OAT_SIZE_T STDMETHODCALLTYPE GetBufferSize () = 0;
104121 };
105122
106123 struct OAT_D3D_SHADER_MACRO
@@ -109,17 +126,17 @@ namespace
109126 const char * Definition;
110127 };
111128
112- typedef OAT_HRESULT (__stdcall * D3DCompile_t)(const void * data,
113- OAT_SIZE_T dataSize,
114- const char * filename,
115- const OAT_D3D_SHADER_MACRO * defines,
116- OAT_ID3DInclude* include,
117- const char * entrypoint,
118- const char * target,
119- unsigned int flags,
120- unsigned int effectFlags,
121- OAT_ID3DBlob** shader,
122- OAT_ID3DBlob** errorMessages);
129+ typedef OAT_HRESULT (STDMETHODCALLTYPE * D3DCompile_t)(const void * data,
130+ OAT_SIZE_T dataSize,
131+ const char * filename,
132+ const OAT_D3D_SHADER_MACRO * defines,
133+ OAT_ID3DInclude* include,
134+ const char * entrypoint,
135+ const char * target,
136+ unsigned int flags,
137+ unsigned int effectFlags,
138+ OAT_ID3DBlob** shader,
139+ OAT_ID3DBlob** errorMessages);
123140
124141 constexpr size_t MAX_SHADER_SIZE = 0x1900000u ;
125142
@@ -132,7 +149,7 @@ namespace
132149 }
133150
134151 OAT_HRESULT
135- __stdcall Open (OAT_D3D_INCLUDE_TYPE includeType, const char * fileName, const void * parentData, const void ** data, unsigned int * size) override
152+ STDMETHODCALLTYPE Open (OAT_D3D_INCLUDE_TYPE includeType, const char * fileName, const void * parentData, const void ** data, unsigned int * size) override
136153 {
137154 const auto fullFileName = shader::GetSourceFileNameForShaderAssetName (fileName);
138155 auto file = m_search_path.Open (fullFileName);
@@ -158,7 +175,7 @@ namespace
158175 return OAT_S_OK ;
159176 }
160177
161- OAT_HRESULT __stdcall Close (const void * data) override
178+ OAT_HRESULT STDMETHODCALLTYPE Close (const void * data) override
162179 {
163180 for (auto i = m_file_buffers_in_use.begin (); i != m_file_buffers_in_use.end (); ++i)
164181 {
@@ -185,6 +202,13 @@ namespace
185202 {
186203#ifdef _WIN32
187204 con::warn (" Could not initialize shader compilation. Make sure DirectX is installed on your machine if you want to make use of it." );
205+ #else
206+ #ifdef ARCH_x86
207+ #define REQUIRED_VKD3D " lib32-vkd3d"
208+ #else
209+ #define REQUIRED_VKD3D " vkd3d"
210+ #endif
211+ con::warn (" Could not initialize shader compilation. Make sure " REQUIRED_VKD3D " is installed if you want to make use of it." );
188212#endif
189213 }
190214
@@ -207,6 +231,23 @@ namespace
207231 return ;
208232 }
209233
234+ d3dCompile = reinterpret_cast <D3DCompile_t>(d3dCompileAddress);
235+ compilationAvailable = true ;
236+ #else
237+ const auto libvkd3dUtils = dlopen (" libvkd3d-utils.so" , RTLD_NOW );
238+ if (!libvkd3dUtils)
239+ {
240+ PrintInitializationFailedMessage ();
241+ return ;
242+ }
243+
244+ const auto d3dCompileAddress = dlsym (libvkd3dUtils, " D3DCompile" );
245+ if (!d3dCompileAddress)
246+ {
247+ PrintInitializationFailedMessage ();
248+ return ;
249+ }
250+
210251 d3dCompile = reinterpret_cast <D3DCompile_t>(d3dCompileAddress);
211252 compilationAvailable = true ;
212253#endif
0 commit comments