mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-21 05:09:34 -06:00
Add EFB encode-to-RAM support in DX11 backend. It could probably be simplified a lot, and not all the possible formats are implemented. I tried to use the dynamic-linking feature of shader model 5, but Microsoft's HLSL compiler is broken. "Dynamic mode" is implemented, but disabled for now.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7253 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -25,6 +25,10 @@
|
||||
namespace DX11
|
||||
{
|
||||
|
||||
HINSTANCE hD3DCompilerDll = NULL;
|
||||
D3DREFLECT PD3DReflect = NULL;
|
||||
int d3dcompiler_dll_ref = 0;
|
||||
|
||||
HINSTANCE hD3DXDll = NULL;
|
||||
D3DX11COMPILEFROMMEMORYTYPE PD3DX11CompileFromMemory = NULL;
|
||||
D3DX11FILTERTEXTURETYPE PD3DX11FilterTexture = NULL;
|
||||
@ -113,7 +117,7 @@ HRESULT LoadD3DX()
|
||||
|
||||
// try to load D3DX11 first to check whether we have proper runtime support
|
||||
// try to use the dll the backend was compiled against first - don't bother about debug runtimes
|
||||
hD3DXDll = LoadLibraryA(StringFromFormat("d3dx11_%d.dll", D3DX11_SDK_VERSION).c_str());
|
||||
hD3DXDll = LoadLibraryA(D3DX11_DLL_A);
|
||||
if (!hD3DXDll)
|
||||
{
|
||||
// if that fails, use the dll which should be available in every SDK which officially supports DX11.
|
||||
@ -144,6 +148,35 @@ HRESULT LoadD3DX()
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT LoadD3DCompiler()
|
||||
{
|
||||
if (d3dcompiler_dll_ref++ > 0) return S_OK;
|
||||
if (hD3DCompilerDll) return S_OK;
|
||||
|
||||
// try to load D3DCompiler first to check whether we have proper runtime support
|
||||
// try to use the dll the backend was compiled against first - don't bother about debug runtimes
|
||||
hD3DCompilerDll = LoadLibraryA(D3DCOMPILER_DLL_A);
|
||||
if (!hD3DCompilerDll)
|
||||
{
|
||||
// if that fails, use the dll which should be available in every SDK which officially supports DX11.
|
||||
hD3DCompilerDll = LoadLibraryA("D3DCompiler_42.dll");
|
||||
if (!hD3DCompilerDll)
|
||||
{
|
||||
MessageBoxA(NULL, "Failed to load D3DCompiler_42.dll, update your DX11 runtime, please", "Critical error", MB_OK | MB_ICONERROR);
|
||||
return E_FAIL;
|
||||
}
|
||||
else
|
||||
{
|
||||
NOTICE_LOG(VIDEO, "Successfully loaded D3DCompiler_42.dll. If you're having trouble, try updating your DX runtime first.");
|
||||
}
|
||||
}
|
||||
|
||||
PD3DReflect = (D3DREFLECT)GetProcAddress(hD3DCompilerDll, "D3DReflect");
|
||||
if (PD3DReflect == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DReflect!", "Critical error", MB_OK | MB_ICONERROR);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
void UnloadDXGI()
|
||||
{
|
||||
if (!dxgi_dll_ref) return;
|
||||
@ -177,6 +210,16 @@ void UnloadD3D()
|
||||
PD3D11CreateDeviceAndSwapChain = NULL;
|
||||
}
|
||||
|
||||
void UnloadD3DCompiler()
|
||||
{
|
||||
if (!d3dcompiler_dll_ref) return;
|
||||
if (--d3dcompiler_dll_ref != 0) return;
|
||||
|
||||
if (hD3DCompilerDll) FreeLibrary(hD3DCompilerDll);
|
||||
hD3DCompilerDll = NULL;
|
||||
PD3DReflect = NULL;
|
||||
}
|
||||
|
||||
void EnumAAModes(IDXGIAdapter* adapter, std::vector<DXGI_SAMPLE_DESC>& aa_modes)
|
||||
{
|
||||
aa_modes.clear();
|
||||
@ -232,10 +275,13 @@ HRESULT Create(HWND wnd)
|
||||
hr = LoadDXGI();
|
||||
if (SUCCEEDED(hr)) hr = LoadD3D();
|
||||
if (SUCCEEDED(hr)) hr = LoadD3DX();
|
||||
if (SUCCEEDED(hr)) hr = LoadD3DCompiler();
|
||||
if (FAILED(hr))
|
||||
{
|
||||
UnloadDXGI();
|
||||
UnloadD3D();
|
||||
UnloadD3DX();
|
||||
UnloadD3DCompiler();
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user