From 8c1063b51228717bb63e758f9f4bb325a99d1194 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 11 Aug 2018 16:35:38 +0200 Subject: [PATCH] [d3d10] Add build files and implement D3D10CreateDevice functions --- lib/libd3dcompiler_43.def | 17 +++ lib32/libd3dcompiler_43.def | 17 +++ meson.build | 2 + src/d3d10/d3d10.def | 4 + src/d3d10/d3d10.spec | 21 ++++ src/d3d10/d3d10_1.def | 4 + src/d3d10/d3d10_1.spec | 21 ++++ src/d3d10/d3d10_include.h | 4 + src/d3d10/d3d10_main.cpp | 216 ++++++++++++++++++++++++++++++++++++ src/d3d10/d3d10core.def | 3 + src/d3d10/d3d10core.spec | 1 + src/d3d10/meson.build | 37 ++++++ src/d3d11/d3d11.spec | 1 + src/meson.build | 1 + 14 files changed, 349 insertions(+) create mode 100644 lib/libd3dcompiler_43.def create mode 100644 lib32/libd3dcompiler_43.def create mode 100644 src/d3d10/d3d10.def create mode 100644 src/d3d10/d3d10.spec create mode 100644 src/d3d10/d3d10_1.def create mode 100644 src/d3d10/d3d10_1.spec create mode 100644 src/d3d10/d3d10_include.h create mode 100644 src/d3d10/d3d10_main.cpp create mode 100644 src/d3d10/d3d10core.def create mode 100644 src/d3d10/d3d10core.spec create mode 100644 src/d3d10/meson.build diff --git a/lib/libd3dcompiler_43.def b/lib/libd3dcompiler_43.def new file mode 100644 index 000000000..344fbe0df --- /dev/null +++ b/lib/libd3dcompiler_43.def @@ -0,0 +1,17 @@ +; File generated automatically from d3dcompiler_43.spec; do not edit! + +LIBRARY d3dcompiler_43.dll + +EXPORTS + D3DAssemble @1 + D3DCompile @3 + D3DCreateBlob @5 + D3DDisassemble @8 + D3DGetBlobPart @9 + D3DGetDebugInfo @10 + D3DGetInputAndOutputSignatureBlob @11 + D3DGetInputSignatureBlob @12 + D3DGetOutputSignatureBlob @13 + D3DPreprocess @14 + D3DReflect @15 + D3DStripShader @17 diff --git a/lib32/libd3dcompiler_43.def b/lib32/libd3dcompiler_43.def new file mode 100644 index 000000000..22d78e632 --- /dev/null +++ b/lib32/libd3dcompiler_43.def @@ -0,0 +1,17 @@ +; File generated automatically from d3dcompiler_43.spec; do not edit! + +LIBRARY d3dcompiler_43.dll + +EXPORTS + D3DAssemble@32 @1 + D3DCompile@44 @3 + D3DCreateBlob@8 @5 + D3DDisassemble@20 @8 + D3DGetBlobPart@20 @9 + D3DGetDebugInfo@12 @10 + D3DGetInputAndOutputSignatureBlob@12 @11 + D3DGetInputSignatureBlob@12 @12 + D3DGetOutputSignatureBlob@12 @13 + D3DPreprocess@28 @14 + D3DReflect@16 @15 + D3DStripShader@16 @17 diff --git a/meson.build b/meson.build index a7af3dc29..df5cacf8b 100644 --- a/meson.build +++ b/meson.build @@ -29,6 +29,7 @@ if meson.get_cross_property('winelib', false) lib_vulkan = declare_dependency(link_args: [ '-lvulkan-1' ]) lib_d3d11 = declare_dependency(link_args: [ '-ld3d11' ]) lib_dxgi = declare_dependency(link_args: [ '-ldxgi' ]) + lib_d3dcompiler_43 = declare_dependency(link_args: [ '-L'+dxvk_library_path, '-ld3dcompiler_43' ]) lib_d3dcompiler_47 = declare_dependency(link_args: [ '-ld3dcompiler_47' ]) exe_ext = '.exe.so' dll_ext = '.dll' @@ -38,6 +39,7 @@ else lib_d3d11 = dxvk_compiler.find_library('d3d11') lib_dxgi = dxvk_compiler.find_library('dxgi') if dxvk_compiler.get_id() != 'msvc' + lib_d3dcompiler_43 = dxvk_compiler.find_library('d3dcompiler_43') lib_d3dcompiler_47 = dxvk_compiler.find_library('d3dcompiler_47') endif exe_ext = '' diff --git a/src/d3d10/d3d10.def b/src/d3d10/d3d10.def new file mode 100644 index 000000000..de081a331 --- /dev/null +++ b/src/d3d10/d3d10.def @@ -0,0 +1,4 @@ +LIBRARY D3D10.DLL +EXPORTS + D3D10CreateDevice + D3D10CreateDeviceAndSwapChain diff --git a/src/d3d10/d3d10.spec b/src/d3d10/d3d10.spec new file mode 100644 index 000000000..efd145e13 --- /dev/null +++ b/src/d3d10/d3d10.spec @@ -0,0 +1,21 @@ +@ stdcall D3D10CreateDevice(ptr long ptr long long ptr) +@ stdcall D3D10CreateDeviceAndSwapChain(ptr long ptr long long ptr ptr ptr) + +@ stdcall D3D10GetVertexShaderProfile(ptr) +@ stdcall D3D10GetGeometryShaderProfile(ptr) +@ stdcall D3D10GetPixelShaderProfile(ptr) + +@ stdcall D3D10CreateBlob(long ptr) +@ stdcall D3D10GetInputSignatureBlob(ptr long ptr) +@ stdcall D3D10GetOutputSignatureBlob(ptr long ptr) + +@ stdcall D3D10ReflectShader(ptr long ptr) +@ stdcall D3D10CompileShader(ptr long str ptr ptr str str long ptr ptr) + +@ stdcall D3D10CreateEffectFromMemory(ptr long long ptr ptr ptr) +@ stdcall D3D10CreateEffectPoolFromMemory(ptr long long ptr ptr) +@ stdcall D3D10CompileEffectFromMemory(ptr long ptr ptr ptr long long ptr ptr) + +@ stub D3D10DisassembleEffect +@ stdcall D3D10DisassembleShader(ptr long long ptr ptr) +@ stub D3D10PreprocessShader diff --git a/src/d3d10/d3d10_1.def b/src/d3d10/d3d10_1.def new file mode 100644 index 000000000..fff76a7fd --- /dev/null +++ b/src/d3d10/d3d10_1.def @@ -0,0 +1,4 @@ +LIBRARY D3D10_1.DLL +EXPORTS + D3D10CreateDevice1 + D3D10CreateDeviceAndSwapChain1 diff --git a/src/d3d10/d3d10_1.spec b/src/d3d10/d3d10_1.spec new file mode 100644 index 000000000..bb183fd32 --- /dev/null +++ b/src/d3d10/d3d10_1.spec @@ -0,0 +1,21 @@ +@ stdcall D3D10CreateDevice1(ptr long ptr long long long ptr) +@ stdcall D3D10CreateDeviceAndSwapChain1(ptr long ptr long long long ptr ptr ptr) + +@ stdcall D3D10GetVertexShaderProfile(ptr) +@ stdcall D3D10GetGeometryShaderProfile(ptr) +@ stdcall D3D10GetPixelShaderProfile(ptr) + +@ stdcall D3D10CreateBlob(long ptr) +@ stdcall D3D10GetInputSignatureBlob(ptr long ptr) +@ stdcall D3D10GetOutputSignatureBlob(ptr long ptr) + +@ stdcall D3D10ReflectShader(ptr long ptr) +@ stdcall D3D10CompileShader(ptr long str ptr ptr str str long ptr ptr) + +@ stdcall D3D10CreateEffectFromMemory(ptr long long ptr ptr ptr) +@ stdcall D3D10CreateEffectPoolFromMemory(ptr long long ptr ptr) +@ stdcall D3D10CompileEffectFromMemory(ptr long ptr ptr ptr long long ptr ptr) + +@ stub D3D10DisassembleEffect +@ stdcall D3D10DisassembleShader(ptr long long ptr ptr) +@ stub D3D10PreprocessShader diff --git a/src/d3d10/d3d10_include.h b/src/d3d10/d3d10_include.h new file mode 100644 index 000000000..cb2ea847e --- /dev/null +++ b/src/d3d10/d3d10_include.h @@ -0,0 +1,4 @@ +#pragma once + +#include +#include \ No newline at end of file diff --git a/src/d3d10/d3d10_main.cpp b/src/d3d10/d3d10_main.cpp new file mode 100644 index 000000000..d33b23c86 --- /dev/null +++ b/src/d3d10/d3d10_main.cpp @@ -0,0 +1,216 @@ +#include "d3d10_include.h" + +#include "../dxgi/dxgi_adapter.h" +#include "../dxgi/dxgi_device.h" + +namespace dxvk { + Logger Logger::s_instance("d3d10.log"); +} + +extern "C" { + using namespace dxvk; + + HRESULT __stdcall D3D11CoreCreateDevice( + IDXGIFactory* pFactory, + IDXGIAdapter* pAdapter, + UINT Flags, + const D3D_FEATURE_LEVEL* pFeatureLevels, + UINT FeatureLevels, + ID3D11Device** ppDevice); + + + DLLEXPORT HRESULT __stdcall D3D10CoreCreateDevice( + IDXGIFactory* pFactory, + IDXGIAdapter* pAdapter, + UINT Flags, + D3D_FEATURE_LEVEL FeatureLevel, + ID3D10Device** ppDevice) { + Com d3d11Device; + + HRESULT hr = D3D11CoreCreateDevice(pFactory, + pAdapter, Flags, &FeatureLevel, 1, &d3d11Device); + + if (FAILED(hr)) + return hr; + + if (FAILED(d3d11Device->QueryInterface( + __uuidof(ID3D10Device), reinterpret_cast(ppDevice)))) + return E_FAIL; + + return S_OK; + } + + + DLLEXPORT HRESULT D3D10CreateDevice1( + IDXGIAdapter* pAdapter, + D3D10_DRIVER_TYPE DriverType, + HMODULE Software, + UINT Flags, + D3D10_FEATURE_LEVEL1 HardwareLevel, + UINT SDKVersion, + ID3D10Device1** ppDevice) { + InitReturnPtr(ppDevice); + + // Get DXGI factory and adapter. This is mostly + // copied from the equivalent D3D11 functions. + Com dxgiFactory = nullptr; + Com dxgiAdapter = pAdapter; + + if (dxgiAdapter == nullptr) { + if (DriverType != D3D10_DRIVER_TYPE_HARDWARE) + Logger::warn("D3D10CreateDevice: Unsupported driver type"); + + if (FAILED(CreateDXGIFactory(__uuidof(IDXGIFactory), reinterpret_cast(&dxgiFactory)))) { + Logger::err("D3D10CreateDevice: Failed to create a DXGI factory"); + return E_FAIL; + } + + if (FAILED(dxgiFactory->EnumAdapters(0, &dxgiAdapter))) { + Logger::err("D3D10CreateDevice: No default adapter available"); + return E_FAIL; + } + + } else { + if (FAILED(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), reinterpret_cast(&dxgiFactory)))) { + Logger::err("D3D10CreateDevice: Failed to query DXGI factory from DXGI adapter"); + return E_FAIL; + } + + if (DriverType != D3D10_DRIVER_TYPE_HARDWARE || Software != nullptr) + return E_INVALIDARG; + } + + // Create the actual device + Com device; + + HRESULT hr = D3D10CoreCreateDevice( + dxgiFactory.ptr(), dxgiAdapter.ptr(), + Flags, D3D_FEATURE_LEVEL(HardwareLevel), + &device); + + if (FAILED(hr)) + return hr; + + hr = device->QueryInterface( + __uuidof(ID3D10Device1), + reinterpret_cast(ppDevice)); + + if (FAILED(hr)) + return E_FAIL; + + return hr; + } + + + DLLEXPORT HRESULT D3D10CreateDevice( + IDXGIAdapter* pAdapter, + D3D10_DRIVER_TYPE DriverType, + HMODULE Software, + UINT Flags, + UINT SDKVersion, + ID3D10Device** ppDevice) { + InitReturnPtr(ppDevice); + + Com d3d10Device = nullptr; + HRESULT hr = D3D10CreateDevice1(pAdapter, + DriverType, Software, Flags, + D3D10_FEATURE_LEVEL_10_0, + SDKVersion, &d3d10Device); + + if (FAILED(hr)) + return hr; + + if (ppDevice != nullptr) { + *ppDevice = d3d10Device.ref(); + return S_OK; + } return S_FALSE; + } + + + DLLEXPORT HRESULT D3D10CreateDeviceAndSwapChain1( + IDXGIAdapter* pAdapter, + D3D10_DRIVER_TYPE DriverType, + HMODULE Software, + UINT Flags, + D3D10_FEATURE_LEVEL1 HardwareLevel, + UINT SDKVersion, + DXGI_SWAP_CHAIN_DESC* pSwapChainDesc, + IDXGISwapChain** ppSwapChain, + ID3D10Device1** ppDevice) { + InitReturnPtr(ppDevice); + InitReturnPtr(ppSwapChain); + + // Try to create the device as usual + Com d3d10Device = nullptr; + HRESULT hr = D3D10CreateDevice1(pAdapter, + DriverType, Software, Flags, HardwareLevel, + SDKVersion, &d3d10Device); + + if (FAILED(hr)) + return hr; + + // Create the swap chain if requested + if (pSwapChainDesc == nullptr) + return E_INVALIDARG; + + Com dxgiDevice = nullptr; + Com dxgiAdapter = nullptr; + Com dxgiFactory = nullptr; + + if (FAILED(d3d10Device->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast(&dxgiDevice)))) { + Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI device"); + return E_FAIL; + } + + if (FAILED(dxgiDevice->GetParent(__uuidof(IDXGIAdapter), reinterpret_cast(&dxgiAdapter)))) { + Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI adapter"); + return E_FAIL; + } + + if (FAILED(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), reinterpret_cast(&dxgiFactory)))) { + Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI factory"); + return E_FAIL; + } + + if (FAILED(dxgiFactory->CreateSwapChain(d3d10Device.ptr(), pSwapChainDesc, ppSwapChain))) { + Logger::err("D3D11CreateDeviceAndSwapChain: Failed to create swap chain"); + return E_FAIL; + } + + // Write back device pointer + if (ppDevice != nullptr) { + *ppDevice = d3d10Device.ptr(); + return S_OK; + } return S_FALSE; + } + + + DLLEXPORT HRESULT D3D10CreateDeviceAndSwapChain( + IDXGIAdapter* pAdapter, + D3D10_DRIVER_TYPE DriverType, + HMODULE Software, + UINT Flags, + UINT SDKVersion, + DXGI_SWAP_CHAIN_DESC* pSwapChainDesc, + IDXGISwapChain** ppSwapChain, + ID3D10Device** ppDevice) { + InitReturnPtr(ppDevice); + InitReturnPtr(ppSwapChain); + + Com d3d10Device = nullptr; + HRESULT hr = D3D10CreateDeviceAndSwapChain1(pAdapter, + DriverType, Software, Flags, D3D10_FEATURE_LEVEL_10_0, + SDKVersion, pSwapChainDesc, ppSwapChain, &d3d10Device); + + if (FAILED(hr)) + return hr; + + if (ppDevice != nullptr) { + *ppDevice = d3d10Device.ref(); + return S_OK; + } return S_FALSE; + } + +} + + diff --git a/src/d3d10/d3d10core.def b/src/d3d10/d3d10core.def new file mode 100644 index 000000000..00a01e38b --- /dev/null +++ b/src/d3d10/d3d10core.def @@ -0,0 +1,3 @@ +LIBRARY D3D10CORE.DLL +EXPORTS + D3D10CoreCreateDevice diff --git a/src/d3d10/d3d10core.spec b/src/d3d10/d3d10core.spec new file mode 100644 index 000000000..f18297d13 --- /dev/null +++ b/src/d3d10/d3d10core.spec @@ -0,0 +1 @@ +@ stdcall D3D10CoreCreateDevice(ptr ptr long long ptr) diff --git a/src/d3d10/meson.build b/src/d3d10/meson.build new file mode 100644 index 000000000..29b6f432c --- /dev/null +++ b/src/d3d10/meson.build @@ -0,0 +1,37 @@ +d3d10_main_src = [ + 'd3d10_main.cpp' +] + +d3d10_core_dll = shared_library('d3d10core'+dll_ext, d3d10_main_src, + name_prefix : '', + link_with : [ util_lib ], + dependencies : [ lib_d3dcompiler_43, lib_dxgi, d3d11_dep, dxbc_dep, dxvk_dep ], + include_directories : dxvk_include_path, + install : true, + objects : not dxvk_msvc ? 'd3d10core'+def_spec_ext : [], + vs_module_defs : 'd3d10core'+def_spec_ext, + override_options : ['cpp_std='+dxvk_cpp_std]) + +d3d10_dll = shared_library('d3d10'+dll_ext, d3d10_main_src, + name_prefix : '', + link_with : [ util_lib ], + dependencies : [ lib_d3dcompiler_43, lib_dxgi, d3d11_dep, dxbc_dep, dxvk_dep ], + include_directories : dxvk_include_path, + install : true, + objects : not dxvk_msvc ? 'd3d10'+def_spec_ext : [], + vs_module_defs : 'd3d10'+def_spec_ext, + override_options : ['cpp_std='+dxvk_cpp_std]) + +d3d10_1_dll = shared_library('d3d10_1'+dll_ext, d3d10_main_src, + name_prefix : '', + link_with : [ util_lib ], + dependencies : [ lib_d3dcompiler_43, lib_dxgi, d3d11_dep, dxbc_dep, dxvk_dep ], + include_directories : dxvk_include_path, + install : true, + objects : not dxvk_msvc ? 'd3d10_1'+def_spec_ext : [], + vs_module_defs : 'd3d10_1'+def_spec_ext, + override_options : ['cpp_std='+dxvk_cpp_std]) + +d3d10_dep = declare_dependency( + link_with : [ d3d10_dll, d3d10_1_dll, d3d10_core_dll ], + include_directories : [ dxvk_include_path, include_directories('.') ]) diff --git a/src/d3d11/d3d11.spec b/src/d3d11/d3d11.spec index 304e404fe..a54278f7c 100644 --- a/src/d3d11/d3d11.spec +++ b/src/d3d11/d3d11.spec @@ -1,2 +1,3 @@ @ stdcall D3D11CreateDevice(ptr long ptr long ptr long long ptr ptr ptr) @ stdcall D3D11CreateDeviceAndSwapChain(ptr long ptr long ptr long long ptr ptr ptr ptr ptr) +@ stdcall D3D11CoreCreateDevice(ptr ptr long ptr long ptr) diff --git a/src/meson.build b/src/meson.build index 046452660..9da878834 100644 --- a/src/meson.build +++ b/src/meson.build @@ -4,3 +4,4 @@ subdir('dxvk') subdir('dxgi') subdir('dxbc') subdir('d3d11') +subdir('d3d10')