| // Copyright 2022 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. |
| |
| #include "dawn/native/d3d12/FenceD3D12.h" |
| |
| #include <utility> |
| |
| #include "dawn/common/Log.h" |
| #include "dawn/native/Error.h" |
| #include "dawn/native/d3d/D3DError.h" |
| #include "dawn/native/d3d12/DeviceD3D12.h" |
| |
| namespace dawn::native::d3d12 { |
| |
| // static |
| ResultOrError<Ref<Fence>> Fence::CreateFromHandle(ID3D12Device* device, |
| HANDLE unownedHandle, |
| UINT64 fenceValue) { |
| ASSERT(unownedHandle != nullptr); |
| HANDLE ownedHandle = nullptr; |
| if (!::DuplicateHandle(::GetCurrentProcess(), unownedHandle, ::GetCurrentProcess(), |
| &ownedHandle, 0, FALSE, DUPLICATE_SAME_ACCESS)) { |
| return DAWN_DEVICE_LOST_ERROR("D3D12 fence dup handle"); |
| } |
| ComPtr<ID3D12Fence> d3d12Fence; |
| DAWN_TRY_WITH_CLEANUP( |
| CheckHRESULT(device->OpenSharedHandle(ownedHandle, IID_PPV_ARGS(&d3d12Fence)), |
| "D3D12 fence open handle"), |
| { ::CloseHandle(ownedHandle); }); |
| return AcquireRef(new Fence(std::move(d3d12Fence), fenceValue, ownedHandle)); |
| } |
| |
| Fence::Fence(ComPtr<ID3D12Fence> d3d12Fence, UINT64 fenceValue, HANDLE sharedHandle) |
| : mD3D12Fence(std::move(d3d12Fence)), mFenceValue(fenceValue), mSharedHandle(sharedHandle) {} |
| |
| Fence::~Fence() { |
| if (mSharedHandle != nullptr) { |
| ::CloseHandle(mSharedHandle); |
| } |
| } |
| |
| ID3D12Fence* Fence::GetD3D12Fence() const { |
| return mD3D12Fence.Get(); |
| } |
| |
| UINT64 Fence::GetFenceValue() const { |
| return mFenceValue; |
| } |
| |
| } // namespace dawn::native::d3d12 |