From d13fdf88845216b30ad23ee055f13852f917ee80 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 11 Aug 2018 19:40:25 +0200 Subject: [PATCH] [d3d10] Implement IA(Set|Get)(Vertex|Index)Buffers --- src/d3d10/d3d10_device.cpp | 43 ++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/src/d3d10/d3d10_device.cpp b/src/d3d10/d3d10_device.cpp index e3667509f..2975a39fb 100644 --- a/src/d3d10/d3d10_device.cpp +++ b/src/d3d10/d3d10_device.cpp @@ -564,7 +564,17 @@ namespace dxvk { ID3D10Buffer* const* ppVertexBuffers, const UINT* pStrides, const UINT* pOffsets) { - Logger::err("D3D10Device::IASetVertexBuffers: Not implemented"); + ID3D11Buffer* d3d11Buffers[D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; + + for (uint32_t i = 0; i < NumBuffers; i++) { + d3d11Buffers[i] = ppVertexBuffers[i] + ? static_cast(ppVertexBuffers[i])->GetD3D11Iface() + : nullptr; + } + + m_context->IASetVertexBuffers( + StartSlot, NumBuffers, d3d11Buffers, + pStrides, pOffsets); } @@ -572,7 +582,12 @@ namespace dxvk { ID3D10Buffer* pIndexBuffer, DXGI_FORMAT Format, UINT Offset) { - Logger::err("D3D10Device::IASetIndexBuffer: Not implemented"); + D3D10Buffer* d3d10Buffer = static_cast(pIndexBuffer); + D3D11Buffer* d3d11Buffer = d3d10Buffer + ? d3d10Buffer->GetD3D11Iface() + : nullptr; + + m_context->IASetIndexBuffer(d3d11Buffer, Format, Offset); } @@ -599,7 +614,20 @@ namespace dxvk { ID3D10Buffer** ppVertexBuffers, UINT* pStrides, UINT* pOffsets) { - Logger::err("D3D10Device::IAGetVertexBuffers: Not implemented"); + ID3D11Buffer* d3d11Buffers[D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; + + m_context->IAGetVertexBuffers( + StartSlot, NumBuffers, + ppVertexBuffers ? d3d11Buffers : nullptr, + pStrides, pOffsets); + + if (ppVertexBuffers != nullptr) { + for (uint32_t i = 0; i < NumBuffers; i++) { + ppVertexBuffers[i] = d3d11Buffers[i] + ? static_cast(d3d11Buffers[i])->GetD3D10Iface() + : nullptr; + } + } } @@ -607,7 +635,14 @@ namespace dxvk { ID3D10Buffer** pIndexBuffer, DXGI_FORMAT* Format, UINT* Offset) { - Logger::err("D3D10Device::IAGetIndexBuffer: Not implemented"); + ID3D11Buffer* d3d11Buffer = nullptr; + + m_context->IAGetIndexBuffer( + pIndexBuffer ? &d3d11Buffer : nullptr, + Format, Offset); + + if (pIndexBuffer) + *pIndexBuffer = static_cast(d3d11Buffer)->GetD3D10Iface(); }