Using custom graphics deleter in test harness
[platform/core/uifw/dali-adaptor.git] / dali / internal / graphics / gles / egl-sync-implementation.h
1 #ifndef DALI_INTERNAL_ADAPTOR_EGL_SYNC_IMPLEMENTATION_H
2 #define DALI_INTERNAL_ADAPTOR_EGL_SYNC_IMPLEMENTATION_H
3
4 /*
5  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <dali/integration-api/gl-sync-abstraction.h>
23 #include <dali/internal/graphics/common/egl-include.h>
24 #include <dali/public-api/common/dali-vector.h>
25
26 // INTERNAL INCLUDES
27 #include <dali/public-api/dali-adaptor-common.h>
28
29 namespace Dali
30 {
31 namespace Internal
32 {
33 namespace Adaptor
34 {
35 class EglImplementation;
36
37 class EglSyncObject : public Integration::GlSyncAbstraction::SyncObject
38 {
39 public:
40   /**
41    * Constructor
42    */
43   EglSyncObject(EglImplementation& eglSyncImpl);
44
45   /**
46    * Destructor
47    */
48   virtual ~EglSyncObject();
49
50   /**
51    * @copydoc Dali::Integration::GlSyncAbstraction::SyncObject::IsSynced()
52    */
53   bool IsSynced() override;
54
55 private:
56 #ifdef _ARCH_ARM_
57   EGLSyncKHR mEglSync;
58 #else
59   int mPollCounter; // Implementations without fence sync use a 3 frame counter
60 #endif
61   EglImplementation& mEglImplementation;
62 };
63
64 /**
65  * GlSyncImplementation is a concrete implementation for GlSyncAbstraction.
66  * It provides fence syncing for resources such as FrameBuffers using EGL extensions
67  *
68  * Sync objects are created in the render thread after a render instruction
69  * has been processed (i.e. GL draw calls have completed for a given FB), and
70  * tested in the update
71  */
72 class EglSyncImplementation : public Integration::GlSyncAbstraction
73 {
74 public:
75   /**
76    * Constructor
77    */
78   EglSyncImplementation();
79
80   /**
81    * Destructor
82    */
83   virtual ~EglSyncImplementation();
84
85   /**
86    * Initialize the sync object with the Egl implementation.
87    * @param[in] impl The EGL implementation (to access display)
88    */
89   void Initialize(EglImplementation* impl);
90
91   /**
92    * @copydoc Dali::Integration::GlSyncAbstraction::CreateSyncObject()
93    */
94   SyncObject* CreateSyncObject() override;
95
96   /**
97    * @copydoc Dali::Integration::GlSyncAbstraction::DestroySyncObject()
98    */
99   void DestroySyncObject(SyncObject* syncObject) override;
100
101 private:
102   /**
103    * Set up the function pointers
104    */
105   void InitializeEglSync();
106
107 private:
108   typedef Vector<EglSyncObject*>  SyncContainer;
109   typedef SyncContainer::Iterator SyncIter;
110
111   EglImplementation* mEglImplementation;    ///< Egl implementation (to get display)
112   bool               mSyncInitialized;      ///< Flag to perform initialization on first use
113   bool               mSyncInitializeFailed; ///< Flag to avoid reloading functions if failed once
114
115   SyncContainer mSyncObjects;
116 };
117
118 } // namespace Adaptor
119 } // namespace Internal
120 } // namespace Dali
121
122 #endif // DALI_INTERNAL_EGL_ADAPTOR_SYNC_IMPLEMENTATION_H