| /* | |
| * Copyright 2020 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "include/gpu/ganesh/GrBackendSemaphore.h" | |
| #include "include/private/base/SkAssert.h" | |
| #include "include/private/base/SkDebug.h" | |
| #include "src/gpu/ganesh/GrBackendSemaphorePriv.h" | |
| #ifdef SK_DIRECT3D | |
| #include "include/gpu/ganesh/d3d/GrD3DTypes.h" | |
| #endif | |
| GrBackendSemaphore::GrBackendSemaphore() | |
| : fBackend(GrBackendApi::kUnsupported), fIsInitialized(false) {} | |
| GrBackendSemaphoreData::~GrBackendSemaphoreData() = default; | |
| GrBackendSemaphore::~GrBackendSemaphore() { | |
| #ifdef SK_DIRECT3D | |
| if (fIsInitialized && GrBackendApi::kDirect3D == fBackend) { | |
| delete fD3DFenceInfo; | |
| fD3DFenceInfo = nullptr; | |
| fIsInitialized = false; | |
| } | |
| #endif | |
| } | |
| GrBackendSemaphore::GrBackendSemaphore(const GrBackendSemaphore& that) { | |
| fIsInitialized = false; | |
| *this = that; | |
| } | |
| GrBackendSemaphore& GrBackendSemaphore::operator=(const GrBackendSemaphore& that) { | |
| SkASSERT(!fIsInitialized || fBackend == that.fBackend); | |
| fBackend = that.fBackend; | |
| fSemaphoreData.reset(); | |
| switch (that.fBackend) { | |
| case GrBackendApi::kOpenGL: | |
| SK_ABORT("Unsupported"); | |
| break; | |
| case GrBackendApi::kVulkan: | |
| case GrBackendApi::kMetal: | |
| that.fSemaphoreData->copyTo(fSemaphoreData); | |
| break; | |
| #ifdef SK_DIRECT3D | |
| case GrBackendApi::kDirect3D: | |
| this->assignD3DFenceInfo(*that.fD3DFenceInfo); | |
| break; | |
| #endif | |
| default: | |
| SK_ABORT("Unknown GrBackend"); | |
| } | |
| fIsInitialized = true; | |
| return *this; | |
| } | |
| #ifdef SK_DIRECT3D | |
| void GrBackendSemaphore::assignD3DFenceInfo(const GrD3DFenceInfo& info) { | |
| SkASSERT(GrBackendApi::kDirect3D == fBackend); | |
| if (fIsInitialized) { | |
| *fD3DFenceInfo = info; | |
| } else { | |
| fD3DFenceInfo = new GrD3DFenceInfo(info); | |
| } | |
| } | |
| bool GrBackendSemaphore::getD3DFenceInfo(GrD3DFenceInfo* outInfo) const { | |
| if (fIsInitialized && GrBackendApi::kDirect3D == fBackend) { | |
| *outInfo = *fD3DFenceInfo; | |
| return true; | |
| } | |
| return false; | |
| } | |
| #endif // SK_DIRECT3D |