[d3d10] Add build files and implement D3D10CreateDevice functions

This commit is contained in:
Philip Rebohle 2018-08-11 16:35:38 +02:00
parent 262797f9d5
commit 8c1063b512
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
14 changed files with 349 additions and 0 deletions

17
lib/libd3dcompiler_43.def Normal file
View File

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

View File

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

View File

@ -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 = ''

4
src/d3d10/d3d10.def Normal file
View File

@ -0,0 +1,4 @@
LIBRARY D3D10.DLL
EXPORTS
D3D10CreateDevice
D3D10CreateDeviceAndSwapChain

21
src/d3d10/d3d10.spec Normal file
View File

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

4
src/d3d10/d3d10_1.def Normal file
View File

@ -0,0 +1,4 @@
LIBRARY D3D10_1.DLL
EXPORTS
D3D10CreateDevice1
D3D10CreateDeviceAndSwapChain1

21
src/d3d10/d3d10_1.spec Normal file
View File

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

View File

@ -0,0 +1,4 @@
#pragma once
#include <d3d10_1.h>
#include <d3d11_1.h>

216
src/d3d10/d3d10_main.cpp Normal file
View File

@ -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<ID3D11Device> d3d11Device;
HRESULT hr = D3D11CoreCreateDevice(pFactory,
pAdapter, Flags, &FeatureLevel, 1, &d3d11Device);
if (FAILED(hr))
return hr;
if (FAILED(d3d11Device->QueryInterface(
__uuidof(ID3D10Device), reinterpret_cast<void**>(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<IDXGIFactory> dxgiFactory = nullptr;
Com<IDXGIAdapter> dxgiAdapter = pAdapter;
if (dxgiAdapter == nullptr) {
if (DriverType != D3D10_DRIVER_TYPE_HARDWARE)
Logger::warn("D3D10CreateDevice: Unsupported driver type");
if (FAILED(CreateDXGIFactory(__uuidof(IDXGIFactory), reinterpret_cast<void**>(&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<void**>(&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<ID3D10Device> 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<void**>(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<ID3D10Device1> 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<ID3D10Device1> 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<IDXGIDevice> dxgiDevice = nullptr;
Com<IDXGIAdapter> dxgiAdapter = nullptr;
Com<IDXGIFactory> dxgiFactory = nullptr;
if (FAILED(d3d10Device->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast<void**>(&dxgiDevice)))) {
Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI device");
return E_FAIL;
}
if (FAILED(dxgiDevice->GetParent(__uuidof(IDXGIAdapter), reinterpret_cast<void**>(&dxgiAdapter)))) {
Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI adapter");
return E_FAIL;
}
if (FAILED(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), reinterpret_cast<void**>(&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<ID3D10Device1> 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;
}
}

3
src/d3d10/d3d10core.def Normal file
View File

@ -0,0 +1,3 @@
LIBRARY D3D10CORE.DLL
EXPORTS
D3D10CoreCreateDevice

1
src/d3d10/d3d10core.spec Normal file
View File

@ -0,0 +1 @@
@ stdcall D3D10CoreCreateDevice(ptr ptr long long ptr)

37
src/d3d10/meson.build Normal file
View File

@ -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('.') ])

View File

@ -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)

View File

@ -4,3 +4,4 @@ subdir('dxvk')
subdir('dxgi')
subdir('dxbc')
subdir('d3d11')
subdir('d3d10')