1 /* 2 * Copyright 2020 Google LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "include/gpu/ganesh/GrBackendSemaphore.h" 9 10 #include "include/private/base/SkAssert.h" 11 #include "include/private/base/SkDebug.h" 12 #include "src/gpu/ganesh/GrBackendSemaphorePriv.h" 13 14 #ifdef SK_DIRECT3D 15 #include "include/gpu/ganesh/d3d/GrD3DTypes.h" 16 #endif 17 GrBackendSemaphore()18GrBackendSemaphore::GrBackendSemaphore() 19 : fBackend(GrBackendApi::kUnsupported), fIsInitialized(false) {} 20 21 GrBackendSemaphoreData::~GrBackendSemaphoreData() = default; 22 ~GrBackendSemaphore()23GrBackendSemaphore::~GrBackendSemaphore() { 24 #ifdef SK_DIRECT3D 25 if (fIsInitialized && GrBackendApi::kDirect3D == fBackend) { 26 delete fD3DFenceInfo; 27 fD3DFenceInfo = nullptr; 28 fIsInitialized = false; 29 } 30 #endif 31 } 32 GrBackendSemaphore(const GrBackendSemaphore & that)33GrBackendSemaphore::GrBackendSemaphore(const GrBackendSemaphore& that) { 34 fIsInitialized = false; 35 *this = that; 36 } 37 operator =(const GrBackendSemaphore & that)38GrBackendSemaphore& GrBackendSemaphore::operator=(const GrBackendSemaphore& that) { 39 SkASSERT(!fIsInitialized || fBackend == that.fBackend); 40 fBackend = that.fBackend; 41 fSemaphoreData.reset(); 42 switch (that.fBackend) { 43 case GrBackendApi::kOpenGL: 44 SK_ABORT("Unsupported"); 45 break; 46 case GrBackendApi::kVulkan: 47 case GrBackendApi::kMetal: 48 that.fSemaphoreData->copyTo(fSemaphoreData); 49 break; 50 #ifdef SK_DIRECT3D 51 case GrBackendApi::kDirect3D: 52 this->assignD3DFenceInfo(*that.fD3DFenceInfo); 53 break; 54 #endif 55 default: 56 SK_ABORT("Unknown GrBackend"); 57 } 58 fIsInitialized = true; 59 return *this; 60 } 61 62 #ifdef SK_DIRECT3D assignD3DFenceInfo(const GrD3DFenceInfo & info)63void GrBackendSemaphore::assignD3DFenceInfo(const GrD3DFenceInfo& info) { 64 SkASSERT(GrBackendApi::kDirect3D == fBackend); 65 if (fIsInitialized) { 66 *fD3DFenceInfo = info; 67 } else { 68 fD3DFenceInfo = new GrD3DFenceInfo(info); 69 } 70 } 71 getD3DFenceInfo(GrD3DFenceInfo * outInfo) const72bool GrBackendSemaphore::getD3DFenceInfo(GrD3DFenceInfo* outInfo) const { 73 if (fIsInitialized && GrBackendApi::kDirect3D == fBackend) { 74 *outInfo = *fD3DFenceInfo; 75 return true; 76 } 77 return false; 78 } 79 #endif // SK_DIRECT3D 80