From 76d88b276a458e842b03e5f1c81be9712db4b738 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Mon, 13 Jun 2022 22:34:02 +0900 Subject: [PATCH] internal/graphicsdriver/directx: call C++ side for ID3D12GraphicsCommandList functions Updates #2084 --- .../directx/api_microsoftgdk_windows.go | 128 ++++++++++++ .../directx/api_notmicrosoftgdk_windows.go | 52 +++++ .../graphicsdriver/directx/api_windows.go | 196 +++++++++--------- internal/microsoftgdk/dummy.c | 37 ++++ 4 files changed, 312 insertions(+), 101 deletions(-) diff --git a/internal/graphicsdriver/directx/api_microsoftgdk_windows.go b/internal/graphicsdriver/directx/api_microsoftgdk_windows.go index 7778bf0ed..1056d61ee 100644 --- a/internal/graphicsdriver/directx/api_microsoftgdk_windows.go +++ b/internal/graphicsdriver/directx/api_microsoftgdk_windows.go @@ -24,6 +24,19 @@ package directx // These functions should be defined on the C++ side like this: // // extern "C" { +// void Ebitengine_ID3D12GraphicsCommandList_ClearDepthStencilView(void* i, uintptr_t depthStencilView, int32_t clearFlags, float depth, uint8_t stencil, uint32_t numRects, void* pRects) { +// static_cast(i)->ClearDepthStencilView(D3D12_CPU_DESCRIPTOR_HANDLE{ depthStencilView }, static_cast(clearFlags), depth, stencil, numRects, static_cast(pRects)); +// } +// void Ebitengine_ID3D12GraphicsCommandList_ClearRenderTargetView(void* i, uintptr_t pRenderTargetView, void* colorRGBA, uint32_t numRects, void* pRects) { +// static_cast(i)->ClearRenderTargetView(D3D12_CPU_DESCRIPTOR_HANDLE{ pRenderTargetView }, static_cast(colorRGBA), numRects, static_cast(pRects)); +// } +// uintptr_t Ebitengine_ID3D12GraphicsCommandList_Close(void* i) { +// auto r = static_cast(i)->Close(); +// return uintptr_t(r); +// } +// void Ebitengine_ID3D12GraphicsCommandList_CopyTextureRegion(void* i, void* pDst, uint32_t dstX, uint32_t dstY, uint32_t dstZ, void* pSrc, void* pSrcBox) { +// static_cast(i)->CopyTextureRegion(static_cast(pDst), dstX, dstY, dstZ, static_cast(pSrc), static_cast(pSrcBox)); +// } // void Ebitengine_ID3D12GraphicsCommandList_DrawIndexedInstanced(void* i, uint32_t indexCountPerInstance, uint32_t instanceCount, uint32_t startIndexLocation, int32_t baseVertexLocation, uint32_t startInstanceLocation) { // static_cast(i)->DrawIndexedInstanced(indexCountPerInstance, instanceCount, startIndexLocation, baseVertexLocation, startInstanceLocation); // } @@ -36,12 +49,37 @@ package directx // void Ebitengine_ID3D12GraphicsCommandList_IASetVertexBuffers(void* i, uint32_t startSlot, uint32_t numViews, void* pViews) { // static_cast(i)->IASetVertexBuffers(startSlot, numViews, static_cast(pViews)); // } +// void Ebitengine_ID3D12GraphicsCommandList_OMSetRenderTargets(void* i, uint32_t numRenderTargetDescriptors, void* pRenderTargetDescriptors, int rtsSingleHandleToDescriptorRange, void* pDepthStencilDescriptor) { +// static_cast(i)->OMSetRenderTargets(numRenderTargetDescriptors, static_cast(pRenderTargetDescriptors), static_cast(rtsSingleHandleToDescriptorRange), static_cast(pDepthStencilDescriptor)); +// } // void Ebitengine_ID3D12GraphicsCommandList_OMSetStencilRef(void* i, uint32_t stencilRef) { // static_cast(i)->OMSetStencilRef(stencilRef); // } +// void Ebitengine_ID3D12GraphicsCommandList_Release(void* i) { +// static_cast(i)->Release(); +// } +// uintptr_t Ebitengine_ID3D12GraphicsCommandList_Reset(void* i, void* pAllocator, void* pInitialState) { +// auto r = static_cast(i)->Reset(static_cast(pAllocator), static_cast(pInitialState)); +// return static_cast(r); +// } +// void Ebitengine_ID3D12GraphicsCommandList_ResourceBarrier(void* i, uint32_t numBarriers, void* pBarriers) { +// static_cast(i)->ResourceBarrier(numBarriers, static_cast(pBarriers)); +// } +// void Ebitengine_ID3D12GraphicsCommandList_RSSetViewports(void* i, uint32_t numViewports, void* pViewports) { +// static_cast(i)->RSSetViewports(numViewports, static_cast(pViewports)); +// } +// void Ebitengine_ID3D12GraphicsCommandList_RSSetScissorRects(void* i, uint32_t numRects, void* pRects) { +// static_cast(i)->RSSetScissorRects(numRects, static_cast(pRects)); +// } +// void Ebitengine_ID3D12GraphicsCommandList_SetDescriptorHeaps(void* i, uint32_t numDescriptorHeaps, void* ppDescriptorHeaps) { +// static_cast(i)->SetDescriptorHeaps(numDescriptorHeaps, static_cast(ppDescriptorHeaps)); +// } // void Ebitengine_ID3D12GraphicsCommandList_SetGraphicsRootDescriptorTable(void* i, uint32_t rootParameterIndex, uint64_t baseDescriptorPtr) { // static_cast(i)->SetGraphicsRootDescriptorTable(rootParameterIndex, D3D12_GPU_DESCRIPTOR_HANDLE{ baseDescriptorPtr }); // } +// void Ebitengine_ID3D12GraphicsCommandList_SetGraphicsRootSignature(void* i, void* pRootSignature) { +// static_cast(i)->SetGraphicsRootSignature(static_cast(pRootSignature)); +// } // void Ebitengine_ID3D12GraphicsCommandList_SetPipelineState(void* i, void* pPipelineState) { // static_cast(i)->SetPipelineState(static_cast(pPipelineState)); // } @@ -49,12 +87,24 @@ package directx // #include // +// void Ebitengine_ID3D12GraphicsCommandList_ClearDepthStencilView(void* i, uintptr_t depthStencilView, int32_t clearFlags, float depth, uint8_t stencil, uint32_t numRects, void* pRects); +// void Ebitengine_ID3D12GraphicsCommandList_ClearRenderTargetView(void* i, uintptr_t pRenderTargetView, void* colorRGBA, uint32_t numRects, void* pRects); +// uintptr_t Ebitengine_ID3D12GraphicsCommandList_Close(void* i); +// void Ebitengine_ID3D12GraphicsCommandList_CopyTextureRegion(void* i, void* pDst, uint32_t dstX, uint32_t dstY, uint32_t dstZ, void* pSrc, void* pSrcBox); // void Ebitengine_ID3D12GraphicsCommandList_DrawIndexedInstanced(void* i, uint32_t indexCountPerInstance, uint32_t instanceCount, uint32_t startIndexLocation, int32_t baseVertexLocation, uint32_t startInstanceLocation); // void Ebitengine_ID3D12GraphicsCommandList_IASetIndexBuffer(void* i, void* pView); // void Ebitengine_ID3D12GraphicsCommandList_IASetPrimitiveTopology(void* i, int32_t primitiveTopology); // void Ebitengine_ID3D12GraphicsCommandList_IASetVertexBuffers(void* i, uint32_t startSlot, uint32_t numViews, void* pViews); +// void Ebitengine_ID3D12GraphicsCommandList_OMSetRenderTargets(void* i, uint32_t numRenderTargetDescriptors, void* pRenderTargetDescriptors, int rtsSingleHandleToDescriptorRange, void* pDepthStencilDescriptor); // void Ebitengine_ID3D12GraphicsCommandList_OMSetStencilRef(void* i, uint32_t stencilRef); +// void Ebitengine_ID3D12GraphicsCommandList_Release(void* i); +// uintptr_t Ebitengine_ID3D12GraphicsCommandList_Reset(void* i, void* pAllocator, void* pInitialState); +// void Ebitengine_ID3D12GraphicsCommandList_ResourceBarrier(void* i, uint32_t numBarriers, void* pBarriers); +// void Ebitengine_ID3D12GraphicsCommandList_RSSetViewports(void* i, uint32_t numViewports, void* pViewports); +// void Ebitengine_ID3D12GraphicsCommandList_RSSetScissorRects(void* i, uint32_t numRects, void* pRects); +// void Ebitengine_ID3D12GraphicsCommandList_SetDescriptorHeaps(void* i, uint32_t numDescriptorHeaps, void* ppDescriptorHeaps); // void Ebitengine_ID3D12GraphicsCommandList_SetGraphicsRootDescriptorTable(void* i, uint32_t rootParameterIndex, uint64_t baseDescriptorPtr); +// void Ebitengine_ID3D12GraphicsCommandList_SetGraphicsRootSignature(void* i, void* pRootSignature); // void Ebitengine_ID3D12GraphicsCommandList_SetPipelineState(void* i, void* pPipelineState); import "C" @@ -62,6 +112,31 @@ import ( "unsafe" ) +func _ID3D12GraphicsCommandList_ClearDepthStencilView(i *_ID3D12GraphicsCommandList, depthStencilView _D3D12_CPU_DESCRIPTOR_HANDLE, clearFlags _D3D12_CLEAR_FLAGS, depth float32, stencil uint8, rects []_D3D12_RECT) { + var pRects *_D3D12_RECT + if len(rects) > 0 { + pRects = &rects[0] + } + C.Ebitengine_ID3D12GraphicsCommandList_ClearDepthStencilView(unsafe.Pointer(i), C.uintptr_t(depthStencilView.ptr), C.int32_t(clearFlags), C.float(depth), C.uint8_t(stencil), C.uint32_t(len(rects)), unsafe.Pointer(pRects)) +} + +func _ID3D12GraphicsCommandList_ClearRenderTargetView(i *_ID3D12GraphicsCommandList, pRenderTargetView _D3D12_CPU_DESCRIPTOR_HANDLE, colorRGBA [4]float32, rects []_D3D12_RECT) { + var pRects *_D3D12_RECT + if len(rects) > 0 { + pRects = &rects[0] + } + C.Ebitengine_ID3D12GraphicsCommandList_ClearRenderTargetView(unsafe.Pointer(i), C.uintptr_t(pRenderTargetView.ptr), unsafe.Pointer(&colorRGBA[0]), C.uint32_t(len(rects)), unsafe.Pointer(pRects)) +} + +func _ID3D12GraphicsCommandList_Close(i *_ID3D12GraphicsCommandList) uintptr { + r := C.Ebitengine_ID3D12GraphicsCommandList_Close(unsafe.Pointer(i)) + return uintptr(r) +} + +func _ID3D12GraphicsCommandList_CopyTextureRegion(i *_ID3D12GraphicsCommandList, pDst unsafe.Pointer, dstX uint32, dstY uint32, dstZ uint32, pSrc unsafe.Pointer, pSrcBox *_D3D12_BOX) { + C.Ebitengine_ID3D12GraphicsCommandList_CopyTextureRegion(unsafe.Pointer(i), pDst, C.uint32_t(dstX), C.uint32_t(dstY), C.uint32_t(dstZ), pSrc, unsafe.Pointer(pSrcBox)) +} + func _ID3D12GraphicsCommandList_DrawIndexedInstanced(i *_ID3D12GraphicsCommandList, indexCountPerInstance uint32, instanceCount uint32, startIndexLocation uint32, baseVertexLocation int32, startInstanceLocation uint32) { C.Ebitengine_ID3D12GraphicsCommandList_DrawIndexedInstanced(unsafe.Pointer(i), C.uint32_t(indexCountPerInstance), C.uint32_t(instanceCount), C.uint32_t(startIndexLocation), @@ -84,14 +159,67 @@ func _ID3D12GraphicsCommandList_IASetVertexBuffers(i *_ID3D12GraphicsCommandList C.Ebitengine_ID3D12GraphicsCommandList_IASetVertexBuffers(unsafe.Pointer(i), C.uint32_t(startSlot), C.uint32_t(len(views)), unsafe.Pointer(pViews)) } +func _ID3D12GraphicsCommandList_OMSetRenderTargets(i *_ID3D12GraphicsCommandList, numRenderTargetDescriptors uint32, pRenderTargetDescriptors *_D3D12_CPU_DESCRIPTOR_HANDLE, rtsSingleHandleToDescriptorRange bool, pDepthStencilDescriptor *_D3D12_CPU_DESCRIPTOR_HANDLE) { + v := 0 + if rtsSingleHandleToDescriptorRange { + v = 1 + } + C.Ebitengine_ID3D12GraphicsCommandList_OMSetRenderTargets(unsafe.Pointer(i), C.uint32_t(numRenderTargetDescriptors), unsafe.Pointer(pRenderTargetDescriptors), C.int(v), unsafe.Pointer(pDepthStencilDescriptor)) +} + func _ID3D12GraphicsCommandList_OMSetStencilRef(i *_ID3D12GraphicsCommandList, stencilRef uint32) { C.Ebitengine_ID3D12GraphicsCommandList_OMSetStencilRef(unsafe.Pointer(i), C.uint32_t(stencilRef)) } +func _ID3D12GraphicsCommandList_Release(i *_ID3D12GraphicsCommandList) { + C.Ebitengine_ID3D12GraphicsCommandList_Release(unsafe.Pointer(i)) +} + +func _ID3D12GraphicsCommandList_Reset(i *_ID3D12GraphicsCommandList, pAllocator *_ID3D12CommandAllocator, pInitialState *_ID3D12PipelineState) uintptr { + r := C.Ebitengine_ID3D12GraphicsCommandList_Reset(unsafe.Pointer(i), unsafe.Pointer(pAllocator), unsafe.Pointer(pInitialState)) + return uintptr(r) +} + +func _ID3D12GraphicsCommandList_ResourceBarrier(i *_ID3D12GraphicsCommandList, barriers []_D3D12_RESOURCE_BARRIER_Transition) { + var pBarriers *_D3D12_RESOURCE_BARRIER_Transition + if len(barriers) > 0 { + pBarriers = &barriers[0] + } + C.Ebitengine_ID3D12GraphicsCommandList_ResourceBarrier(unsafe.Pointer(i), C.uint32_t(len(barriers)), unsafe.Pointer(pBarriers)) +} + +func _ID3D12GraphicsCommandList_RSSetViewports(i *_ID3D12GraphicsCommandList, viewports []_D3D12_VIEWPORT) { + var pViewports *_D3D12_VIEWPORT + if len(viewports) > 0 { + pViewports = &viewports[0] + } + C.Ebitengine_ID3D12GraphicsCommandList_RSSetViewports(unsafe.Pointer(i), C.uint32_t(len(viewports)), unsafe.Pointer(pViewports)) +} + +func _ID3D12GraphicsCommandList_RSSetScissorRects(i *_ID3D12GraphicsCommandList, rects []_D3D12_RECT) { + var pRects *_D3D12_RECT + if len(rects) > 0 { + pRects = &rects[0] + } + C.Ebitengine_ID3D12GraphicsCommandList_RSSetScissorRects(unsafe.Pointer(i), C.uint32_t(len(rects)), unsafe.Pointer(pRects)) +} + +func _ID3D12GraphicsCommandList_SetDescriptorHeaps(i *_ID3D12GraphicsCommandList, descriptorHeaps []*_ID3D12DescriptorHeap) { + var ppDescriptorHeaps **_ID3D12DescriptorHeap + if len(descriptorHeaps) > 0 { + ppDescriptorHeaps = &descriptorHeaps[0] + } + C.Ebitengine_ID3D12GraphicsCommandList_SetDescriptorHeaps(unsafe.Pointer(i), C.uint32_t(len(descriptorHeaps)), unsafe.Pointer(ppDescriptorHeaps)) +} + func _ID3D12GraphicsCommandList_SetGraphicsRootDescriptorTable(i *_ID3D12GraphicsCommandList, rootParameterIndex uint32, baseDescriptor _D3D12_GPU_DESCRIPTOR_HANDLE) { C.Ebitengine_ID3D12GraphicsCommandList_SetGraphicsRootDescriptorTable(unsafe.Pointer(i), C.uint32_t(rootParameterIndex), C.uint64_t(baseDescriptor.ptr)) } +func _ID3D12GraphicsCommandList_SetGraphicsRootSignature(i *_ID3D12GraphicsCommandList, pRootSignature *_ID3D12RootSignature) { + C.Ebitengine_ID3D12GraphicsCommandList_SetGraphicsRootSignature(unsafe.Pointer(i), unsafe.Pointer(pRootSignature)) +} + func _ID3D12GraphicsCommandList_SetPipelineState(i *_ID3D12GraphicsCommandList, pPipelineState *_ID3D12PipelineState) { C.Ebitengine_ID3D12GraphicsCommandList_SetPipelineState(unsafe.Pointer(i), unsafe.Pointer(pPipelineState)) } diff --git a/internal/graphicsdriver/directx/api_notmicrosoftgdk_windows.go b/internal/graphicsdriver/directx/api_notmicrosoftgdk_windows.go index cbd30ecd0..7393734e6 100644 --- a/internal/graphicsdriver/directx/api_notmicrosoftgdk_windows.go +++ b/internal/graphicsdriver/directx/api_notmicrosoftgdk_windows.go @@ -17,6 +17,26 @@ package directx +import ( + "unsafe" +) + +func _ID3D12GraphicsCommandList_ClearDepthStencilView(i *_ID3D12GraphicsCommandList, depthStencilView _D3D12_CPU_DESCRIPTOR_HANDLE, clearFlags _D3D12_CLEAR_FLAGS, depth float32, stencil uint8, rects []_D3D12_RECT) { + panic("not implemented") +} + +func _ID3D12GraphicsCommandList_ClearRenderTargetView(i *_ID3D12GraphicsCommandList, pRenderTargetView _D3D12_CPU_DESCRIPTOR_HANDLE, colorRGBA [4]float32, rects []_D3D12_RECT) { + panic("not implemented") +} + +func _ID3D12GraphicsCommandList_Close(i *_ID3D12GraphicsCommandList) uintptr { + panic("not implemented") +} + +func _ID3D12GraphicsCommandList_CopyTextureRegion(i *_ID3D12GraphicsCommandList, pDst unsafe.Pointer, dstX uint32, dstY uint32, dstZ uint32, pSrc unsafe.Pointer, pSrcBox *_D3D12_BOX) { + panic("not implemented") +} + func _ID3D12GraphicsCommandList_DrawIndexedInstanced(i *_ID3D12GraphicsCommandList, indexCountPerInstance uint32, instanceCount uint32, startIndexLocation uint32, baseVertexLocation int32, startInstanceLocation uint32) { panic("not implemented") } @@ -33,14 +53,46 @@ func _ID3D12GraphicsCommandList_IASetVertexBuffers(i *_ID3D12GraphicsCommandList panic("not implemented") } +func _ID3D12GraphicsCommandList_OMSetRenderTargets(i *_ID3D12GraphicsCommandList, numRenderTargetDescriptors uint32, pRenderTargetDescriptors *_D3D12_CPU_DESCRIPTOR_HANDLE, rtsSingleHandleToDescriptorRange bool, pDepthStencilDescriptor *_D3D12_CPU_DESCRIPTOR_HANDLE) { + panic("not implemented") +} + func _ID3D12GraphicsCommandList_OMSetStencilRef(i *_ID3D12GraphicsCommandList, stencilRef uint32) { panic("not implemented") } +func _ID3D12GraphicsCommandList_Release(i *_ID3D12GraphicsCommandList) { + panic("not implemented") +} + +func _ID3D12GraphicsCommandList_Reset(i *_ID3D12GraphicsCommandList, pAllocator *_ID3D12CommandAllocator, pInitialState *_ID3D12PipelineState) uintptr { + panic("not implemented") +} + +func _ID3D12GraphicsCommandList_ResourceBarrier(i *_ID3D12GraphicsCommandList, barriers []_D3D12_RESOURCE_BARRIER_Transition) { + panic("not implemented") +} + +func _ID3D12GraphicsCommandList_RSSetViewports(i *_ID3D12GraphicsCommandList, viewports []_D3D12_VIEWPORT) { + panic("not implemented") +} + +func _ID3D12GraphicsCommandList_RSSetScissorRects(i *_ID3D12GraphicsCommandList, rects []_D3D12_RECT) { + panic("not implemented") +} + +func _ID3D12GraphicsCommandList_SetDescriptorHeaps(i *_ID3D12GraphicsCommandList, descriptorHeaps []*_ID3D12DescriptorHeap) { + panic("not implemented") +} + func _ID3D12GraphicsCommandList_SetGraphicsRootDescriptorTable(i *_ID3D12GraphicsCommandList, rootParameterIndex uint32, baseDescriptor _D3D12_GPU_DESCRIPTOR_HANDLE) { panic("not implemented") } +func _ID3D12GraphicsCommandList_SetGraphicsRootSignature(i *_ID3D12GraphicsCommandList, pRootSignature *_ID3D12RootSignature) { + panic("not implemented") +} + func _ID3D12GraphicsCommandList_SetPipelineState(i *_ID3D12GraphicsCommandList, pPipelineState *_ID3D12PipelineState) { panic("not implemented") } diff --git a/internal/graphicsdriver/directx/api_windows.go b/internal/graphicsdriver/directx/api_windows.go index 682f58b44..3cd28ae53 100644 --- a/internal/graphicsdriver/directx/api_windows.go +++ b/internal/graphicsdriver/directx/api_windows.go @@ -1701,80 +1701,47 @@ type _ID3D12GraphicsCommandList_Vtbl struct { BeginEvent uintptr EndEvent uintptr ExecuteIndirect uintptr - - // These members are for Xbox. - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - CopyTextureRegion_Xbox uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr - _ uintptr } func (i *_ID3D12GraphicsCommandList) ClearDepthStencilView(depthStencilView _D3D12_CPU_DESCRIPTOR_HANDLE, clearFlags _D3D12_CLEAR_FLAGS, depth float32, stencil uint8, rects []_D3D12_RECT) { - var pRects *_D3D12_RECT - if len(rects) > 0 { - pRects = &rects[0] + if microsoftgdk.IsXbox() { + _ID3D12GraphicsCommandList_ClearDepthStencilView(i, depthStencilView, clearFlags, depth, stencil, rects) + } else { + var pRects *_D3D12_RECT + if len(rects) > 0 { + pRects = &rects[0] + } + syscall.Syscall9(i.vtbl.ClearDepthStencilView, 7, uintptr(unsafe.Pointer(i)), + depthStencilView.ptr, uintptr(clearFlags), uintptr(math.Float32bits(depth)), + uintptr(stencil), uintptr(len(rects)), uintptr(unsafe.Pointer(pRects)), + 0, 0) } - syscall.Syscall9(i.vtbl.ClearDepthStencilView, 7, uintptr(unsafe.Pointer(i)), - depthStencilView.ptr, uintptr(clearFlags), uintptr(math.Float32bits(depth)), - uintptr(stencil), uintptr(len(rects)), uintptr(unsafe.Pointer(pRects)), - 0, 0) - runtime.KeepAlive(pRects) + runtime.KeepAlive(rects) } func (i *_ID3D12GraphicsCommandList) ClearRenderTargetView(pRenderTargetView _D3D12_CPU_DESCRIPTOR_HANDLE, colorRGBA [4]float32, rects []_D3D12_RECT) { - var pRects *_D3D12_RECT - if len(rects) > 0 { - pRects = &rects[0] + if microsoftgdk.IsXbox() { + _ID3D12GraphicsCommandList_ClearRenderTargetView(i, pRenderTargetView, colorRGBA, rects) + } else { + var pRects *_D3D12_RECT + if len(rects) > 0 { + pRects = &rects[0] + } + syscall.Syscall6(i.vtbl.ClearRenderTargetView, 5, uintptr(unsafe.Pointer(i)), + pRenderTargetView.ptr, uintptr(unsafe.Pointer(&colorRGBA[0])), uintptr(len(rects)), uintptr(unsafe.Pointer(pRects)), + 0) } - syscall.Syscall6(i.vtbl.ClearRenderTargetView, 5, uintptr(unsafe.Pointer(i)), - pRenderTargetView.ptr, uintptr(unsafe.Pointer(&colorRGBA[0])), uintptr(len(rects)), uintptr(unsafe.Pointer(pRects)), - 0) runtime.KeepAlive(pRenderTargetView) + runtime.KeepAlive(rects) } func (i *_ID3D12GraphicsCommandList) Close() error { - r, _, _ := syscall.Syscall(i.vtbl.Close, 1, uintptr(unsafe.Pointer(i)), 0, 0) + var r uintptr + if microsoftgdk.IsXbox() { + r = _ID3D12GraphicsCommandList_Close(i) + } else { + r, _, _ = syscall.Syscall(i.vtbl.Close, 1, uintptr(unsafe.Pointer(i)), 0, 0) + } if uint32(r) != uint32(windows.S_OK) { return fmt.Errorf("directx: ID3D12GraphicsCommandList::Close failed: HRESULT(%d)", uint32(r)) } @@ -1783,10 +1750,7 @@ func (i *_ID3D12GraphicsCommandList) Close() error { func (i *_ID3D12GraphicsCommandList) CopyTextureRegion_PlacedFootPrint_SubresourceIndex(pDst *_D3D12_TEXTURE_COPY_LOCATION_PlacedFootPrint, dstX uint32, dstY uint32, dstZ uint32, pSrc *_D3D12_TEXTURE_COPY_LOCATION_SubresourceIndex, pSrcBox *_D3D12_BOX) { if microsoftgdk.IsXbox() { - syscall.Syscall9(i.vtbl.CopyTextureRegion_Xbox, 8, uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(pDst)), uintptr(dstX), uintptr(dstY), - uintptr(dstZ), uintptr(unsafe.Pointer(pSrc)), uintptr(unsafe.Pointer(pSrcBox)), - 0, 0) + _ID3D12GraphicsCommandList_CopyTextureRegion(i, unsafe.Pointer(pDst), dstX, dstY, dstZ, unsafe.Pointer(pSrc), pSrcBox) } else { syscall.Syscall9(i.vtbl.CopyTextureRegion, 7, uintptr(unsafe.Pointer(i)), uintptr(unsafe.Pointer(pDst)), uintptr(dstX), uintptr(dstY), @@ -1800,10 +1764,7 @@ func (i *_ID3D12GraphicsCommandList) CopyTextureRegion_PlacedFootPrint_Subresour func (i *_ID3D12GraphicsCommandList) CopyTextureRegion_SubresourceIndex_PlacedFootPrint(pDst *_D3D12_TEXTURE_COPY_LOCATION_SubresourceIndex, dstX uint32, dstY uint32, dstZ uint32, pSrc *_D3D12_TEXTURE_COPY_LOCATION_PlacedFootPrint, pSrcBox *_D3D12_BOX) { if microsoftgdk.IsXbox() { - syscall.Syscall9(i.vtbl.CopyTextureRegion_Xbox, 8, uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(pDst)), uintptr(dstX), uintptr(dstY), - uintptr(dstZ), uintptr(unsafe.Pointer(pSrc)), uintptr(unsafe.Pointer(pSrcBox)), - 0, 0) + _ID3D12GraphicsCommandList_CopyTextureRegion(i, unsafe.Pointer(pDst), dstX, dstY, dstZ, unsafe.Pointer(pSrc), pSrcBox) } else { syscall.Syscall9(i.vtbl.CopyTextureRegion, 7, uintptr(unsafe.Pointer(i)), uintptr(unsafe.Pointer(pDst)), uintptr(dstX), uintptr(dstY), @@ -1860,9 +1821,13 @@ func (i *_ID3D12GraphicsCommandList) IASetVertexBuffers(startSlot uint32, views } func (i *_ID3D12GraphicsCommandList) OMSetRenderTargets(numRenderTargetDescriptors uint32, pRenderTargetDescriptors *_D3D12_CPU_DESCRIPTOR_HANDLE, rtsSingleHandleToDescriptorRange bool, pDepthStencilDescriptor *_D3D12_CPU_DESCRIPTOR_HANDLE) { - syscall.Syscall6(i.vtbl.OMSetRenderTargets, 5, uintptr(unsafe.Pointer(i)), - uintptr(numRenderTargetDescriptors), uintptr(unsafe.Pointer(pRenderTargetDescriptors)), boolToUintptr(rtsSingleHandleToDescriptorRange), uintptr(unsafe.Pointer(pDepthStencilDescriptor)), - 0) + if microsoftgdk.IsXbox() { + _ID3D12GraphicsCommandList_OMSetRenderTargets(i, numRenderTargetDescriptors, pRenderTargetDescriptors, rtsSingleHandleToDescriptorRange, pDepthStencilDescriptor) + } else { + syscall.Syscall6(i.vtbl.OMSetRenderTargets, 5, uintptr(unsafe.Pointer(i)), + uintptr(numRenderTargetDescriptors), uintptr(unsafe.Pointer(pRenderTargetDescriptors)), boolToUintptr(rtsSingleHandleToDescriptorRange), uintptr(unsafe.Pointer(pDepthStencilDescriptor)), + 0) + } runtime.KeepAlive(pRenderTargetDescriptors) runtime.KeepAlive(pDepthStencilDescriptor) } @@ -1876,12 +1841,21 @@ func (i *_ID3D12GraphicsCommandList) OMSetStencilRef(stencilRef uint32) { } func (i *_ID3D12GraphicsCommandList) Release() { + if microsoftgdk.IsXbox() { + _ID3D12GraphicsCommandList_Release(i) + return + } syscall.Syscall(i.vtbl.Release, 1, uintptr(unsafe.Pointer(i)), 0, 0) } func (i *_ID3D12GraphicsCommandList) Reset(pAllocator *_ID3D12CommandAllocator, pInitialState *_ID3D12PipelineState) error { - r, _, _ := syscall.Syscall(i.vtbl.Reset, 3, uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(pAllocator)), uintptr(unsafe.Pointer(pInitialState))) + var r uintptr + if microsoftgdk.IsXbox() { + r = _ID3D12GraphicsCommandList_Reset(i, pAllocator, pInitialState) + } else { + r, _, _ = syscall.Syscall(i.vtbl.Reset, 3, uintptr(unsafe.Pointer(i)), + uintptr(unsafe.Pointer(pAllocator)), uintptr(unsafe.Pointer(pInitialState))) + } runtime.KeepAlive(pAllocator) runtime.KeepAlive(pInitialState) if uint32(r) != uint32(windows.S_OK) { @@ -1891,43 +1865,59 @@ func (i *_ID3D12GraphicsCommandList) Reset(pAllocator *_ID3D12CommandAllocator, } func (i *_ID3D12GraphicsCommandList) ResourceBarrier(barriers []_D3D12_RESOURCE_BARRIER_Transition) { - var pBarriers *_D3D12_RESOURCE_BARRIER_Transition - if len(barriers) > 0 { - pBarriers = &barriers[0] + if microsoftgdk.IsXbox() { + _ID3D12GraphicsCommandList_ResourceBarrier(i, barriers) + } else { + var pBarriers *_D3D12_RESOURCE_BARRIER_Transition + if len(barriers) > 0 { + pBarriers = &barriers[0] + } + syscall.Syscall(i.vtbl.ResourceBarrier, 3, uintptr(unsafe.Pointer(i)), + uintptr(len(barriers)), uintptr(unsafe.Pointer(pBarriers))) } - syscall.Syscall(i.vtbl.ResourceBarrier, 3, uintptr(unsafe.Pointer(i)), - uintptr(len(barriers)), uintptr(unsafe.Pointer(pBarriers))) - runtime.KeepAlive(pBarriers) + runtime.KeepAlive(barriers) } func (i *_ID3D12GraphicsCommandList) RSSetViewports(viewports []_D3D12_VIEWPORT) { - var pViewports *_D3D12_VIEWPORT - if len(viewports) > 0 { - pViewports = &viewports[0] + if microsoftgdk.IsXbox() { + _ID3D12GraphicsCommandList_RSSetViewports(i, viewports) + } else { + var pViewports *_D3D12_VIEWPORT + if len(viewports) > 0 { + pViewports = &viewports[0] + } + syscall.Syscall(i.vtbl.RSSetViewports, 3, uintptr(unsafe.Pointer(i)), + uintptr(len(viewports)), uintptr(unsafe.Pointer(pViewports))) } - syscall.Syscall(i.vtbl.RSSetViewports, 3, uintptr(unsafe.Pointer(i)), - uintptr(len(viewports)), uintptr(unsafe.Pointer(pViewports))) - runtime.KeepAlive(pViewports) + runtime.KeepAlive(viewports) } func (i *_ID3D12GraphicsCommandList) RSSetScissorRects(rects []_D3D12_RECT) { - var pRects *_D3D12_RECT - if len(rects) > 0 { - pRects = &rects[0] + if microsoftgdk.IsXbox() { + _ID3D12GraphicsCommandList_RSSetScissorRects(i, rects) + } else { + var pRects *_D3D12_RECT + if len(rects) > 0 { + pRects = &rects[0] + } + syscall.Syscall(i.vtbl.RSSetScissorRects, 3, uintptr(unsafe.Pointer(i)), + uintptr(len(rects)), uintptr(unsafe.Pointer(pRects))) } - syscall.Syscall(i.vtbl.RSSetScissorRects, 3, uintptr(unsafe.Pointer(i)), - uintptr(len(rects)), uintptr(unsafe.Pointer(pRects))) - runtime.KeepAlive(pRects) + runtime.KeepAlive(rects) } func (i *_ID3D12GraphicsCommandList) SetDescriptorHeaps(descriptorHeaps []*_ID3D12DescriptorHeap) { - var ppDescriptorHeaps **_ID3D12DescriptorHeap - if len(descriptorHeaps) > 0 { - ppDescriptorHeaps = &descriptorHeaps[0] + if microsoftgdk.IsXbox() { + _ID3D12GraphicsCommandList_SetDescriptorHeaps(i, descriptorHeaps) + } else { + var ppDescriptorHeaps **_ID3D12DescriptorHeap + if len(descriptorHeaps) > 0 { + ppDescriptorHeaps = &descriptorHeaps[0] + } + syscall.Syscall(i.vtbl.SetDescriptorHeaps, 3, uintptr(unsafe.Pointer(i)), + uintptr(len(descriptorHeaps)), uintptr(unsafe.Pointer(ppDescriptorHeaps))) } - syscall.Syscall(i.vtbl.SetDescriptorHeaps, 3, uintptr(unsafe.Pointer(i)), - uintptr(len(descriptorHeaps)), uintptr(unsafe.Pointer(ppDescriptorHeaps))) - runtime.KeepAlive(ppDescriptorHeaps) + runtime.KeepAlive(descriptorHeaps) } func (i *_ID3D12GraphicsCommandList) SetGraphicsRootDescriptorTable(rootParameterIndex uint32, baseDescriptor _D3D12_GPU_DESCRIPTOR_HANDLE) { @@ -1940,8 +1930,12 @@ func (i *_ID3D12GraphicsCommandList) SetGraphicsRootDescriptorTable(rootParamete } func (i *_ID3D12GraphicsCommandList) SetGraphicsRootSignature(pRootSignature *_ID3D12RootSignature) { - syscall.Syscall(i.vtbl.SetGraphicsRootSignature, 2, uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(pRootSignature)), 0) + if microsoftgdk.IsXbox() { + _ID3D12GraphicsCommandList_SetGraphicsRootSignature(i, pRootSignature) + } else { + syscall.Syscall(i.vtbl.SetGraphicsRootSignature, 2, uintptr(unsafe.Pointer(i)), + uintptr(unsafe.Pointer(pRootSignature)), 0) + } runtime.KeepAlive(pRootSignature) } diff --git a/internal/microsoftgdk/dummy.c b/internal/microsoftgdk/dummy.c index 069093da3..40e1351c8 100644 --- a/internal/microsoftgdk/dummy.c +++ b/internal/microsoftgdk/dummy.c @@ -21,6 +21,18 @@ __declspec(dllexport) __cdecl uint32_t XSystemGetDeviceType(void) { return 0; } +__declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_ClearDepthStencilView(void* i, uintptr_t depthStencilView, int32_t clearFlags, float depth, uint8_t stencil, uint32_t numRects, void* pRects) { +} + +__declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_ClearRenderTargetView(void* i, uintptr_t pRenderTargetView, void* colorRGBA, uint32_t numRects, void* pRects) { +} + +__declspec(dllexport) __cdecl uintptr_t Ebitengine_ID3D12GraphicsCommandList_Close(void* i) { +} + +__declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_CopyTextureRegion(void* i, void* pDst, uint32_t dstX, uint32_t dstY, uint32_t dstZ, void* pSrc, void* pSrcBox) { +} + __declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_DrawIndexedInstanced(void* i, uint32_t indexCountPerInstance, uint32_t instanceCount, uint32_t startIndexLocation, int32_t baseVertexLocation, uint32_t startInstanceLocation) { } @@ -33,11 +45,36 @@ __declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_IASetPri __declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_IASetVertexBuffers(void* i, uint32_t startSlot, uint32_t numViews, void* pViews) { } +__declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_OMSetRenderTargets(void* i, uint32_t numRenderTargetDescriptors, void* pRenderTargetDescriptors, int rtsSingleHandleToDescriptorRange, void* pDepthStencilDescriptor) { +} + __declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_OMSetStencilRef(void* i, uint32_t stencilRef) { } +__declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_Release(void* i) { +} + +__declspec(dllexport) __cdecl uintptr_t Ebitengine_ID3D12GraphicsCommandList_Reset(void* i, void* pAllocator, void* pInitialStatexo) { + return 0; +} + +__declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_ResourceBarrier(void* i, uint32_t numBarriers, void* pBarriers) { +} + +__declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_RSSetViewports(void* i, uint32_t numViewports, void* pViewports) { +} + +__declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_RSSetScissorRects(void* i, uint32_t numRects, void* pRects) { +} + +__declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_SetDescriptorHeaps(void* i, uint32_t numDescriptorHeaps, void* ppDescriptorHeaps) { +} + __declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_SetGraphicsRootDescriptorTable(void* i, uint32_t rootParameterIndex, uint64_t baseDescriptorPtr) { } +__declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_SetGraphicsRootSignature(void* i, void* pRootSignature) { +} + __declspec(dllexport) __cdecl void Ebitengine_ID3D12GraphicsCommandList_SetPipelineState(void* i, void* pPipelineState) { }