616f156056acad8e4b00cfa2ca42aff24d96e874
[platform/core/uifw/dali-adaptor.git] / dali / internal / graphics / gles20 / 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) 2014 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 <EGL/egl.h>
23 #include <EGL/eglext.h>
24 #include <dali/public-api/common/dali-common.h>
25 #include <dali/public-api/common/dali-vector.h>
26 #include <dali/integration-api/gl-sync-abstraction.h>
27
28 namespace Dali
29 {
30 namespace Internal
31 {
32 namespace Adaptor
33 {
34 class EglImplementation;
35
36 class EglSyncObject : public Integration::GlSyncAbstraction::SyncObject
37 {
38 public:
39   /**
40    * Constructor
41    */
42   EglSyncObject( EglImplementation& eglSyncImpl );
43
44   /**
45    * Destructor
46    */
47   virtual ~EglSyncObject();
48
49   /**
50    * @copydoc Dali::Integration::GlSyncAbstraction::SyncObject::IsSynced()
51    */
52   virtual bool IsSynced();
53
54 private:
55 #ifdef _ARCH_ARM_
56   EGLSyncKHR mEglSync;
57 #else
58   int mPollCounter; // Implementations without fence sync use a 3 frame counter
59 #endif
60   EglImplementation& mEglImplementation;
61 };
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   virtual SyncObject* CreateSyncObject();
95
96   /**
97    * @copydoc Dali::Integration::GlSyncAbstraction::DestroySyncObject()
98    */
99   virtual void DestroySyncObject(SyncObject* syncObject);
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__