diff --git a/src/d3d10/d3d10_device.cpp b/src/d3d10/d3d10_device.cpp index 15f08ef0..6da6e3df 100644 --- a/src/d3d10/d3d10_device.cpp +++ b/src/d3d10/d3d10_device.cpp @@ -256,8 +256,24 @@ namespace dxvk { const void* pShaderBytecodeWithInputSignature, SIZE_T BytecodeLength, ID3D10InputLayout** ppInputLayout) { - Logger::err("D3D10Device::CreateInputLayout: Not implemented"); - return E_NOTIMPL; + InitReturnPtr(ppInputLayout); + + static_assert(sizeof(D3D10_INPUT_ELEMENT_DESC) == + sizeof(D3D11_INPUT_ELEMENT_DESC)); + + ID3D11InputLayout* d3d11InputLayout = nullptr; + HRESULT hr = m_device->CreateInputLayout( + reinterpret_cast(pInputElementDescs), + NumElements, pShaderBytecodeWithInputSignature, BytecodeLength, + ppInputLayout ? &d3d11InputLayout : nullptr); + + if (FAILED(hr)) + return hr; + + if (ppInputLayout) { + *ppInputLayout = static_cast(d3d11InputLayout)->GetD3D10Iface(); + return S_OK; + } return S_FALSE; } diff --git a/src/d3d10/d3d10_input_layout.cpp b/src/d3d10/d3d10_input_layout.cpp new file mode 100644 index 00000000..c9e74de8 --- /dev/null +++ b/src/d3d10/d3d10_input_layout.cpp @@ -0,0 +1,53 @@ +#include "d3d10_input_layout.h" + +#include "../d3d11/d3d11_device.h" +#include "../d3d11/d3d11_input_layout.h" + +namespace dxvk { + + HRESULT STDMETHODCALLTYPE D3D10InputLayout::QueryInterface( + REFIID riid, + void** ppvObject) { + return m_d3d11->QueryInterface(riid, ppvObject); + } + + + ULONG STDMETHODCALLTYPE D3D10InputLayout::AddRef() { + return m_d3d11->AddRef(); + } + + + ULONG STDMETHODCALLTYPE D3D10InputLayout::Release() { + return m_d3d11->Release(); + } + + + void STDMETHODCALLTYPE D3D10InputLayout::GetDevice( + ID3D10Device** ppDevice) { + GetD3D10Device(m_d3d11, ppDevice); + } + + + HRESULT STDMETHODCALLTYPE D3D10InputLayout::GetPrivateData( + REFGUID guid, + UINT* pDataSize, + void* pData) { + return m_d3d11->GetPrivateData(guid, pDataSize, pData); + } + + + HRESULT STDMETHODCALLTYPE D3D10InputLayout::SetPrivateData( + REFGUID guid, + UINT DataSize, + const void* pData) { + return m_d3d11->SetPrivateData(guid, DataSize, pData); + } + + + HRESULT STDMETHODCALLTYPE D3D10InputLayout::SetPrivateDataInterface( + REFGUID guid, + const IUnknown* pData) { + return m_d3d11->SetPrivateDataInterface(guid, pData); + } + +} \ No newline at end of file diff --git a/src/d3d10/d3d10_input_layout.h b/src/d3d10/d3d10_input_layout.h new file mode 100644 index 00000000..73169227 --- /dev/null +++ b/src/d3d10/d3d10_input_layout.h @@ -0,0 +1,52 @@ +#pragma once + +#include "d3d10_util.h" + +namespace dxvk { + + class D3D11Device; + class D3D11InputLayout; + + class D3D10InputLayout : public ID3D10InputLayout { + + public: + + D3D10InputLayout(D3D11InputLayout* pParent) + : m_d3d11(pParent) { } + + HRESULT STDMETHODCALLTYPE QueryInterface( + REFIID riid, + void** ppvObject); + + ULONG STDMETHODCALLTYPE AddRef(); + + ULONG STDMETHODCALLTYPE Release(); + + void STDMETHODCALLTYPE GetDevice( + ID3D10Device** ppDevice); + + HRESULT STDMETHODCALLTYPE GetPrivateData( + REFGUID guid, + UINT* pDataSize, + void* pData); + + HRESULT STDMETHODCALLTYPE SetPrivateData( + REFGUID guid, + UINT DataSize, + const void* pData); + + HRESULT STDMETHODCALLTYPE SetPrivateDataInterface( + REFGUID guid, + const IUnknown* pData); + + D3D11InputLayout* GetD3D11Iface() { + return m_d3d11; + } + + private: + + D3D11InputLayout* m_d3d11; + + }; + +} \ No newline at end of file diff --git a/src/d3d11/d3d11_input_layout.cpp b/src/d3d11/d3d11_input_layout.cpp index 2e4e794f..b714b1a8 100644 --- a/src/d3d11/d3d11_input_layout.cpp +++ b/src/d3d11/d3d11_input_layout.cpp @@ -9,7 +9,7 @@ namespace dxvk { const DxvkVertexAttribute* pAttributes, uint32_t numBindings, const DxvkVertexBinding* pBindings) - : m_device(pDevice) { + : m_device(pDevice), m_d3d10(this) { m_attributes.resize(numAttributes); m_bindings.resize(numBindings); @@ -36,6 +36,12 @@ namespace dxvk { return S_OK; } + if (riid == __uuidof(ID3D10DeviceChild) + || riid == __uuidof(ID3D10InputLayout)) { + *ppvObject = ref(&m_d3d10); + return S_OK; + } + Logger::warn("D3D11InputLayout::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); return E_NOINTERFACE; diff --git a/src/d3d11/d3d11_input_layout.h b/src/d3d11/d3d11_input_layout.h index e3d33d1d..a0bd1deb 100644 --- a/src/d3d11/d3d11_input_layout.h +++ b/src/d3d11/d3d11_input_layout.h @@ -2,6 +2,8 @@ #include "d3d11_device_child.h" +#include "../d3d10/d3d10_input_layout.h" + namespace dxvk { class D3D11Device; @@ -32,12 +34,18 @@ namespace dxvk { bool Compare( const D3D11InputLayout* pOther) const; + D3D10InputLayout* GetD3D10Iface() { + return &m_d3d10; + } + private: Com m_device; std::vector m_attributes; std::vector m_bindings; + + D3D10InputLayout m_d3d10; }; diff --git a/src/d3d11/meson.build b/src/d3d11/meson.build index 8e876cf0..0c8800c0 100644 --- a/src/d3d11/meson.build +++ b/src/d3d11/meson.build @@ -1,6 +1,7 @@ d3d10_src = [ '../d3d10/d3d10_buffer.cpp', '../d3d10/d3d10_device.cpp', + '../d3d10/d3d10_input_layout.cpp', '../d3d10/d3d10_sampler.cpp', '../d3d10/d3d10_texture.cpp', '../d3d10/d3d10_util.cpp',