2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
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
8 // http://floralicense.org/license/
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.
18 #include <dali/internal/render/common/render-instruction.h>
21 #include <dali/public-api/common/constants.h> // for Color::BLACK
22 #include <dali/internal/render/common/render-tracker.h>
33 RenderInstruction::RenderInstruction()
35 mProjectionMatrix( 0 ),
36 mRenderTracker( NULL ),
38 mIsViewportSet( false ),
39 mIsClearColorSet( false ),
40 mOffscreenTextureId( 0 ),
41 mNextFreeRenderList( 0 )
43 // reserve 6 lists, which is enough for three layers with opaque and transparent things on
44 mRenderLists.Reserve( 6 );
47 RenderInstruction::~RenderInstruction()
48 { // pointer container releases the renderlists
51 RenderList& RenderInstruction::GetNextFreeRenderList( size_t capacityRequired )
53 // check if we have enough lists, we can only be one behind at worst
54 if( mRenderLists.Count() <= mNextFreeRenderList )
56 mRenderLists.PushBack( new RenderList ); // Push a new empty render list
59 // check capacity of the list and reserve if not big enough
60 if( mRenderLists[ mNextFreeRenderList ]->Capacity() < capacityRequired )
62 mRenderLists[ mNextFreeRenderList ]->Reserve( capacityRequired );
65 // return the list mNextFreeRenderList points to and increase by one
66 return *mRenderLists[ mNextFreeRenderList++ ];
69 void RenderInstruction::UpdateCompleted()
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 )
77 // tell the list to do its housekeeping
78 (*iter)->ReleaseUnusedItems();
81 // release any extra lists
82 if( mRenderLists.Count() > mNextFreeRenderList )
84 mRenderLists.Resize( mNextFreeRenderList );
88 RenderListContainer::SizeType RenderInstruction::RenderListCount() const
90 return mNextFreeRenderList;
93 const RenderList* RenderInstruction::GetRenderList( RenderListContainer::SizeType index ) const
95 DALI_ASSERT_ALWAYS( (index < mNextFreeRenderList ) && "Renderlist index out of scope" );
96 return mRenderLists[ index ];
99 void RenderInstruction::Reset( const Matrix* viewMatrix,
100 const Matrix* projectionMatrix,
101 unsigned int offscreenTextureId,
102 const Viewport* viewport,
103 const Vector4* clearColor )
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;
115 RenderListContainer::Iterator iter = mRenderLists.Begin();
116 RenderListContainer::ConstIterator end = mRenderLists.End();
117 for( ;iter != end; ++iter )
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
126 } // namespace SceneGraph
128 } // namespace Internal