diff options
Diffstat (limited to 'tools/gfx/d3d12/render-d3d12.cpp')
| -rw-r--r-- | tools/gfx/d3d12/render-d3d12.cpp | 90 |
1 files changed, 62 insertions, 28 deletions
diff --git a/tools/gfx/d3d12/render-d3d12.cpp b/tools/gfx/d3d12/render-d3d12.cpp index 28128a04d..689c9c087 100644 --- a/tools/gfx/d3d12/render-d3d12.cpp +++ b/tools/gfx/d3d12/render-d3d12.cpp @@ -3424,12 +3424,29 @@ public: IBufferResource* countBuffer, uint64_t countOffset) override { - SLANG_UNUSED(maxDrawCount); - SLANG_UNUSED(argBuffer); - SLANG_UNUSED(argOffset); - SLANG_UNUSED(countBuffer); - SLANG_UNUSED(countOffset); - SLANG_UNIMPLEMENTED_X("drawIndirect"); + prepareDraw(); + + D3D12_INDIRECT_ARGUMENT_DESC args[1]; + args[0].Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW; + + D3D12_COMMAND_SIGNATURE_DESC desc; + desc.ByteStride = 36; + desc.NumArgumentDescs = 1; + desc.pArgumentDescs = args; + + ComPtr<ID3D12CommandSignature> cmdSignature = nullptr; + if (FAILED(m_device->CreateCommandSignature(&desc, nullptr, IID_PPV_ARGS(cmdSignature.writeRef())))) + { + return; + } + + m_d3dCmdList->ExecuteIndirect( + cmdSignature, + maxDrawCount, + (ID3D12Resource*)argBuffer, + argOffset, + (ID3D12Resource*)countBuffer, + countOffset); } virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedIndirect( @@ -3439,12 +3456,29 @@ public: IBufferResource* countBuffer, uint64_t countOffset) override { - SLANG_UNUSED(maxDrawCount); - SLANG_UNUSED(argBuffer); - SLANG_UNUSED(argOffset); - SLANG_UNUSED(countBuffer); - SLANG_UNUSED(countOffset); - SLANG_UNIMPLEMENTED_X("drawIndirect"); + prepareDraw(); + + D3D12_INDIRECT_ARGUMENT_DESC args[1]; + args[0].Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED; + + D3D12_COMMAND_SIGNATURE_DESC desc; + desc.ByteStride = 36; + desc.NumArgumentDescs = 1; + desc.pArgumentDescs = args; + + ComPtr<ID3D12CommandSignature> cmdSignature = nullptr; + if (FAILED(m_device->CreateCommandSignature(&desc, nullptr, IID_PPV_ARGS(cmdSignature.writeRef())))) + { + return; + } + + m_d3dCmdList->ExecuteIndirect( + cmdSignature, + maxDrawCount, + (ID3D12Resource*)argBuffer, + argOffset, + (ID3D12Resource*)countBuffer, + countOffset); } virtual SLANG_NO_THROW Result SLANG_MCALL setSamplePositions( @@ -3464,11 +3498,8 @@ public: UInt startVertex, UInt startInstanceLocation) override { - SLANG_UNUSED(vertexCount); - SLANG_UNUSED(instanceCount); - SLANG_UNUSED(startVertex); - SLANG_UNUSED(startInstanceLocation); - SLANG_UNIMPLEMENTED_X("drawInstanced"); + prepareDraw(); + m_d3dCmdList->DrawInstanced(vertexCount, instanceCount, startVertex, startInstanceLocation); } virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedInstanced( @@ -3478,12 +3509,8 @@ public: int32_t baseVertexLocation, uint32_t startInstanceLocation) override { - SLANG_UNUSED(indexCount); - SLANG_UNUSED(instanceCount); - SLANG_UNUSED(startIndexLocation); - SLANG_UNUSED(baseVertexLocation); - SLANG_UNUSED(startInstanceLocation); - SLANG_UNIMPLEMENTED_X("drawIndexedInstanced"); + prepareDraw(); + m_d3dCmdList->DrawIndexedInstanced(indexCount, instanceCount, startIndexLocation, baseVertexLocation, startInstanceLocation); } }; @@ -4145,7 +4172,7 @@ public: bool isShared = false); Result captureTextureToSurface( - D3D12Resource& resource, + TextureResourceImpl* resource, ResourceState state, ISlangBlob** blob, size_t* outRowPitch, @@ -4485,14 +4512,17 @@ Result D3D12Device::createBuffer(const D3D12_RESOURCE_DESC& resourceDesc, const } Result D3D12Device::captureTextureToSurface( - D3D12Resource& resource, + TextureResourceImpl* resourceImpl, ResourceState state, ISlangBlob** outBlob, size_t* outRowPitch, size_t* outPixelSize) { + auto resource = resourceImpl->m_resource; + const D3D12_RESOURCE_STATES initialState = D3DUtil::translateResourceState(state); + const ITextureResource::Desc& gfxDesc = *resourceImpl->getDesc(); const D3D12_RESOURCE_DESC desc = resource.getResource()->GetDesc(); // Don't bother supporting MSAA for right now @@ -4502,8 +4532,12 @@ Result D3D12Device::captureTextureToSurface( return SLANG_FAIL; } - size_t bytesPerPixel = sizeof(uint32_t); + FormatInfo formatInfo; + gfxGetFormatInfo(gfxDesc.format, &formatInfo); + size_t bytesPerPixel = formatInfo.blockSizeInBytes / formatInfo.pixelsPerBlock; size_t rowPitch = int(desc.Width) * bytesPerPixel; + static const size_t align = 256; // D3D requires minimum 256 byte alignment for texture data. + rowPitch = (rowPitch + align - 1) & ~(align - 1); // Bit trick for rounding up size_t bufferSize = rowPitch * int(desc.Height); if (outRowPitch) *outRowPitch = rowPitch; @@ -5023,7 +5057,7 @@ SlangResult D3D12Device::readTextureResource( size_t* outPixelSize) { return captureTextureToSurface( - static_cast<TextureResourceImpl*>(resource)->m_resource, + static_cast<TextureResourceImpl*>(resource), state, outBlob, outRowPitch, @@ -6097,7 +6131,7 @@ Result D3D12Device::createGraphicsPipelineState(const GraphicsPipelineStateDesc& } else { - psoDesc.DSVFormat = DXGI_FORMAT_D32_FLOAT; + psoDesc.DSVFormat = DXGI_FORMAT_UNKNOWN; if (framebufferLayout->m_renderTargets.getCount()) { psoDesc.SampleDesc.Count = framebufferLayout->m_renderTargets[0].sampleCount; |
