summaryrefslogtreecommitdiffstats
path: root/src/libs/dxvk-native-1.9.2a/src/d3d10/d3d10_main.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/libs/dxvk-native-1.9.2a/src/d3d10/d3d10_main.cpp335
1 files changed, 335 insertions, 0 deletions
diff --git a/src/libs/dxvk-native-1.9.2a/src/d3d10/d3d10_main.cpp b/src/libs/dxvk-native-1.9.2a/src/d3d10/d3d10_main.cpp
new file mode 100644
index 00000000..7bec4d0b
--- /dev/null
+++ b/src/libs/dxvk-native-1.9.2a/src/d3d10/d3d10_main.cpp
@@ -0,0 +1,335 @@
+#include <d3dcompiler.h>
+
+#include "d3d10_include.h"
+#include "d3d10_reflection.h"
+
+#include "../dxgi/dxgi_adapter.h"
+
+namespace dxvk {
+ Logger Logger::s_instance("d3d10.log");
+}
+
+extern "C" {
+ using namespace dxvk;
+
+ HRESULT __stdcall D3D10CoreCreateDevice(
+ IDXGIFactory* pFactory,
+ IDXGIAdapter* pAdapter,
+ UINT Flags,
+ D3D_FEATURE_LEVEL FeatureLevel,
+ ID3D10Device** ppDevice);
+
+ static HRESULT D3D10InternalCreateDeviceAndSwapChain(
+ IDXGIAdapter* pAdapter,
+ D3D10_DRIVER_TYPE DriverType,
+ HMODULE Software,
+ UINT Flags,
+ D3D10_FEATURE_LEVEL1 HardwareLevel,
+ UINT SDKVersion,
+ DXGI_SWAP_CHAIN_DESC* pSwapChainDesc,
+ IDXGISwapChain** ppSwapChain,
+ REFIID deviceIID,
+ void** ppDevice) {
+ InitReturnPtr(ppDevice);
+ InitReturnPtr(ppSwapChain);
+
+ if (ppSwapChain && !pSwapChainDesc)
+ return E_INVALIDARG;
+
+ HRESULT hr;
+
+ // Get DXGI factory and adapter. This is mostly
+ // copied from the equivalent D3D11 functions.
+ Com<IDXGIFactory> dxgiFactory = nullptr;
+ Com<IDXGIAdapter> dxgiAdapter = pAdapter;
+ Com<ID3D10Device> device = nullptr;
+
+ if (!pAdapter) {
+ if (DriverType != D3D10_DRIVER_TYPE_HARDWARE)
+ Logger::warn("D3D10CreateDevice: Unsupported driver type");
+
+ hr = CreateDXGIFactory(__uuidof(IDXGIFactory), reinterpret_cast<void**>(&dxgiFactory));
+
+ if (FAILED(hr)) {
+ Logger::err("D3D10CreateDevice: Failed to create a DXGI factory");
+ return hr;
+ }
+
+ hr = dxgiFactory->EnumAdapters(0, &dxgiAdapter);
+
+ if (FAILED(hr)) {
+ Logger::err("D3D10CreateDevice: No default adapter available");
+ return hr;
+ }
+ } else {
+ if (FAILED(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), reinterpret_cast<void**>(&dxgiFactory)))) {
+ Logger::err("D3D10CreateDevice: Failed to query DXGI factory from DXGI adapter");
+ return E_INVALIDARG;
+ }
+
+ if (DriverType != D3D10_DRIVER_TYPE_HARDWARE || Software)
+ return E_INVALIDARG;
+ }
+
+ hr = D3D10CoreCreateDevice(
+ dxgiFactory.ptr(), dxgiAdapter.ptr(),
+ Flags, D3D_FEATURE_LEVEL(HardwareLevel),
+ &device);
+
+ if (FAILED(hr))
+ return hr;
+
+ if (ppSwapChain) {
+ DXGI_SWAP_CHAIN_DESC desc = *pSwapChainDesc;
+ hr = dxgiFactory->CreateSwapChain(device.ptr(), &desc, ppSwapChain);
+
+ if (FAILED(hr)) {
+ Logger::err("D3D10CreateDevice: Failed to create swap chain");
+ return hr;
+ }
+ }
+
+ if (ppDevice) {
+ // Just assume that this succeeds
+ device->QueryInterface(deviceIID, ppDevice);
+ }
+
+ if (!ppDevice && !ppSwapChain)
+ return S_FALSE;
+
+ return S_OK;
+ }
+
+
+ DLLEXPORT HRESULT __stdcall D3D10CreateDevice(
+ IDXGIAdapter* pAdapter,
+ D3D10_DRIVER_TYPE DriverType,
+ HMODULE Software,
+ UINT Flags,
+ UINT SDKVersion,
+ ID3D10Device** ppDevice) {
+ return D3D10InternalCreateDeviceAndSwapChain(
+ pAdapter, DriverType, Software, Flags,
+ D3D10_FEATURE_LEVEL_10_0, SDKVersion,
+ nullptr, nullptr,
+ __uuidof(ID3D10Device),
+ reinterpret_cast<void**>(ppDevice));
+ }
+
+
+ DLLEXPORT HRESULT __stdcall D3D10CreateDevice1(
+ IDXGIAdapter* pAdapter,
+ D3D10_DRIVER_TYPE DriverType,
+ HMODULE Software,
+ UINT Flags,
+ D3D10_FEATURE_LEVEL1 HardwareLevel,
+ UINT SDKVersion,
+ ID3D10Device1** ppDevice) {
+ return D3D10InternalCreateDeviceAndSwapChain(
+ pAdapter, DriverType, Software, Flags,
+ HardwareLevel, SDKVersion,
+ nullptr, nullptr,
+ __uuidof(ID3D10Device1),
+ reinterpret_cast<void**>(ppDevice));
+ }
+
+
+ DLLEXPORT HRESULT __stdcall D3D10CreateDeviceAndSwapChain(
+ IDXGIAdapter* pAdapter,
+ D3D10_DRIVER_TYPE DriverType,
+ HMODULE Software,
+ UINT Flags,
+ UINT SDKVersion,
+ DXGI_SWAP_CHAIN_DESC* pSwapChainDesc,
+ IDXGISwapChain** ppSwapChain,
+ ID3D10Device** ppDevice) {
+ return D3D10InternalCreateDeviceAndSwapChain(
+ pAdapter, DriverType, Software, Flags,
+ D3D10_FEATURE_LEVEL_10_0, SDKVersion,
+ pSwapChainDesc, ppSwapChain,
+ __uuidof(ID3D10Device),
+ reinterpret_cast<void**>(ppDevice));
+ }
+
+
+ DLLEXPORT HRESULT __stdcall 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) {
+ return D3D10InternalCreateDeviceAndSwapChain(
+ pAdapter, DriverType, Software, Flags,
+ HardwareLevel, SDKVersion,
+ pSwapChainDesc, ppSwapChain,
+ __uuidof(ID3D10Device1),
+ reinterpret_cast<void**>(ppDevice));
+ }
+
+
+ const char* STDMETHODCALLTYPE D3D10GetVertexShaderProfile (ID3D10Device*) { return "vs_4_1"; }
+ const char* STDMETHODCALLTYPE D3D10GetGeometryShaderProfile (ID3D10Device*) { return "gs_4_1"; }
+ const char* STDMETHODCALLTYPE D3D10GetPixelShaderProfile (ID3D10Device*) { return "ps_4_1"; }
+
+
+ HRESULT STDMETHODCALLTYPE D3D10CreateBlob(SIZE_T size, LPD3D10BLOB* ppBuffer) {
+ return D3DCreateBlob(size, ppBuffer);
+ }
+
+
+ HRESULT STDMETHODCALLTYPE D3D10GetInputSignatureBlob(
+ const void* pShaderBytecode,
+ SIZE_T BytecodeLength,
+ ID3D10Blob** ppSignatureBlob) {
+ return D3DGetInputSignatureBlob(
+ pShaderBytecode,
+ BytecodeLength,
+ ppSignatureBlob);
+ }
+
+
+ HRESULT STDMETHODCALLTYPE D3D10GetOutputSignatureBlob(
+ const void* pShaderBytecode,
+ SIZE_T BytecodeLength,
+ ID3D10Blob** ppSignatureBlob) {
+ return D3DGetOutputSignatureBlob(
+ pShaderBytecode,
+ BytecodeLength,
+ ppSignatureBlob);
+ }
+
+
+ HRESULT STDMETHODCALLTYPE D3D10ReflectShader(
+ const void* pShaderBytecode,
+ SIZE_T BytecodeLength,
+ ID3D10ShaderReflection** ppReflector) {
+ static const GUID IID_ID3D11ShaderReflection =
+ {0x0a233719,0x3960,0x4578,{0x9d,0x7c,0x20,0x3b,0x8b,0x1d,0x9c,0xc1}};
+
+ InitReturnPtr(ppReflector);
+
+ Com<ID3D11ShaderReflection> d3d11Reflector = nullptr;
+
+ HRESULT hr = D3DReflect(pShaderBytecode,
+ BytecodeLength, IID_ID3D11ShaderReflection,
+ reinterpret_cast<void**>(&d3d11Reflector));
+
+ if (FAILED(hr)) {
+ Logger::err("D3D10ReflectShader: Failed to create ID3D11ShaderReflection");
+ return hr;
+ }
+
+ *ppReflector = ref(new D3D10ShaderReflection(d3d11Reflector.ptr()));
+ return S_OK;
+ }
+
+
+ HRESULT STDMETHODCALLTYPE D3D10CompileShader(
+ LPCSTR pSrcData,
+ SIZE_T SrcDataSize,
+ LPCSTR pFileName,
+ const D3D10_SHADER_MACRO* pDefines,
+ LPD3D10INCLUDE pInclude,
+ LPCSTR pFunctionName,
+ LPCSTR pProfile,
+ UINT Flags,
+ ID3D10Blob** ppShader,
+ ID3D10Blob** ppErrorMsgs) {
+ return D3DCompile(pSrcData, SrcDataSize, pFileName,
+ pDefines, pInclude, pFunctionName, pProfile, Flags,
+ 0, ppShader, ppErrorMsgs);
+ }
+
+
+ HRESULT STDMETHODCALLTYPE D3D10CreateEffectFromMemory(
+ void* pData,
+ SIZE_T DataSize,
+ UINT EffectFlags,
+ ID3D10Device* pDevice,
+ ID3D10EffectPool* pEffectPool,
+ ID3D10Effect** ppEffect) {
+ Logger::warn("D3D10CreateEffectFromMemory: Not implemented");
+ return E_NOTIMPL;
+ }
+
+
+ HRESULT STDMETHODCALLTYPE D3D10CreateEffectPoolFromMemory(
+ void* pData,
+ SIZE_T DataSize,
+ UINT EffectFlags,
+ ID3D10Device* pDevice,
+ ID3D10EffectPool** ppEffectPool) {
+ Logger::warn("D3D10CreateEffectPoolFromMemory: Not implemented");
+ return E_NOTIMPL;
+ }
+
+
+ HRESULT STDMETHODCALLTYPE D3D10CompileEffectFromMemory(
+ void* pData,
+ SIZE_T DataLength,
+ LPCSTR pSrcFileName,
+ const D3D10_SHADER_MACRO* pDefines,
+ ID3D10Include* pInclude,
+ UINT ShaderFlags,
+ UINT EffectFlags,
+ ID3D10Blob** ppCompiledEffect,
+ ID3D10Blob** ppErrors) {
+ Logger::warn("D3D10CompileEffectFromMemory: Not implemented");
+ return E_NOTIMPL;
+ }
+
+
+ HRESULT STDMETHODCALLTYPE D3D10DisassembleEffect(
+ ID3D10Effect* pEffect,
+ BOOL EnableColorCode,
+ ID3D10Blob** ppDisassembly) {
+ Logger::warn("D3D10DisassembleEffect: Not implemented");
+ return E_NOTIMPL;
+ }
+
+
+ HRESULT STDMETHODCALLTYPE D3D10DisassembleShader(
+ const void* pShader,
+ SIZE_T BytecodeLength,
+ BOOL EnableColorCode,
+ LPCSTR pComments,
+ ID3D10Blob** ppDisassembly) {
+ return D3DDisassemble(
+ pShader, BytecodeLength,
+ 0, pComments, ppDisassembly);
+ }
+
+
+ HRESULT STDMETHODCALLTYPE D3D10PreprocessShader(
+ LPCSTR pSrcData,
+ SIZE_T SrcDataSize,
+ LPCSTR pFileName,
+ const D3D10_SHADER_MACRO* pDefines,
+ LPD3D10INCLUDE pInclude,
+ ID3D10Blob** ppShaderText,
+ ID3D10Blob** ppErrorMsgs) {
+ return D3DPreprocess(
+ pSrcData, SrcDataSize,
+ pFileName, pDefines,
+ pInclude,
+ ppShaderText,
+ ppErrorMsgs);
+ }
+
+
+ UINT64 STDMETHODCALLTYPE D3D10GetVersion() {
+ return 0xa000100041770ull;
+ }
+
+
+ HRESULT STDMETHODCALLTYPE D3D10RegisterLayers() {
+ return E_NOTIMPL;
+ }
+
+}
+
+