// 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 DAWNNATIVE_D3D12_DEVICED3D12_H_ #define DAWNNATIVE_D3D12_DEVICED3D12_H_ #include "dawn_native/dawn_platform.h" #include "common/SerialQueue.h" #include "dawn_native/Device.h" #include "dawn_native/d3d12/Forward.h" #include "dawn_native/d3d12/d3d12_platform.h" #include namespace dawn_native { namespace d3d12 { class CommandAllocatorManager; class DescriptorHeapAllocator; class MapRequestTracker; class PlatformFunctions; class ResourceAllocator; class ResourceUploader; void ASSERT_SUCCESS(HRESULT hr); // Definition of backend types class Device : public DeviceBase { public: Device(); ~Device(); BindGroupBase* CreateBindGroup(BindGroupBuilder* builder) override; BlendStateBase* CreateBlendState(BlendStateBuilder* builder) override; BufferViewBase* CreateBufferView(BufferViewBuilder* builder) override; CommandBufferBase* CreateCommandBuffer(CommandBufferBuilder* builder) override; DepthStencilStateBase* CreateDepthStencilState(DepthStencilStateBuilder* builder) override; InputStateBase* CreateInputState(InputStateBuilder* builder) override; RenderPassDescriptorBase* CreateRenderPassDescriptor( RenderPassDescriptorBuilder* builder) override; RenderPipelineBase* CreateRenderPipeline(RenderPipelineBuilder* builder) override; SwapChainBase* CreateSwapChain(SwapChainBuilder* builder) override; TextureViewBase* CreateDefaultTextureView(TextureBase* texture) override; void TickImpl() override; const dawn_native::PCIInfo& GetPCIInfo() const override; ComPtr GetFactory(); ComPtr GetD3D12Device(); ComPtr GetCommandQueue(); DescriptorHeapAllocator* GetDescriptorHeapAllocator(); MapRequestTracker* GetMapRequestTracker() const; const PlatformFunctions* GetFunctions(); ResourceAllocator* GetResourceAllocator(); ResourceUploader* GetResourceUploader(); void OpenCommandList(ComPtr* commandList); ComPtr GetPendingCommandList(); uint64_t GetSerial() const; void NextSerial(); void WaitForSerial(uint64_t serial); void ReferenceUntilUnused(ComPtr object); void ExecuteCommandLists(std::initializer_list commandLists); private: ResultOrError CreateBindGroupLayoutImpl( const BindGroupLayoutDescriptor* descriptor) override; ResultOrError CreateBufferImpl(const BufferDescriptor* descriptor) override; ResultOrError CreateComputePipelineImpl( const ComputePipelineDescriptor* descriptor) override; ResultOrError CreatePipelineLayoutImpl( const PipelineLayoutDescriptor* descriptor) override; ResultOrError CreateQueueImpl() override; ResultOrError CreateSamplerImpl(const SamplerDescriptor* descriptor) override; ResultOrError CreateShaderModuleImpl( const ShaderModuleDescriptor* descriptor) override; ResultOrError CreateTextureImpl(const TextureDescriptor* descriptor) override; void CollectPCIInfo(); // Keep mFunctions as the first member so that in the destructor it is freed. Otherwise the // D3D12 DLLs are unloaded before we are done using it. std::unique_ptr mFunctions; uint64_t mSerial = 0; ComPtr mFence; HANDLE mFenceEvent; ComPtr mFactory; ComPtr mHardwareAdapter; ComPtr mD3d12Device; ComPtr mCommandQueue; struct PendingCommandList { ComPtr commandList; bool open = false; } mPendingCommands; SerialQueue> mUsedComObjectRefs; std::unique_ptr mCommandAllocatorManager; std::unique_ptr mDescriptorHeapAllocator; std::unique_ptr mMapRequestTracker; std::unique_ptr mResourceAllocator; std::unique_ptr mResourceUploader; dawn_native::PCIInfo mPCIInfo; }; }} // namespace dawn_native::d3d12 #endif // DAWNNATIVE_D3D12_DEVICED3D12_H_