Rendering API clean-up
[platform/core/uifw/dali-core.git] / dali / internal / render / shaders / scene-graph-shader.h
1 #ifndef __DALI_INTERNAL_SCENE_GRAPH_SHADER_H__
2 #define __DALI_INTERNAL_SCENE_GRAPH_SHADER_H__
3
4 /*
5  * Copyright (c) 2015 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 // INTERNAL INCLUDES
22 #include <dali/public-api/common/dali-vector.h>
23 #include <dali/public-api/shader-effects/shader-effect.h>
24
25 #include <dali/internal/common/shader-data.h>
26
27 #include <dali/internal/common/buffer-index.h>
28 #include <dali/internal/common/type-abstraction-enums.h>
29
30 #include <dali/internal/event/common/event-thread-services.h>
31 #include <dali/internal/event/effects/shader-declarations.h>
32
33 #include <dali/internal/update/common/property-owner.h>
34 #include <dali/internal/update/common/scene-graph-connection-change-propagator.h>
35
36 #include <dali/internal/render/gl-resources/gl-resource-owner.h>
37 #include <dali/internal/render/gl-resources/texture-declarations.h>
38
39 #include <dali/internal/render/common/render-manager.h>
40
41
42 namespace Dali
43 {
44
45 namespace Internal
46 {
47
48 class Program;
49
50 namespace SceneGraph
51 {
52
53 class RenderQueue;
54 class UniformMeta;
55 class TextureCache;
56 class ConnectionObserver;
57 class SceneController;
58
59 /**
60  * A base class for a collection of shader programs, to apply an effect to different geometry types.
61  * This class is also the default shader so its easier to override default behaviour
62  */
63 class Shader : public PropertyOwner, public UniformMap::Observer
64 {
65 public:
66
67   /**
68    * Constructor
69    * @param hints Geometry hints
70    */
71   Shader( Dali::ShaderEffect::GeometryHints& hints );
72
73   /**
74    * Virtual destructor
75    */
76   virtual ~Shader();
77
78   /**
79    * Second stage initialization, called when added to the UpdateManager
80    * @param renderQueue Used to queue messages from update to render thread.
81    * @param textureCache Used to retrieve effect textures when rendering.
82    */
83   void Initialize( RenderQueue& renderQueue, TextureCache& textureCache );
84
85   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
86   // The following methods are called during UpdateManager::Update()
87   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
88
89   /**
90    * Query whether a shader geometry hint is set.
91    * @pre The shader has been initialized.
92    * @param[in] hint The geometry hint to check.
93    * @return True if the given geometry hint is set.
94    */
95   bool GeometryHintEnabled( Dali::ShaderEffect::GeometryHints hint ) const
96   {
97     return mGeometryHints & hint;
98   }
99
100   /**
101    * Retrieve the set of geometry hints.
102    * @return The hints.
103    */
104   Dali::ShaderEffect::GeometryHints GetGeometryHints() const
105   {
106     return mGeometryHints;
107   }
108
109   /**
110    * Set the geometry hints.
111    * @param[in] hints The hints.
112    */
113   void SetGeometryHints( Dali::ShaderEffect::GeometryHints hints )
114   {
115     mGeometryHints = hints;
116   }
117
118   /**
119    * @return True if the fragment shader outputs only 1.0 on the alpha channel
120    *
121    * @note Shaders that can output any value on the alpha channel
122    * including 1.0 should return false for this.
123    */
124   bool IsOutputOpaque();
125
126   /**
127    * @return True if the fragment shader can output any value but 1.0 on the alpha channel
128    *
129    * @note Shaders that can output any value on the alpha channel
130    * including 1.0 should return false for this
131    */
132   bool IsOutputTransparent();
133
134   /**
135    * @copydoc Dali::Internal::SceneGraph::PropertyOwner::ResetDefaultProperties
136    */
137   virtual void ResetDefaultProperties( BufferIndex updateBufferIndex )
138   {
139     // no default properties
140   }
141
142   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
143   // The following methods are called in Render thread
144   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
145
146   /**
147    * @brief Set the program for this shader.
148    * @param[in] shaderData        The program's vertex/fragment source and optionally precompiled shader binary.
149    * @param[in] programCache      Owner of the Programs.
150    * @param[in] modifiesGeometry  True if the vertex shader changes the positions of vertexes such that
151    * they might exceed the bounding box of vertexes passing through the default transformation.
152    */
153   void SetProgram( Internal::ShaderDataPtr shaderData,
154                    ProgramCache* programCache,
155                    bool modifiesGeometry );
156
157   /**
158    * Get the program built for this shader
159    * @return The program built from the shader sources.
160    */
161   Program* GetProgram();
162
163 public: // Implementation of ObjectOwnerContainer template methods
164
165   /**
166    * Connect the object to the scene graph
167    *
168    * @param[in] sceneController The scene controller - used for sending messages to render thread
169    * @param[in] bufferIndex The current buffer index - used for sending messages to render thread
170    */
171   void ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex );
172
173   /**
174    * Disconnect the object from the scene graph
175    * @param[in] sceneController The scene controller - used for sending messages to render thread
176    * @param[in] bufferIndex The current buffer index - used for sending messages to render thread
177    */
178   void DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex );
179
180 public: // Implementation of ConnectionChangePropagator
181
182   /**
183    * @copydoc ConnectionChangePropagator::AddObserver
184    */
185   void AddConnectionObserver(ConnectionChangePropagator::Observer& observer);
186
187   /**
188    * @copydoc ConnectionChangePropagator::RemoveObserver
189    */
190   void RemoveConnectionObserver(ConnectionChangePropagator::Observer& observer);
191
192 public:
193
194 public: // UniformMap::Observer
195   /**
196    * @copydoc UniformMap::Observer::UniformMappingsChanged
197    */
198   virtual void UniformMappingsChanged( const UniformMap& mappings );
199
200 private: // Data
201
202   Dali::ShaderEffect::GeometryHints mGeometryHints;    ///< shader geometry hints for building the geometry
203   float                          mGridDensity;      ///< grid density
204
205   Texture*                       mTexture;          ///< Raw Pointer to Texture
206   Integration::ResourceId        mRenderTextureId;  ///< Copy of the texture ID for the render thread
207   Integration::ResourceId        mUpdateTextureId;  ///< Copy of the texture ID for update thread
208
209   Program*                       mProgram;
210
211   ConnectionChangePropagator     mConnectionObservers;
212
213   // These members are only safe to access during UpdateManager::Update()
214   RenderQueue*                   mRenderQueue;                   ///< Used for queuing a message for the next Render
215
216   // These members are only safe to access in render thread
217   TextureCache*                  mTextureCache; // Used for retrieving textures in the render thread
218 };
219
220 } // namespace SceneGraph
221
222 } // namespace Internal
223
224 } // namespace Dali
225
226 #endif // __DALI_INTERNAL_SCENE_GRAPH_SHADER_H__