Merge branch 'devel/master(1.1.39)' into tizen
[platform/core/uifw/dali-core.git] / dali / internal / render / common / render-manager.h
1 #ifndef __DALI_INTERNAL_SCENE_GRAPH_RENDER_MANAGER_H__
2 #define __DALI_INTERNAL_SCENE_GRAPH_RENDER_MANAGER_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/math/rect.h>
23 #include <dali/internal/common/shader-saver.h>
24 #include <dali/internal/update/resources/resource-manager-declarations.h>
25 #include <dali/internal/render/common/texture-uploaded-dispatcher.h>
26 #include <dali/internal/render/gl-resources/gpu-buffer.h>
27 #include <dali/internal/render/renderers/render-property-buffer.h>
28 #include <dali/internal/event/rendering/texture-impl.h>
29
30 namespace Dali
31 {
32
33 namespace Integration
34 {
35 class GlAbstraction;
36 class GlSyncAbstraction;
37 class RenderStatus;
38 }
39
40 struct Vector4;
41
42 namespace Internal
43 {
44 class Context;
45 class ProgramCache;
46 class ShaderSaver;
47
48 namespace Render
49 {
50 class FrameBuffer;
51 class Renderer;
52 struct Sampler;
53 class RenderTracker;
54 class Geometry;
55 class NewTexture;
56 }
57
58 namespace SceneGraph
59 {
60 class RenderQueue;
61 class TextureCache;
62 class RenderInstruction;
63 class RenderInstructionContainer;
64 class Shader;
65 class PropertyBufferDataProvider;
66
67 /**
68  * RenderManager is responsible for rendering the result of the previous "update", which
69  * is provided in a RenderCommand during UpdateManager::Update().
70  */
71 class RenderManager : public TextureUploadedDispatcher
72 {
73 public:
74
75   /**
76    * Construct a new RenderManager.
77    * @param[in]  glAbstraction The GL abstraction used for rendering.
78    * @param[in]  glSyncAbstraction The GL sync abstraction used fence sync creation/deletion.
79    * @param[out] resourcePostProcessQueue A queue for sending rendered texture ids to the update-thread.
80    */
81   static RenderManager* New( Integration::GlAbstraction& glAbstraction,
82                              Integration::GlSyncAbstraction& glSyncAbstraction,
83                              LockedResourceQueue& resourcePostProcessQueue );
84
85   /**
86    * Non-virtual destructor; not intended as a base class
87    */
88   ~RenderManager();
89
90   /**
91    * Retrieve the RenderQueue. Messages should only be added to this from the update-thread.
92    * @return The render queue.
93    */
94   RenderQueue& GetRenderQueue();
95
96   /**
97    * Retrieve the texture cache. Messages should only be sent to this from the update thread,
98    * accessor methods should only be used from the render thread.
99    * @return The texture cache
100    */
101   TextureCache& GetTextureCache();
102
103   /**
104    * @copydoc Dali::Integration::Core::ContextCreated()
105    */
106   void ContextCreated();
107
108   /**
109    * @copydoc Dali::Integration::Core::ContextToBeDestroyed()
110    */
111   void ContextDestroyed();
112
113   /**
114    * Dispatch requests onto the postProcessResourcesQueue
115    * @param[in] resource The Id of the resource to dispatch
116    */
117   virtual void DispatchTextureUploaded( ResourceId resource );
118
119   /**
120    * Set the upstream interface for compiled shader binaries to be sent back to for eventual
121    * caching and saving.
122    * @param[in] upstream The abstract interface to send any received ShaderDatas onwards to..
123    * @note This should be called during core initialisation if shader binaries are to be used.
124    */
125   void SetShaderSaver( ShaderSaver& upstream );
126
127   /**
128    * Retrieve the render instructions; these should be set during each "update" traversal.
129    * @return The render instruction container.
130    */
131   RenderInstructionContainer& GetRenderInstructionContainer();
132
133   // The following methods should be called via RenderQueue messages
134
135   /**
136    * Set the background color i.e. the glClear color used at the beginning of each frame.
137    * @param[in] color The new background color.
138    */
139   void SetBackgroundColor( const Vector4& color );
140
141   /*
142    * Set the frame time delta (time elapsed since the last frame.
143    * @param[in] deltaTime the delta time
144    */
145   void SetFrameDeltaTime( float deltaTime );
146
147   /**
148    * Returns the rectangle for the default surface (probably the application window).
149    * @return Rectangle for the surface.
150    */
151   void SetDefaultSurfaceRect( const Rect<int>& rect );
152
153   /**
154    * Add a Renderer to the render manager.
155    * @param[in] renderer The renderer to add.
156    * @post renderer is owned by RenderManager
157    */
158   void AddRenderer( Render::Renderer* renderer );
159
160   /**
161    * Remove a Renderer from the render manager.
162    * @param[in] renderer The renderer to remove.
163    * @post renderer is destroyed.
164    */
165   void RemoveRenderer( Render::Renderer* renderer );
166
167   /**
168    * Add a sampler to the render manager.
169    * @param[in] sampler The sampler to add.
170    * @post sampler is owned by RenderManager
171    */
172   void AddSampler( Render::Sampler* sampler );
173
174   /**
175    * Remove a sampler from the render manager.
176    * @param[in] sampler The sampler to remove.
177    * @post sampler is destroyed.
178    */
179   void RemoveSampler( Render::Sampler* sampler );
180
181   /**
182    * Set minification and magnification filter modes for a sampler
183    * @param[in] minFilterMode Filter mode to use when the texture is minificated
184    * @param[in] magFilterMode Filter mode to use when the texture is magnified
185    */
186   void SetFilterMode( Render::Sampler* sampler, unsigned int minFilterMode, unsigned int magFilterMode );
187
188   /**
189    * Set wrapping mode for a sampler
190    * @param[in] rWrapMode Wrap mode in the z direction
191    * @param[in] uWrapMode Wrap mode in the x direction
192    * @param[in] vWrapMode Wrap mode in the y direction
193    */
194   void SetWrapMode( Render::Sampler* sampler, unsigned int rWrapMode, unsigned int sWrapMode, unsigned int tWrapMode );
195
196   /**
197    * Add a property buffer to the render manager.
198    * @param[in] propertyBuffer The property buffer to add.
199    * @post propertBuffer is owned by RenderManager
200    */
201   void AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer );
202
203   /**
204    * Remove a property buffer from the render manager.
205    * @param[in] propertyBuffer The property buffer to remove.
206    * @post propertyBuffer is destroyed.
207    */
208   void RemovePropertyBuffer( Render::PropertyBuffer* propertyBuffer );
209
210   /**
211    * Add a geometry to the render manager.
212    * @param[in] geometry The geometry to add.
213    * @post geometry is owned by RenderManager
214    */
215   void AddGeometry( Render::Geometry* geometry );
216
217   /**
218    * Remove a geometry from the render manager.
219    * @param[in] geometry The geometry to remove.
220    * @post geometry is destroyed.
221    */
222   void RemoveGeometry( Render::Geometry* geometry );
223
224   /**
225    * Adds a property buffer to a geometry from the render manager.
226    * @param[in] geometry The geometry
227    * @param[in] propertyBuffer The property buffer to remove.
228    */
229   void AddVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer );
230
231   /**
232    * Remove a property buffer from a Render::Geometry from the render manager.
233    * @param[in] geometry The geometry
234    * @param[in] propertyBuffer The property buffer to remove.
235    * @post property buffer is destroyed.
236    */
237   void RemoveVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer );
238
239   /**
240    * Sets the format of an existing property buffer
241    * @param[in] propertyBuffer The property buffer.
242    * @param[in] format The new format of the buffer
243    */
244   void SetPropertyBufferFormat( Render::PropertyBuffer* propertyBuffer, Render::PropertyBuffer::Format* format );
245
246   /**
247    * Sets the data of an existing property buffer
248    * @param[in] propertyBuffer The property buffer.
249    * @param[in] data The new data of the buffer
250    * @param[in] size The new size of the buffer
251    */
252   void SetPropertyBufferData( Render::PropertyBuffer* propertyBuffer, Dali::Vector<char>* data, size_t size );
253
254   /**
255    * Sets the data for the index buffer of an existing geometry
256    * @param[in] geometry The geometry
257    * @param[in] data A vector containing the indices
258    */
259   void SetIndexBuffer( Render::Geometry* geometry, Dali::Vector<unsigned short>& data );
260
261   /**
262    * Set the geometry type of an existing render geometry
263    * @param[in] geometry The render geometry
264    * @param[in] geometryType The new geometry type
265    */
266   void SetGeometryType( Render::Geometry* geometry, unsigned int geometryType );
267
268   /**
269    * Adds a texture to the render manager
270    * @param[in] texture The texture to add
271    */
272   void AddTexture( Render::NewTexture* texture );
273
274   /**
275    * Removes a texture from the render manager
276    * @param[in] texture The texture to remove
277    */
278   void RemoveTexture( Render::NewTexture* texture );
279
280   /**
281    * Uploads data to an existing texture
282    * @param[in] texture The texture
283    * @param[in] buffer Vector with the data to be uploaded
284    * @param[in] params The parameters for the upload
285    */
286   void UploadTexture( Render::NewTexture* texture, Vector<unsigned char>& buffer, const NewTexture::UploadParams& params );
287
288   /**
289    * Generates mipmaps for a given texture
290    * @param[in] texture The texture
291    */
292   void GenerateMipmaps( Render::NewTexture* texture );
293
294   /**
295    * Adds a framebuffer to the render manager
296    * @param[in] frameBuffer The framebuffer to add
297    */
298   void AddFrameBuffer( Render::FrameBuffer* frameBuffer );
299
300   /**
301    * Removes a framebuffer from the render manager
302    * @param[in] frameBuffer The framebuffer to remove
303    */
304   void RemoveFrameBuffer( Render::FrameBuffer* frameBuffer );
305
306   /**
307    * Attach a texture as color output to an existing FrameBuffer
308    * @param[in] frameBuffer The FrameBuffer
309    * @param[in] texture The texture that will be used as output when rendering
310    * @param[in] mipmapLevel The mipmap of the texture to be attached
311    * @param[in] layer Indicates which layer of a cube map or array texture to attach. Unused for 2D textures
312    */
313   void AttachColorTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::NewTexture* texture, unsigned int mipmapLevel, unsigned int layer );
314
315   /**
316    * Adds a render tracker to the RenderManager. RenderManager takes ownership of the
317    * tracker. The lifetime of the tracker is related to the lifetime of the tracked
318    * object, usually an offscreen render task.
319    * @param[in] renderTracker The render tracker
320    */
321   void AddRenderTracker( Render::RenderTracker* renderTracker );
322
323   /**
324    * Removes a render tracker from the RenderManager.
325    * @param[in] renderTracker The render tracker to remove.
326    */
327   void RemoveRenderTracker( Render::RenderTracker* renderTracker );
328
329   /**
330    * Set the default shader that is to be used in absence of custom shader
331    * @param[in] shader that is the default one
332    */
333   void SetDefaultShader( Shader* shader );
334
335   /**
336    * returns the Program controller for sending program messages
337    * @return the ProgramController
338    */
339   ProgramCache* GetProgramCache();
340
341   // This method should be called from Core::Render()
342
343   /**
344    * Renders the results of the previous "update" traversal.
345    * @param[out] status contains the flag that indicates if render instructions exist
346    * @return true if a further update is required
347    */
348   bool Render( Integration::RenderStatus& status );
349
350 private:
351
352   /**
353    * Helper to process a single RenderInstruction.
354    * @param[in] instruction A description of the rendering operation.
355    * @param[in] defaultShader default shader to use.
356    */
357   void DoRender( RenderInstruction& instruction, Shader& defaultShader );
358
359 private:
360
361   /**
362    * Construct a new RenderManager.
363    */
364   RenderManager();
365
366   // Undefined
367   RenderManager( const RenderManager& );
368
369   // Undefined
370   RenderManager& operator=( const RenderManager& rhs );
371
372 private:
373
374   struct Impl;
375   Impl* mImpl;
376
377 };
378
379 } // namespace SceneGraph
380
381 } // namespace Internal
382
383 } // namespace Dali
384
385 #endif // __DALI_INTERNAL_SCENE_GRAPH_RENDER_MANAGER_H__