diff options
Diffstat (limited to 'tools/gfx/d3d12/render-d3d12.cpp')
| -rw-r--r-- | tools/gfx/d3d12/render-d3d12.cpp | 137 |
1 files changed, 94 insertions, 43 deletions
diff --git a/tools/gfx/d3d12/render-d3d12.cpp b/tools/gfx/d3d12/render-d3d12.cpp index bbfc10f5a..494dfd0f0 100644 --- a/tools/gfx/d3d12/render-d3d12.cpp +++ b/tools/gfx/d3d12/render-d3d12.cpp @@ -233,7 +233,7 @@ public: BufferResourceImpl(const Desc& desc) : Parent(desc) - , m_defaultState(D3DUtil::translateResourceState(desc.defaultState)) + , m_defaultState(D3DUtil::getResourceState(desc.defaultState)) { } @@ -279,6 +279,31 @@ public: sharedHandle = *outHandle; return SLANG_OK; } + + virtual SLANG_NO_THROW Result SLANG_MCALL + map(MemoryRange* rangeToRead, void** outPointer) override + { + D3D12_RANGE range = {}; + if (rangeToRead) + { + range.Begin = (SIZE_T)rangeToRead->offset; + range.End = (SIZE_T)(rangeToRead->offset + rangeToRead->size); + } + SLANG_RETURN_ON_FAIL(m_resource.getResource()->Map(0, rangeToRead ? &range : nullptr, outPointer)); + return SLANG_OK; + } + + virtual SLANG_NO_THROW Result SLANG_MCALL unmap(MemoryRange* writtenRange) override + { + D3D12_RANGE range = {}; + if (writtenRange) + { + range.Begin = (SIZE_T)writtenRange->offset; + range.End = (SIZE_T)(writtenRange->offset + writtenRange->size); + } + m_resource.getResource()->Unmap(0, writtenRange ? &range : nullptr); + return SLANG_OK; + } }; class TextureResourceImpl: public TextureResource @@ -288,7 +313,7 @@ public: TextureResourceImpl(const Desc& desc) : Parent(desc) - , m_defaultState(D3DUtil::translateResourceState(desc.defaultState)) + , m_defaultState(D3DUtil::getResourceState(desc.defaultState)) { } @@ -387,6 +412,7 @@ public: { SimpleRenderPassLayout::init(desc); m_framebufferLayout = static_cast<FramebufferLayoutImpl*>(desc.framebufferLayout); + m_hasDepthStencil = m_framebufferLayout->m_hasDepthStencil; } }; @@ -705,7 +731,7 @@ public: bufferDesc.allowedStates = ResourceStateSet(ResourceState::ConstantBuffer, ResourceState::CopyDestination); bufferDesc.sizeInBytes = desc.constantBufferSize; - bufferDesc.cpuAccessFlags |= MemoryType::CpuWrite; + bufferDesc.memoryType = MemoryType::Upload; SLANG_RETURN_ON_FAIL(device->createBufferResource( bufferDesc, nullptr, @@ -736,12 +762,15 @@ public: IBufferResource* uploadResource; - if (!buffer->getDesc()->hasCpuAccessFlag(MemoryType::CpuWrite)) + if (buffer->getDesc()->memoryType != MemoryType::Upload) { transientHeap->allocateStagingBuffer(size, uploadResource, ResourceState::CopySource); } - D3D12Resource& uploadResourceRef = (buffer->getDesc()->hasCpuAccessFlag(MemoryType::CpuWrite)) ? buffer->m_resource : static_cast<BufferResourceImpl*>(uploadResource)->m_resource; + D3D12Resource& uploadResourceRef = + (buffer->getDesc()->memoryType == MemoryType::Upload) + ? buffer->m_resource + : static_cast<BufferResourceImpl*>(uploadResource)->m_resource; void* uploadData; SLANG_RETURN_ON_FAIL(uploadResourceRef.getResource()->Map( @@ -749,7 +778,8 @@ public: memcpy((uint8_t*)uploadData + offset, data, size); uploadResourceRef.getResource()->Unmap(0, &readRange); - if (!buffer->getDesc()->hasCpuAccessFlag(MemoryType::CpuWrite)) { + if (buffer->getDesc()->memoryType != MemoryType::Upload) + { { D3D12BarrierSubmitter submitter(cmdList); submitter.transition( @@ -3148,7 +3178,7 @@ public: } else { - initialState = D3DUtil::translateResourceState(access.initialState); + initialState = D3DUtil::getResourceState(access.initialState); } textureResource->m_resource.transition( initialState, @@ -3182,7 +3212,7 @@ public: } else { - initialState = D3DUtil::translateResourceState( + initialState = D3DUtil::getResourceState( renderPass->m_depthStencilAccess.initialState); } textureResource->m_resource.transition( @@ -3398,7 +3428,7 @@ public: static_cast<TextureResourceImpl*>(resourceViewImpl->m_resource.Ptr()); textureResource->m_resource.transition( D3D12_RESOURCE_STATE_RENDER_TARGET, - D3DUtil::translateResourceState(access.finalState), + D3DUtil::getResourceState(access.finalState), submitter); } } @@ -3412,7 +3442,7 @@ public: static_cast<TextureResourceImpl*>(resourceViewImpl->m_resource.Ptr()); textureResource->m_resource.transition( D3D12_RESOURCE_STATE_DEPTH_WRITE, - D3DUtil::translateResourceState( + D3DUtil::getResourceState( m_renderPass->m_depthStencilAccess.finalState), submitter); } @@ -3651,9 +3681,12 @@ public: barrier.Transition.pResource = textureImpl->m_resource.getResource(); auto planeCount = D3DUtil::getPlaneSliceCount( D3DUtil::getMapFormat(textureImpl->getDesc()->format)); + auto arraySize = textureDesc->arraySize; + if (arraySize == 0) + arraySize = 1; for (uint32_t planeIndex = 0; planeIndex < planeCount; planeIndex++) { - for (int layer = 0; layer < textureDesc->arraySize; layer++) + for (int layer = 0; layer < arraySize; layer++) { for (int mip = 0; mip < textureDesc->numMipLevels; mip++) { @@ -3662,7 +3695,7 @@ public: layer, planeIndex, textureImpl->getDesc()->numMipLevels, - textureImpl->getDesc()->arraySize); + arraySize); barriers.add(barrier); } } @@ -3697,8 +3730,8 @@ public: } else { barrier.Transition.pResource = bufferImpl->m_resource; - barrier.Transition.StateBefore = D3DUtil::translateResourceState(src); - barrier.Transition.StateAfter = D3DUtil::translateResourceState(dst); + barrier.Transition.StateBefore = D3DUtil::getResourceState(src); + barrier.Transition.StateAfter = D3DUtil::getResourceState(dst); barrier.Transition.Subresource = 0; } @@ -3884,11 +3917,9 @@ public: bufferImpl->m_resource.getResource()->Unmap(0, nullptr); srcRegion.pResource = bufferImpl->m_resource.getResource(); - D3D12_BOX srcBox = {}; - srcBox.right = (UINT)bufferSize; - srcBox.bottom = srcBox.back = 1; + m_commandBuffer->m_cmdList->CopyTextureRegion( - &dstRegion, offset.x, offset.y, offset.z, &srcRegion, &srcBox); + &dstRegion, offset.x, offset.y, offset.z, &srcRegion, nullptr); } } @@ -4192,8 +4223,8 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL memoryBarrier( int count, IAccelerationStructure* const* structures, - MemoryType::Enum sourceAccess, - MemoryType::Enum destAccess) override; + AccessFlag sourceAccess, + AccessFlag destAccess) override; virtual SLANG_NO_THROW void SLANG_MCALL bindPipeline(IPipelineState* state, IShaderObject** outRootObject) override; virtual SLANG_NO_THROW void SLANG_MCALL dispatchRays( @@ -4348,8 +4379,6 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL executeCommandBuffers(uint32_t count, ICommandBuffer* const* commandBuffers, IFence* fence, uint64_t valueToSignal) override { - // TODO: implement fence signal. - assert(fence == nullptr); ShortList<ID3D12CommandList*> commandLists; for (uint32_t i = 0; i < count; i++) { @@ -4372,6 +4401,12 @@ public: } m_d3dQueue->Signal(m_fence, m_fenceValue); ResetEvent(globalWaitHandle); + + if (fence) + { + auto fenceImpl = static_cast<FenceImpl*>(fence); + m_d3dQueue->Signal(fenceImpl->m_fence.get(), valueToSignal); + } } virtual SLANG_NO_THROW void SLANG_MCALL waitOnHost() override @@ -4436,6 +4471,14 @@ public: return SLANG_OK; } + virtual SLANG_NO_THROW Result SLANG_MCALL resize(uint32_t width, uint32_t height) override + { + for (auto evt : m_frameEvents) + SetEvent(evt); + SLANG_RETURN_ON_FAIL(D3DSwapchainBase::resize(width, height)); + return SLANG_OK; + } + virtual void createSwapchainBufferImages() override { m_images.clear(); @@ -4501,7 +4544,7 @@ public: D3D12_RESOURCE_STATES finalState, D3D12Resource& resourceOut, bool isShared, - MemoryType::Enum access = MemoryType::GpuOnly); + MemoryType access = MemoryType::DeviceLocal); Result captureTextureToSurface( TextureResourceImpl* resource, @@ -4793,7 +4836,7 @@ static void _initSrvDesc( } } -Result D3D12Device::createBuffer(const D3D12_RESOURCE_DESC& resourceDesc, const void* srcData, size_t srcDataSize, D3D12_RESOURCE_STATES finalState, D3D12Resource& resourceOut, bool isShared, MemoryType::Enum access) +Result D3D12Device::createBuffer(const D3D12_RESOURCE_DESC& resourceDesc, const void* srcData, size_t srcDataSize, D3D12_RESOURCE_STATES finalState, D3D12Resource& resourceOut, bool isShared, MemoryType memoryType) { const size_t bufferSize = size_t(resourceDesc.Width); @@ -4810,8 +4853,9 @@ Result D3D12Device::createBuffer(const D3D12_RESOURCE_DESC& resourceDesc, const D3D12_RESOURCE_STATES initialState = finalState; - switch (access) { - case MemoryType::CpuRead: + switch (memoryType) + { + case MemoryType::ReadBack: assert(!srcData); heapProps.Type = D3D12_HEAP_TYPE_READBACK; @@ -4819,14 +4863,14 @@ Result D3D12Device::createBuffer(const D3D12_RESOURCE_DESC& resourceDesc, const initialState |= D3D12_RESOURCE_STATE_COPY_DEST; break; - case MemoryType::CpuWrite: + case MemoryType::Upload: heapProps.Type = D3D12_HEAP_TYPE_UPLOAD; desc.Flags = D3D12_RESOURCE_FLAG_NONE; initialState |= D3D12_RESOURCE_STATE_GENERIC_READ; break; - case MemoryType::GpuOnly: + case MemoryType::DeviceLocal: heapProps.Type = D3D12_HEAP_TYPE_DEFAULT; initialState = (srcData ? D3D12_RESOURCE_STATE_COPY_DEST : finalState); break; @@ -4841,7 +4885,8 @@ Result D3D12Device::createBuffer(const D3D12_RESOURCE_DESC& resourceDesc, const { D3D12Resource uploadResource; - if (access == MemoryType::GpuOnly) { + if (memoryType == MemoryType::DeviceLocal) + { // If the buffer is on the default heap, create upload buffer. D3D12_RESOURCE_DESC uploadDesc(resourceDesc); uploadDesc.Flags = D3D12_RESOURCE_FLAG_NONE; @@ -4851,7 +4896,7 @@ Result D3D12Device::createBuffer(const D3D12_RESOURCE_DESC& resourceDesc, const } // Be careful not to actually copy a resource here. - D3D12Resource& uploadResourceRef = (access == MemoryType::GpuOnly) ? uploadResource : resourceOut; + D3D12Resource& uploadResourceRef = (memoryType == MemoryType::DeviceLocal) ? uploadResource : resourceOut; // Copy data to the intermediate upload heap and then schedule a copy // from the upload heap to the vertex buffer. @@ -4864,7 +4909,8 @@ Result D3D12Device::createBuffer(const D3D12_RESOURCE_DESC& resourceDesc, const ::memcpy(dstData, srcData, srcDataSize); dxUploadResource->Unmap(0, nullptr); - if (access == MemoryType::GpuOnly) { + if (memoryType == MemoryType::DeviceLocal) + { auto encodeInfo = encodeResourceCommands(); encodeInfo.d3dCommandList->CopyBufferRegion(resourceOut, 0, uploadResourceRef, 0, bufferSize); submitResourceCommandsAndWait(encodeInfo); @@ -4883,7 +4929,7 @@ Result D3D12Device::captureTextureToSurface( { auto& resource = resourceImpl->m_resource; - const D3D12_RESOURCE_STATES initialState = D3DUtil::translateResourceState(state); + const D3D12_RESOURCE_STATES initialState = D3DUtil::getResourceState(state); const ITextureResource::Desc& gfxDesc = *resourceImpl->getDesc(); const D3D12_RESOURCE_DESC desc = resource.getResource()->GetDesc(); @@ -4923,7 +4969,7 @@ Result D3D12Device::captureTextureToSurface( } auto encodeInfo = encodeResourceCommands(); - auto currentState = D3DUtil::translateResourceState(state); + auto currentState = D3DUtil::getResourceState(state); { D3D12BarrierSubmitter submitter(encodeInfo.d3dCommandList); @@ -5132,8 +5178,7 @@ Result D3D12Device::initialize(const Desc& desc) } #if ENABLE_DEBUG_LAYER - m_D3D12GetDebugInterface = - (PFN_D3D12_GET_DEBUG_INTERFACE)loadProc(d3dModule, "D3D12GetDebugInterface"); + m_D3D12GetDebugInterface = (PFN_D3D12_GET_DEBUG_INTERFACE)loadProc(d3dModule, "D3D12GetDebugInterface"); if (m_D3D12GetDebugInterface) { if (SLANG_SUCCEEDED(m_D3D12GetDebugInterface(IID_PPV_ARGS(m_dxDebug.writeRef())))) @@ -5789,8 +5834,14 @@ Result D3D12Device::createBufferResource(const IBufferResource::Desc& descIn, co bufferDesc.Flags |= _calcResourceFlags(srcDesc.allowedStates); const D3D12_RESOURCE_STATES initialState = buffer->m_defaultState; - SLANG_RETURN_ON_FAIL(createBuffer(bufferDesc, initData, srcDesc.sizeInBytes, initialState, buffer->m_resource, descIn.isShared, - (MemoryType::Enum)descIn.cpuAccessFlags)); + SLANG_RETURN_ON_FAIL(createBuffer( + bufferDesc, + initData, + srcDesc.sizeInBytes, + initialState, + buffer->m_resource, + descIn.isShared, + descIn.memoryType)); returnComPtr(outResource, buffer); return SLANG_OK; @@ -6351,11 +6402,10 @@ Result D3D12Device::readBufferResource( D3D12Resource& resource = buffer->m_resource; D3D12Resource stageBuf; - if (buffer->getDesc()->cpuAccessFlags != (int)MemoryType::CpuRead) { - + if (buffer->getDesc()->memoryType != MemoryType::ReadBack) + { auto encodeInfo = encodeResourceCommands(); - // Readback heap D3D12_HEAP_PROPERTIES heapProps; heapProps.Type = D3D12_HEAP_TYPE_READBACK; @@ -6377,7 +6427,8 @@ Result D3D12Device::readBufferResource( submitResourceCommandsAndWait(encodeInfo); } - D3D12Resource& stageBufRef = (buffer->getDesc()->cpuAccessFlags != (int)MemoryType::CpuRead) ? stageBuf : resource; + D3D12Resource& stageBufRef = + buffer->getDesc()->memoryType != MemoryType::ReadBack ? stageBuf : resource; // Map and copy RefPtr<ListBlob> blob = new ListBlob(); @@ -7059,8 +7110,8 @@ void D3D12Device::CommandBufferImpl::RayTracingCommandEncoderImpl::deserializeAc void D3D12Device::CommandBufferImpl::RayTracingCommandEncoderImpl::memoryBarrier( int count, IAccelerationStructure* const* structures, - MemoryType::Enum sourceAccess, - MemoryType::Enum destAccess) + AccessFlag sourceAccess, + AccessFlag destAccess) { ShortList<D3D12_RESOURCE_BARRIER> barriers; barriers.setCount(count); |
