Skip to content

Commit f699405

Browse files
committed
feat: compile shaders on linux via vkd3d
1 parent 598614a commit f699405

1 file changed

Lines changed: 62 additions & 21 deletions

File tree

src/ObjCompiling/Shader/D3DShaderCompiler.cpp

Lines changed: 62 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
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

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

Comments
 (0)