// Copyright 2017 The Dawn Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SRC_DAWN_NATIVE_D3D12_DEVICED3D12_H_ #define SRC_DAWN_NATIVE_D3D12_DEVICED3D12_H_ #include #include "dawn/common/SerialQueue.h" #include "dawn/native/Device.h" #include "dawn/native/d3d12/CommandRecordingContext.h" #include "dawn/native/d3d12/D3D12Info.h" #include "dawn/native/d3d12/Forward.h" #include "dawn/native/d3d12/TextureD3D12.h" namespace dawn::native::d3d12 { class CommandAllocatorManager; class PlatformFunctions; class ResidencyManager; class ResourceAllocatorManager; class SamplerHeapCache; class ShaderVisibleDescriptorAllocator; class StagingDescriptorAllocator; #define ASSERT_SUCCESS(hr) \ do { \ HRESULT succeeded = hr; \ ASSERT(SUCCEEDED(succeeded)); \ } while (0) // Definition of backend types class Device final : public DeviceBase { public: static ResultOrError> Create(Adapter* adapter, const DeviceDescriptor* descriptor); ~Device() override; MaybeError Initialize(const DeviceDescriptor* descriptor); ResultOrError> CreateCommandBuffer( CommandEncoder* encoder, const CommandBufferDescriptor* descriptor) override; MaybeError TickImpl() override; ID3D12Device* GetD3D12Device() const; ComPtr GetCommandQueue() const; ID3D12SharingContract* GetSharingContract() const; ComPtr GetDispatchIndirectSignature() const; ComPtr GetDrawIndirectSignature() const; ComPtr GetDrawIndexedIndirectSignature() const; CommandAllocatorManager* GetCommandAllocatorManager() const; ResidencyManager* GetResidencyManager() const; const PlatformFunctions* GetFunctions() const; ComPtr GetFactory() const; ComPtr GetDxcLibrary() const; ComPtr GetDxcCompiler() const; ComPtr GetDxcValidator() const; ResultOrError GetPendingCommandContext(); MaybeError ClearBufferToZero(CommandRecordingContext* commandContext, BufferBase* destination, uint64_t destinationOffset, uint64_t size); const D3D12DeviceInfo& GetDeviceInfo() const; MaybeError NextSerial(); MaybeError WaitForSerial(ExecutionSerial serial); void ReferenceUntilUnused(ComPtr object); MaybeError ExecutePendingCommandContext(); ResultOrError> CreateStagingBuffer(size_t size) override; MaybeError CopyFromStagingToBuffer(StagingBufferBase* source, uint64_t sourceOffset, BufferBase* destination, uint64_t destinationOffset, uint64_t size) override; void CopyFromStagingToBufferImpl(CommandRecordingContext* commandContext, StagingBufferBase* source, uint64_t sourceOffset, BufferBase* destination, uint64_t destinationOffset, uint64_t size); MaybeError CopyFromStagingToTexture(const StagingBufferBase* source, const TextureDataLayout& src, TextureCopy* dst, const Extent3D& copySizePixels) override; ResultOrError AllocateMemory( D3D12_HEAP_TYPE heapType, const D3D12_RESOURCE_DESC& resourceDescriptor, D3D12_RESOURCE_STATES initialUsage); void DeallocateMemory(ResourceHeapAllocation& allocation); ShaderVisibleDescriptorAllocator* GetViewShaderVisibleDescriptorAllocator() const; ShaderVisibleDescriptorAllocator* GetSamplerShaderVisibleDescriptorAllocator() const; // Returns nullptr when descriptor count is zero. StagingDescriptorAllocator* GetViewStagingDescriptorAllocator(uint32_t descriptorCount) const; StagingDescriptorAllocator* GetSamplerStagingDescriptorAllocator( uint32_t descriptorCount) const; SamplerHeapCache* GetSamplerHeapCache(); StagingDescriptorAllocator* GetRenderTargetViewAllocator() const; StagingDescriptorAllocator* GetDepthStencilViewAllocator() const; Ref CreateD3D12ExternalTexture(const TextureDescriptor* descriptor, ComPtr d3d12Texture, Ref d3d11on12Resource, bool isSwapChainTexture, bool isInitialized); ComPtr GetOrCreateD3D11on12Device(); void InitTogglesFromDriver(); uint32_t GetOptimalBytesPerRowAlignment() const override; uint64_t GetOptimalBufferToTextureCopyOffsetAlignment() const override; float GetTimestampPeriodInNS() const override; bool ShouldDuplicateNumWorkgroupsForDispatchIndirect( ComputePipelineBase* computePipeline) const override; bool MayRequireDuplicationOfIndirectParameters() const override; bool ShouldDuplicateParametersForDrawIndirect( const RenderPipelineBase* renderPipelineBase) const override; bool IsFeatureEnabled(Feature feature) const override; // Dawn APIs void SetLabelImpl() override; private: using DeviceBase::DeviceBase; ResultOrError> CreateBindGroupImpl( const BindGroupDescriptor* descriptor) override; ResultOrError> CreateBindGroupLayoutImpl( const BindGroupLayoutDescriptor* descriptor, PipelineCompatibilityToken pipelineCompatibilityToken) override; ResultOrError> CreateBufferImpl(const BufferDescriptor* descriptor) override; ResultOrError> CreatePipelineLayoutImpl( const PipelineLayoutDescriptor* descriptor) override; ResultOrError> CreateQuerySetImpl( const QuerySetDescriptor* descriptor) override; ResultOrError> CreateSamplerImpl(const SamplerDescriptor* descriptor) override; ResultOrError> CreateShaderModuleImpl( const ShaderModuleDescriptor* descriptor, ShaderModuleParseResult* parseResult, OwnedCompilationMessages* compilationMessages) override; ResultOrError> CreateSwapChainImpl( const SwapChainDescriptor* descriptor) override; ResultOrError> CreateSwapChainImpl( Surface* surface, NewSwapChainBase* previousSwapChain, const SwapChainDescriptor* descriptor) override; ResultOrError> CreateTextureImpl(const TextureDescriptor* descriptor) override; ResultOrError> CreateTextureViewImpl( TextureBase* texture, const TextureViewDescriptor* descriptor) override; Ref CreateUninitializedComputePipelineImpl( const ComputePipelineDescriptor* descriptor) override; Ref CreateUninitializedRenderPipelineImpl( const RenderPipelineDescriptor* descriptor) override; Ref GetOrCreatePipelineCacheImpl(const CacheKey& key) override; void InitializeComputePipelineAsyncImpl(Ref computePipeline, WGPUCreateComputePipelineAsyncCallback callback, void* userdata) override; void InitializeRenderPipelineAsyncImpl(Ref renderPipeline, WGPUCreateRenderPipelineAsyncCallback callback, void* userdata) override; void DestroyImpl() override; MaybeError WaitForIdleForDestruction() override; MaybeError CheckDebugLayerAndGenerateErrors(); void AppendDebugLayerMessages(ErrorData* error) override; MaybeError ApplyUseDxcToggle(); MaybeError CreateZeroBuffer(); ComPtr mFence; HANDLE mFenceEvent = nullptr; ResultOrError CheckAndUpdateCompletedSerials() override; ComPtr mD3d12Device; // Device is owned by adapter and will not be outlived. ComPtr mCommandQueue; ComPtr mD3d12SharingContract; // 11on12 device corresponding to mCommandQueue ComPtr mD3d11On12Device; ComPtr mDispatchIndirectSignature; ComPtr mDrawIndirectSignature; ComPtr mDrawIndexedIndirectSignature; CommandRecordingContext mPendingCommands; SerialQueue> mUsedComObjectRefs; std::unique_ptr mCommandAllocatorManager; std::unique_ptr mResourceAllocatorManager; std::unique_ptr mResidencyManager; static constexpr uint32_t kMaxSamplerDescriptorsPerBindGroup = 3 * kMaxSamplersPerShaderStage; static constexpr uint32_t kMaxViewDescriptorsPerBindGroup = kMaxBindingsPerPipelineLayout - kMaxSamplerDescriptorsPerBindGroup; static constexpr uint32_t kNumSamplerDescriptorAllocators = ConstexprLog2Ceil(kMaxSamplerDescriptorsPerBindGroup) + 1; static constexpr uint32_t kNumViewDescriptorAllocators = ConstexprLog2Ceil(kMaxViewDescriptorsPerBindGroup) + 1; // Index corresponds to Log2Ceil(descriptorCount) where descriptorCount is in // the range [0, kMaxSamplerDescriptorsPerBindGroup]. std::array, kNumViewDescriptorAllocators + 1> mViewAllocators; // Index corresponds to Log2Ceil(descriptorCount) where descriptorCount is in // the range [0, kMaxViewDescriptorsPerBindGroup]. std::array, kNumSamplerDescriptorAllocators + 1> mSamplerAllocators; std::unique_ptr mRenderTargetViewAllocator; std::unique_ptr mDepthStencilViewAllocator; std::unique_ptr mViewShaderVisibleDescriptorAllocator; std::unique_ptr mSamplerShaderVisibleDescriptorAllocator; // Sampler cache needs to be destroyed before the CPU sampler allocator to ensure the final // release is called. std::unique_ptr mSamplerHeapCache; // A buffer filled with zeros that is used to copy into other buffers when they need to be // cleared. Ref mZeroBuffer; // The number of nanoseconds required for a timestamp query to be incremented by 1 float mTimestampPeriod = 1.0f; }; } // namespace dawn::native::d3d12 #endif // SRC_DAWN_NATIVE_D3D12_DEVICED3D12_H_