diff --git a/src/d3d10/d3d10_device.cpp b/src/d3d10/d3d10_device.cpp index b83ef3dce..0fe3bc903 100644 --- a/src/d3d10/d3d10_device.cpp +++ b/src/d3d10/d3d10_device.cpp @@ -393,8 +393,20 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D10Device::CreateRasterizerState( const D3D10_RASTERIZER_DESC* pRasterizerDesc, ID3D10RasterizerState** ppRasterizerState) { - Logger::err("D3D10Device::CreateRasterizerState: Not implemented"); - return E_NOTIMPL; + InitReturnPtr(ppRasterizerState); + + ID3D11RasterizerState* d3d11RasterizerState = nullptr; + HRESULT hr = m_device->CreateRasterizerState( + reinterpret_cast(pRasterizerDesc), + ppRasterizerState ? &d3d11RasterizerState : nullptr); + + if (FAILED(hr)) + return hr; + + if (ppRasterizerState != nullptr) { + *ppRasterizerState = static_cast(d3d11RasterizerState)->GetD3D10Iface(); + return S_OK; + } return S_FALSE; } diff --git a/src/d3d10/d3d10_rasterizer.cpp b/src/d3d10/d3d10_rasterizer.cpp new file mode 100644 index 000000000..42de25ec9 --- /dev/null +++ b/src/d3d10/d3d10_rasterizer.cpp @@ -0,0 +1,60 @@ +#include "d3d10_rasterizer.h" + +#include "../d3d11/d3d11_device.h" +#include "../d3d11/d3d11_rasterizer.h" + +namespace dxvk { + + HRESULT STDMETHODCALLTYPE D3D10RasterizerState::QueryInterface( + REFIID riid, + void** ppvObject) { + return m_d3d11->QueryInterface(riid, ppvObject); + } + + + ULONG STDMETHODCALLTYPE D3D10RasterizerState::AddRef() { + return m_d3d11->AddRef(); + } + + + ULONG STDMETHODCALLTYPE D3D10RasterizerState::Release() { + return m_d3d11->Release(); + } + + + void STDMETHODCALLTYPE D3D10RasterizerState::GetDevice( + ID3D10Device** ppDevice) { + GetD3D10Device(m_d3d11, ppDevice); + } + + + HRESULT STDMETHODCALLTYPE D3D10RasterizerState::GetPrivateData( + REFGUID guid, + UINT* pDataSize, + void* pData) { + return m_d3d11->GetPrivateData(guid, pDataSize, pData); + } + + + HRESULT STDMETHODCALLTYPE D3D10RasterizerState::SetPrivateData( + REFGUID guid, + UINT DataSize, + const void* pData) { + return m_d3d11->SetPrivateData(guid, DataSize, pData); + } + + + HRESULT STDMETHODCALLTYPE D3D10RasterizerState::SetPrivateDataInterface( + REFGUID guid, + const IUnknown* pData) { + return m_d3d11->SetPrivateDataInterface(guid, pData); + } + + + void STDMETHODCALLTYPE D3D10RasterizerState::GetDesc( + D3D10_RASTERIZER_DESC* pDesc) { + static_assert(sizeof(D3D10_RASTERIZER_DESC) == sizeof(D3D11_RASTERIZER_DESC)); + m_d3d11->GetDesc(reinterpret_cast(pDesc)); + } + +} \ No newline at end of file diff --git a/src/d3d10/d3d10_rasterizer.h b/src/d3d10/d3d10_rasterizer.h new file mode 100644 index 000000000..9ccad042c --- /dev/null +++ b/src/d3d10/d3d10_rasterizer.h @@ -0,0 +1,55 @@ +#pragma once + +#include "d3d10_util.h" + +namespace dxvk { + + class D3D11RasterizerState; + class D3D11Device; + + class D3D10RasterizerState : public ID3D10RasterizerState { + + public: + + D3D10RasterizerState(D3D11RasterizerState* 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); + + void STDMETHODCALLTYPE GetDesc( + D3D10_RASTERIZER_DESC* pDesc); + + D3D11RasterizerState* GetD3D11Iface() { + return m_d3d11; + } + + private: + + D3D11RasterizerState* m_d3d11; + + }; + +} \ No newline at end of file diff --git a/src/d3d11/d3d11_rasterizer.cpp b/src/d3d11/d3d11_rasterizer.cpp index eef07527e..502572aa1 100644 --- a/src/d3d11/d3d11_rasterizer.cpp +++ b/src/d3d11/d3d11_rasterizer.cpp @@ -6,8 +6,7 @@ namespace dxvk { D3D11RasterizerState::D3D11RasterizerState( D3D11Device* device, const D3D11_RASTERIZER_DESC1& desc) - : m_device(device), m_desc(desc) { - + : m_device(device), m_desc(desc), m_d3d10(this) { // Polygon mode. Determines whether the rasterizer fills // a polygon or renders lines connecting the vertices. m_state.polygonMode = VK_POLYGON_MODE_FILL; @@ -73,6 +72,12 @@ namespace dxvk { return S_OK; } + if (riid == __uuidof(ID3D10DeviceChild) + || riid == __uuidof(ID3D10RasterizerState)) { + *ppvObject = ref(&m_d3d10); + return S_OK; + } + Logger::warn("D3D11RasterizerState::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); return E_NOINTERFACE; diff --git a/src/d3d11/d3d11_rasterizer.h b/src/d3d11/d3d11_rasterizer.h index 91c3fc8db..a408550d9 100644 --- a/src/d3d11/d3d11_rasterizer.h +++ b/src/d3d11/d3d11_rasterizer.h @@ -1,6 +1,8 @@ #pragma once -#include +#include "../dxvk/dxvk_device.h" + +#include "../d3d10/d3d10_rasterizer.h" #include "d3d11_device_child.h" @@ -35,6 +37,10 @@ namespace dxvk { void BindToContext( const Rc& ctx); + D3D10RasterizerState* GetD3D10Iface() { + return &m_d3d10; + } + static D3D11_RASTERIZER_DESC1 DefaultDesc(); static D3D11_RASTERIZER_DESC1 PromoteDesc( @@ -48,6 +54,7 @@ namespace dxvk { D3D11Device* const m_device; D3D11_RASTERIZER_DESC1 m_desc; DxvkRasterizerState m_state; + D3D10RasterizerState m_d3d10; }; diff --git a/src/d3d11/meson.build b/src/d3d11/meson.build index c99a1460f..a7c3bb106 100644 --- a/src/d3d11/meson.build +++ b/src/d3d11/meson.build @@ -4,6 +4,7 @@ d3d10_src = [ '../d3d10/d3d10_depth_stencil.cpp', '../d3d10/d3d10_device.cpp', '../d3d10/d3d10_input_layout.cpp', + '../d3d10/d3d10_rasterizer.cpp', '../d3d10/d3d10_sampler.cpp', '../d3d10/d3d10_texture.cpp', '../d3d10/d3d10_util.cpp',