dawn-cmake/src/dawn_native/d3d12/DeviceD3D12.h

210 lines
8.7 KiB
C
Raw Normal View History

// Copyright 2017 The Dawn Authors
2017-06-05 21:08:55 +00:00
//
// 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_
2017-06-05 21:08:55 +00:00
#include "dawn_native/dawn_platform.h"
2017-06-05 21:08:55 +00:00
#include "common/Constants.h"
#include "common/SerialQueue.h"
2018-07-24 11:53:51 +00:00
#include "dawn_native/Device.h"
#include "dawn_native/d3d12/CommandRecordingContext.h"
#include "dawn_native/d3d12/D3D12Info.h"
2018-07-24 11:53:51 +00:00
#include "dawn_native/d3d12/Forward.h"
#include "dawn_native/d3d12/ResourceHeapAllocationD3D12.h"
2017-06-05 21:13:58 +00:00
#include <memory>
namespace dawn_native { namespace d3d12 {
2017-06-05 21:08:55 +00:00
2017-06-16 19:23:10 +00:00
class CommandAllocatorManager;
class DescriptorHeapAllocator;
class PlatformFunctions;
class ResidencyManager;
class ResourceAllocatorManager;
class SamplerHeapCache;
class ShaderVisibleDescriptorAllocator;
class StagingDescriptorAllocator;
2017-06-16 19:23:10 +00:00
#define ASSERT_SUCCESS(hr) \
do { \
HRESULT succeeded = hr; \
ASSERT(SUCCEEDED(succeeded)); \
} while (0)
2017-06-05 21:13:58 +00:00
2017-06-05 21:08:55 +00:00
// Definition of backend types
class Device : public DeviceBase {
2017-11-24 19:04:22 +00:00
public:
static ResultOrError<Device*> Create(Adapter* adapter, const DeviceDescriptor* descriptor);
~Device() override;
2017-11-24 19:04:22 +00:00
MaybeError Initialize();
CommandBufferBase* CreateCommandBuffer(CommandEncoder* encoder,
const CommandBufferDescriptor* descriptor) override;
2017-11-24 19:04:22 +00:00
MaybeError TickImpl() override;
2017-11-24 19:04:22 +00:00
ID3D12Device* GetD3D12Device() const;
ComPtr<ID3D12CommandQueue> GetCommandQueue() const;
ID3D12SharingContract* GetSharingContract() const;
ComPtr<ID3D12CommandSignature> GetDispatchIndirectSignature() const;
ComPtr<ID3D12CommandSignature> GetDrawIndirectSignature() const;
ComPtr<ID3D12CommandSignature> GetDrawIndexedIndirectSignature() const;
CommandAllocatorManager* GetCommandAllocatorManager() const;
ResidencyManager* GetResidencyManager() const;
const PlatformFunctions* GetFunctions() const;
ComPtr<IDXGIFactory4> GetFactory() const;
ResultOrError<IDxcLibrary*> GetOrCreateDxcLibrary() const;
ResultOrError<IDxcCompiler*> GetOrCreateDxcCompiler() const;
2017-11-24 19:04:22 +00:00
ResultOrError<CommandRecordingContext*> GetPendingCommandContext();
2017-11-24 19:04:22 +00:00
const D3D12DeviceInfo& GetDeviceInfo() const;
MaybeError NextSerial();
MaybeError WaitForSerial(Serial serial);
2017-11-24 19:04:22 +00:00
void ReferenceUntilUnused(ComPtr<IUnknown> object);
MaybeError ExecutePendingCommandContext();
2017-11-24 19:04:22 +00:00
ResultOrError<std::unique_ptr<StagingBufferBase>> CreateStagingBuffer(size_t size) override;
MaybeError CopyFromStagingToBuffer(StagingBufferBase* source,
uint64_t sourceOffset,
BufferBase* destination,
uint64_t destinationOffset,
uint64_t size) override;
ResultOrError<ResourceHeapAllocation> 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<TextureBase> WrapSharedHandle(const ExternalImageDescriptor* descriptor,
HANDLE sharedHandle,
uint64_t acquireMutexKey,
bool isSwapChainTexture);
ResultOrError<ComPtr<IDXGIKeyedMutex>> CreateKeyedMutexForTexture(
ID3D12Resource* d3d12Resource);
void ReleaseKeyedMutexForTexture(ComPtr<IDXGIKeyedMutex> dxgiKeyedMutex);
void InitTogglesFromDriver();
2017-11-24 19:04:22 +00:00
private:
using DeviceBase::DeviceBase;
ResultOrError<BindGroupBase*> CreateBindGroupImpl(
const BindGroupDescriptor* descriptor) override;
ResultOrError<BindGroupLayoutBase*> CreateBindGroupLayoutImpl(
const BindGroupLayoutDescriptor* descriptor) override;
ResultOrError<BufferBase*> CreateBufferImpl(const BufferDescriptor* descriptor) override;
ResultOrError<ComputePipelineBase*> CreateComputePipelineImpl(
const ComputePipelineDescriptor* descriptor) override;
ResultOrError<PipelineLayoutBase*> CreatePipelineLayoutImpl(
const PipelineLayoutDescriptor* descriptor) override;
ResultOrError<RenderPipelineBase*> CreateRenderPipelineImpl(
const RenderPipelineDescriptor* descriptor) override;
ResultOrError<SamplerBase*> CreateSamplerImpl(const SamplerDescriptor* descriptor) override;
ResultOrError<ShaderModuleBase*> CreateShaderModuleImpl(
const ShaderModuleDescriptor* descriptor) override;
ResultOrError<SwapChainBase*> CreateSwapChainImpl(
const SwapChainDescriptor* descriptor) override;
ResultOrError<NewSwapChainBase*> CreateSwapChainImpl(
Surface* surface,
NewSwapChainBase* previousSwapChain,
const SwapChainDescriptor* descriptor) override;
ResultOrError<Ref<TextureBase>> CreateTextureImpl(
const TextureDescriptor* descriptor) override;
ResultOrError<TextureViewBase*> CreateTextureViewImpl(
TextureBase* texture,
const TextureViewDescriptor* descriptor) override;
Simplify the device lifecycle. What was previously the Device's loss status is now a state that also contains the "being created" state. Its transitions are entirely handled in the frontend which enforces somewhat uniform lifecycles between backends. The backend devices' ShutDownImpl() function is now guaranteed to be called only during the destructor, which leads to further simplification. Previously Destroy() could also be called when the device was first lost. This require complications because, for example, a WGPUBuffer could still exist, and would want to call some resource allocator service after the call to Destroy(). Now destruction of the device's backing API objects is deferred to the destructor. (that's ok as long as the application can't submit any more work). WaitForCompletion is now guaranteed to be called before ShutDownImpl() iff the call to DeviceBase::Initialize was succesful and the backing device not lost. The idea is that after DeviceBase::Initialize, the GPU can have some work enqueued and we need to wait for it to complete before deleting backing API objects. In the future we might also have backend be reentrant, using WebGPU itself to implement parts of the backend. Reentrant calls would only be allowed after DeviceBase::Initialize. Also the DynamicUploader that was special-cased in all backends is now handled entirely by the frontend. Bug: dawn:373 Change-Id: I985417d67727ea3bc11849c999c5ef0e02403223 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/18801 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Austin Eng <enga@chromium.org>
2020-04-07 16:19:47 +00:00
void ShutDownImpl() override;
MaybeError WaitForIdleForDestruction() override;
MaybeError CheckDebugLayerAndGenerateErrors();
2017-11-24 19:04:22 +00:00
ComPtr<ID3D12Fence> mFence;
HANDLE mFenceEvent = nullptr;
Serial CheckAndUpdateCompletedSerials() override;
2017-11-24 19:04:22 +00:00
ComPtr<ID3D12Device> mD3d12Device; // Device is owned by adapter and will not be outlived.
2017-11-24 19:04:22 +00:00
ComPtr<ID3D12CommandQueue> mCommandQueue;
ComPtr<ID3D12SharingContract> mD3d12SharingContract;
// 11on12 device and device context corresponding to mCommandQueue
ComPtr<ID3D11On12Device> mD3d11On12Device;
ComPtr<ID3D11DeviceContext2> mD3d11On12DeviceContext;
2017-11-24 19:04:22 +00:00
ComPtr<ID3D12CommandSignature> mDispatchIndirectSignature;
ComPtr<ID3D12CommandSignature> mDrawIndirectSignature;
ComPtr<ID3D12CommandSignature> mDrawIndexedIndirectSignature;
CommandRecordingContext mPendingCommands;
SerialQueue<ComPtr<IUnknown>> mUsedComObjectRefs;
std::unique_ptr<CommandAllocatorManager> mCommandAllocatorManager;
std::unique_ptr<ResourceAllocatorManager> mResourceAllocatorManager;
std::unique_ptr<ResidencyManager> mResidencyManager;
// Index corresponds to the descriptor count in the range [0, kMaxBindingsPerGroup].
static constexpr uint32_t kNumOfStagingDescriptorAllocators = kMaxBindingsPerGroup + 1;
std::array<std::unique_ptr<StagingDescriptorAllocator>, kNumOfStagingDescriptorAllocators>
mViewAllocators;
std::array<std::unique_ptr<StagingDescriptorAllocator>, kNumOfStagingDescriptorAllocators>
mSamplerAllocators;
std::unique_ptr<StagingDescriptorAllocator> mRenderTargetViewAllocator;
std::unique_ptr<StagingDescriptorAllocator> mDepthStencilViewAllocator;
std::unique_ptr<ShaderVisibleDescriptorAllocator> mViewShaderVisibleDescriptorAllocator;
std::unique_ptr<ShaderVisibleDescriptorAllocator> mSamplerShaderVisibleDescriptorAllocator;
// Sampler cache needs to be destroyed before the CPU sampler allocator to ensure the final
// release is called.
std::unique_ptr<SamplerHeapCache> mSamplerHeapCache;
2017-06-05 21:08:55 +00:00
};
}} // namespace dawn_native::d3d12
2017-06-05 21:08:55 +00:00
#endif // DAWNNATIVE_D3D12_DEVICED3D12_H_