Added support for dynamic d3dcompile load

If you really want to use d3dcompile, then I think its better to find the most recent d3dcompile you have on your computer and load its D3DCompile function.
This process is now automatically handled. Just define  the right Preprocessor.
This commit is contained in:
Nemirtingas 2019-08-02 09:06:59 +02:00
parent a1037e3bf2
commit 3a0d9c55c1
5 changed files with 72 additions and 4 deletions

View file

@ -335,6 +335,12 @@ bool ImGui_ImplDX10_CreateDeviceObjects()
// 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL. // 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL.
// See https://github.com/ocornut/imgui/pull/638 for sources and details. // See https://github.com/ocornut/imgui/pull/638 for sources and details.
#ifdef USE_D3DCOMPILE
decltype(D3DCompile)* D3DCompile = load_d3dcompile();
if (D3DCompile == nullptr)
return false;
#endif
// Create the vertex shader // Create the vertex shader
{ {
#ifdef USE_D3DCOMPILE #ifdef USE_D3DCOMPILE
@ -367,6 +373,7 @@ bool ImGui_ImplDX10_CreateDeviceObjects()
}"; }";
D3DCompile(vertexShader, strlen(vertexShader), NULL, NULL, NULL, "main", "vs_4_0", 0, 0, &g_pVertexShaderBlob, NULL); D3DCompile(vertexShader, strlen(vertexShader), NULL, NULL, NULL, "main", "vs_4_0", 0, 0, &g_pVertexShaderBlob, NULL);
if (g_pVertexShaderBlob == NULL) // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob! if (g_pVertexShaderBlob == NULL) // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
return false; return false;
@ -424,6 +431,7 @@ bool ImGui_ImplDX10_CreateDeviceObjects()
}"; }";
D3DCompile(pixelShader, strlen(pixelShader), NULL, NULL, NULL, "main", "ps_4_0", 0, 0, &g_pPixelShaderBlob, NULL); D3DCompile(pixelShader, strlen(pixelShader), NULL, NULL, NULL, "main", "ps_4_0", 0, 0, &g_pPixelShaderBlob, NULL);
if (g_pPixelShaderBlob == NULL) // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob! if (g_pPixelShaderBlob == NULL) // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
return false; return false;
if (g_pd3dDevice->CreatePixelShader((DWORD*)g_pPixelShaderBlob->GetBufferPointer(), g_pPixelShaderBlob->GetBufferSize(), &g_pPixelShader) != S_OK) if (g_pd3dDevice->CreatePixelShader((DWORD*)g_pPixelShaderBlob->GetBufferPointer(), g_pPixelShaderBlob->GetBufferSize(), &g_pPixelShader) != S_OK)
@ -434,6 +442,10 @@ bool ImGui_ImplDX10_CreateDeviceObjects()
#endif #endif
} }
#ifdef USE_D3DCOMPILE
unload_d3dcompile();
#endif
// Create the blending setup // Create the blending setup
{ {
D3D10_BLEND_DESC desc; D3D10_BLEND_DESC desc;

View file

@ -342,6 +342,12 @@ bool ImGui_ImplDX11_CreateDeviceObjects()
// 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL. // 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL.
// See https://github.com/ocornut/imgui/pull/638 for sources and details. // See https://github.com/ocornut/imgui/pull/638 for sources and details.
#ifdef USE_D3DCOMPILE
decltype(D3DCompile)* D3DCompile = load_d3dcompile();
if (D3DCompile == nullptr)
return false;
#endif
// Create the vertex shader // Create the vertex shader
{ {
#ifdef USE_D3DCOMPILE #ifdef USE_D3DCOMPILE
@ -441,6 +447,10 @@ bool ImGui_ImplDX11_CreateDeviceObjects()
#endif #endif
} }
#ifdef USE_D3DCOMPILE
unload_d3dcompile();
#endif
// Create the blending setup // Create the blending setup
{ {
D3D11_BLEND_DESC desc; D3D11_BLEND_DESC desc;

View file

@ -468,6 +468,12 @@ bool ImGui_ImplDX12_CreateDeviceObjects()
psoDesc.SampleDesc.Count = 1; psoDesc.SampleDesc.Count = 1;
psoDesc.Flags = D3D12_PIPELINE_STATE_FLAG_NONE; psoDesc.Flags = D3D12_PIPELINE_STATE_FLAG_NONE;
#ifdef USE_D3DCOMPILE
decltype(D3DCompile)* D3DCompile = load_d3dcompile();
if (D3DCompile == nullptr)
return false;
#endif
// Create the vertex shader // Create the vertex shader
{ {
#ifdef USE_D3DCOMPILE #ifdef USE_D3DCOMPILE
@ -546,6 +552,10 @@ bool ImGui_ImplDX12_CreateDeviceObjects()
#endif #endif
} }
#ifdef USE_D3DCOMPILE
unload_d3dcompile();
#endif
// Create the blending setup // Create the blending setup
{ {
D3D12_BLEND_DESC& desc = psoDesc.BlendState; D3D12_BLEND_DESC& desc = psoDesc.BlendState;

View file

@ -1,5 +1,36 @@
#include "ImGui_ShaderBlobs.h" #include "ImGui_ShaderBlobs.h"
#ifdef USE_D3DCOMPILE
#include <stdio.h>
static HMODULE d3dcompile_dll = nullptr;
decltype(D3DCompile)* load_d3dcompile()
{
decltype(D3DCompile)* func = nullptr;
for (int i = 47; i > 30; i--)
{
char dll_name[20];
sprintf_s(dll_name, "d3dcompiler_%02d.dll", i);
if (d3dcompile_dll = LoadLibraryA(dll_name))
{
func = (decltype(D3DCompile)*)GetProcAddress(d3dcompile_dll, "D3DCompile");
break;
}
}
return func;
}
void unload_d3dcompile()
{
if (d3dcompile_dll)
FreeLibrary(d3dcompile_dll);
}
#else
extern unsigned char ImGui_vertexShaderDX10[] = { extern unsigned char ImGui_vertexShaderDX10[] = {
0x44, 0x58, 0x42, 0x43, 0x7a, 0x54, 0x84, 0x96, 0xdf, 0xd1, 0x9e, 0x21, 0x44, 0x58, 0x42, 0x43, 0x7a, 0x54, 0x84, 0x96, 0xdf, 0xd1, 0x9e, 0x21,
0xfd, 0x85, 0x86, 0x3d, 0x28, 0xd1, 0x03, 0xae, 0x01, 0x00, 0x00, 0x00, 0xfd, 0x85, 0x86, 0x3d, 0x28, 0xd1, 0x03, 0xae, 0x01, 0x00, 0x00, 0x00,
@ -284,3 +315,5 @@ extern unsigned char ImGui_pixelShaderDX12[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00
}; };
#endif

View file

@ -6,9 +6,12 @@
#ifdef USE_D3DCOMPILE #ifdef USE_D3DCOMPILE
#include <d3dcompiler.h> #include <d3dcompiler.h>
#ifdef _MSC_VER //#ifdef _MSC_VER
#pragma comment(lib, "d3dcompiler") // Automatically link with d3dcompiler.lib as we are using D3DCompile() below. // #pragma comment(lib, "d3dcompiler") // Automatically link with d3dcompiler.lib as we are using D3DCompile() below.
#endif //#endif
decltype(D3DCompile)* load_d3dcompile();
void unload_d3dcompile();
#else #else
#define ImGui_vertexShaderDX10_len 876 #define ImGui_vertexShaderDX10_len 876