[SRUK] Initial copy from Tizen 2.2 version
[platform/core/uifw/dali-core.git] / dali / internal / render / common / render-instruction.cpp
1 //
2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Flora License, Version 1.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //     http://floralicense.org/license/
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an AS IS BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 // CLASS HEADER
18 #include <dali/internal/render/common/render-instruction.h>
19
20 // INTERNAL INCLUDES
21 #include <dali/public-api/common/constants.h> // for Color::BLACK
22 #include <dali/internal/render/common/render-tracker.h>
23
24 namespace Dali
25 {
26
27 namespace Internal
28 {
29
30 namespace SceneGraph
31 {
32
33 RenderInstruction::RenderInstruction()
34 : mViewMatrix( 0 ),
35   mProjectionMatrix( 0 ),
36   mRenderTracker( NULL ),
37   mClearColor(),
38   mIsViewportSet( false ),
39   mIsClearColorSet( false ),
40   mOffscreenTextureId( 0 ),
41   mNextFreeRenderList( 0 )
42 {
43   // reserve 6 lists, which is enough for three layers with opaque and transparent things on
44   mRenderLists.Reserve( 6 );
45 }
46
47 RenderInstruction::~RenderInstruction()
48 { // pointer container releases the renderlists
49 }
50
51 RenderList& RenderInstruction::GetNextFreeRenderList( size_t capacityRequired )
52 {
53   // check if we have enough lists, we can only be one behind at worst
54   if( mRenderLists.Count() <= mNextFreeRenderList )
55   {
56     mRenderLists.PushBack( new RenderList ); // Push a new empty render list
57   }
58
59   // check capacity of the list and reserve if not big enough
60   if( mRenderLists[ mNextFreeRenderList ]->Capacity() < capacityRequired )
61   {
62     mRenderLists[ mNextFreeRenderList ]->Reserve( capacityRequired );
63   }
64
65   // return the list mNextFreeRenderList points to and increase by one
66   return *mRenderLists[ mNextFreeRenderList++ ];
67 }
68
69 void RenderInstruction::UpdateCompleted()
70 {
71   // lets do some housekeeping, remove any lists that were not needed because
72   // application might have removed a layer permanently
73   RenderListContainer::Iterator iter = mRenderLists.Begin();
74   RenderListContainer::ConstIterator end = mRenderLists.End();
75   for( ;iter != end; ++iter )
76   {
77     // tell the list to do its housekeeping
78     (*iter)->ReleaseUnusedItems();
79   }
80
81   // release any extra lists
82   if( mRenderLists.Count() > mNextFreeRenderList )
83   {
84     mRenderLists.Resize( mNextFreeRenderList );
85   }
86 }
87
88 RenderListContainer::SizeType RenderInstruction::RenderListCount() const
89 {
90   return mNextFreeRenderList;
91 }
92
93 const RenderList* RenderInstruction::GetRenderList( RenderListContainer::SizeType index ) const
94 {
95   DALI_ASSERT_ALWAYS( (index < mNextFreeRenderList ) && "Renderlist index out of scope" );
96   return mRenderLists[ index ];
97 }
98
99 void RenderInstruction::Reset( const Matrix*   viewMatrix,
100                                const Matrix*   projectionMatrix,
101                                unsigned int    offscreenTextureId,
102                                const Viewport* viewport,
103                                const Vector4*  clearColor )
104 {
105   mViewMatrix = viewMatrix;
106   mProjectionMatrix = projectionMatrix;
107   mViewport = viewport ? *viewport : Viewport();
108   mIsViewportSet = NULL != viewport;
109   mClearColor = clearColor ? *clearColor : Color::BLACK;
110   mIsClearColorSet = NULL != clearColor;
111   mOffscreenTextureId = offscreenTextureId;
112   mRenderTracker = NULL;
113   mNextFreeRenderList = 0;
114
115   RenderListContainer::Iterator iter = mRenderLists.Begin();
116   RenderListContainer::ConstIterator end = mRenderLists.End();
117   for( ;iter != end; ++iter )
118   {
119     // since mRenderLists is a vector of RenderLists we dont want to clear it
120     // as it ends up releasing and later reallocating loads of vectors
121     // reset the renderlist
122     (*iter)->Reset();
123   }
124 }
125
126 } // namespace SceneGraph
127
128 } // namespace Internal
129
130 } // namespace Dali