1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2017 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrBackendSemaphore_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrBackendSemaphore_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h" // IWYU pragma: keep 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAPI.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAnySubclass.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrD3DTypesMinimal.h" 17*c8dee2aaSAndroid Build Coastguard Worker #endif 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker class GrBackendSemaphoreData; 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker /** 24*c8dee2aaSAndroid Build Coastguard Worker * Wrapper class for passing into and receiving data from Ganesh about a backend semaphore object. 25*c8dee2aaSAndroid Build Coastguard Worker */ 26*c8dee2aaSAndroid Build Coastguard Worker class SK_API GrBackendSemaphore { 27*c8dee2aaSAndroid Build Coastguard Worker public: 28*c8dee2aaSAndroid Build Coastguard Worker // The GrBackendSemaphore cannot be used until either init* is called, which will set the 29*c8dee2aaSAndroid Build Coastguard Worker // appropriate GrBackend. 30*c8dee2aaSAndroid Build Coastguard Worker GrBackendSemaphore(); 31*c8dee2aaSAndroid Build Coastguard Worker ~GrBackendSemaphore(); 32*c8dee2aaSAndroid Build Coastguard Worker GrBackendSemaphore(const GrBackendSemaphore&); 33*c8dee2aaSAndroid Build Coastguard Worker GrBackendSemaphore& operator=(const GrBackendSemaphore&); 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D initDirect3D(const GrD3DFenceInfo & info)36*c8dee2aaSAndroid Build Coastguard Worker void initDirect3D(const GrD3DFenceInfo& info) { 37*c8dee2aaSAndroid Build Coastguard Worker fBackend = GrBackendApi::kDirect3D; 38*c8dee2aaSAndroid Build Coastguard Worker this->assignD3DFenceInfo(info); 39*c8dee2aaSAndroid Build Coastguard Worker fIsInitialized = true; 40*c8dee2aaSAndroid Build Coastguard Worker } 41*c8dee2aaSAndroid Build Coastguard Worker #endif 42*c8dee2aaSAndroid Build Coastguard Worker isInitialized()43*c8dee2aaSAndroid Build Coastguard Worker bool isInitialized() const { return fIsInitialized; } backend()44*c8dee2aaSAndroid Build Coastguard Worker GrBackendApi backend() const { return fBackend; } 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D 47*c8dee2aaSAndroid Build Coastguard Worker bool getD3DFenceInfo(GrD3DFenceInfo* outInfo) const; 48*c8dee2aaSAndroid Build Coastguard Worker #endif 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker private: 51*c8dee2aaSAndroid Build Coastguard Worker friend class GrBackendSemaphorePriv; 52*c8dee2aaSAndroid Build Coastguard Worker friend class GrBackendSemaphoreData; 53*c8dee2aaSAndroid Build Coastguard Worker // Size determined by looking at the GrBackendSemaphoreData subclasses, then 54*c8dee2aaSAndroid Build Coastguard Worker // guessing-and-checking. Compiler will complain if this is too small - in that case, 55*c8dee2aaSAndroid Build Coastguard Worker // just increase the number. 56*c8dee2aaSAndroid Build Coastguard Worker inline constexpr static size_t kMaxSubclassSize = 24; 57*c8dee2aaSAndroid Build Coastguard Worker using AnySemaphoreData = SkAnySubclass<GrBackendSemaphoreData, kMaxSubclassSize>; 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker template <typename SemaphoreData> GrBackendSemaphore(GrBackendApi api,SemaphoreData data)60*c8dee2aaSAndroid Build Coastguard Worker GrBackendSemaphore(GrBackendApi api, SemaphoreData data) : fBackend(api), fIsInitialized(true) { 61*c8dee2aaSAndroid Build Coastguard Worker fSemaphoreData.emplace<SemaphoreData>(data); 62*c8dee2aaSAndroid Build Coastguard Worker } 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D 65*c8dee2aaSAndroid Build Coastguard Worker void assignD3DFenceInfo(const GrD3DFenceInfo& info); 66*c8dee2aaSAndroid Build Coastguard Worker #endif 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker GrBackendApi fBackend; 69*c8dee2aaSAndroid Build Coastguard Worker AnySemaphoreData fSemaphoreData; 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker union { 72*c8dee2aaSAndroid Build Coastguard Worker void* fPlaceholder; // TODO(293490566) 73*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D 74*c8dee2aaSAndroid Build Coastguard Worker GrD3DFenceInfo* fD3DFenceInfo; 75*c8dee2aaSAndroid Build Coastguard Worker #endif 76*c8dee2aaSAndroid Build Coastguard Worker }; 77*c8dee2aaSAndroid Build Coastguard Worker bool fIsInitialized; 78*c8dee2aaSAndroid Build Coastguard Worker }; 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker #endif 81