Remove RenderSurface from Core
[platform/core/uifw/dali-core.git] / dali / internal / render / common / render-instruction.cpp
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
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
18 // CLASS HEADER
19 #include <dali/internal/render/common/render-instruction.h>
20
21 // INTERNAL INCLUDES
22 #include <dali/public-api/common/constants.h> // for Color::BLACK
23 #include <dali/internal/render/common/render-tracker.h>
24 #include <dali/integration-api/debug.h>
25
26 namespace Dali
27 {
28
29 namespace Internal
30 {
31
32 namespace SceneGraph
33 {
34
35 RenderInstruction::RenderInstruction()
36 : mRenderTracker( NULL ),
37   mClearColor(),
38   mIsViewportSet( false ),
39   mIsClearColorSet( false ),
40   mIgnoreRenderToFbo( false ),
41   mFrameBuffer( 0 ),
42   mContext( 0 ),
43   mCamera( 0 ),
44   mNextFreeRenderList( 0 )
45 {
46   // reserve 6 lists, which is enough for three layers with opaque and transparent things on
47   mRenderLists.Reserve( 6 );
48 }
49
50 RenderInstruction::~RenderInstruction()
51 { // pointer container releases the renderlists
52 }
53
54 RenderList& RenderInstruction::GetNextFreeRenderList( size_t capacityRequired )
55 {
56   // check if we have enough lists, we can only be one behind at worst
57   if( mRenderLists.Count() <= mNextFreeRenderList )
58   {
59     mRenderLists.PushBack( new RenderList ); // Push a new empty render list
60   }
61
62   // check capacity of the list and reserve if not big enough
63   if( mRenderLists[ mNextFreeRenderList ]->Capacity() < capacityRequired )
64   {
65     mRenderLists[ mNextFreeRenderList ]->Reserve( capacityRequired );
66   }
67
68   // return the list mNextFreeRenderList points to and increase by one
69   return *mRenderLists[ mNextFreeRenderList++ ];
70 }
71
72 void RenderInstruction::UpdateCompleted()
73 {
74   // lets do some housekeeping, remove any lists that were not needed because
75   // application might have removed a layer permanently
76   RenderListContainer::Iterator iter = mRenderLists.Begin();
77   RenderListContainer::ConstIterator end = mRenderLists.End();
78   for( ;iter != end; ++iter )
79   {
80     // tell the list to do its housekeeping
81     (*iter)->ReleaseUnusedItems();
82   }
83
84   // release any extra lists
85   if( mRenderLists.Count() > mNextFreeRenderList )
86   {
87     mRenderLists.Resize( mNextFreeRenderList );
88   }
89 }
90
91 RenderListContainer::SizeType RenderInstruction::RenderListCount() const
92 {
93   return mNextFreeRenderList;
94 }
95
96 const RenderList* RenderInstruction::GetRenderList( RenderListContainer::SizeType index ) const
97 {
98   DALI_ASSERT_DEBUG( (index < mNextFreeRenderList ) && (index < mRenderLists.Size()) && "Renderlist index out of container bounds" );
99
100   // Return null if the caller has passed an invalid index:
101   if( index >= std::min( mNextFreeRenderList, mRenderLists.Size() ) )
102   {
103     return 0;
104   }
105
106   return mRenderLists[ index ];
107 }
108
109 void RenderInstruction::Reset( Camera*         camera,
110                                Render::FrameBuffer* frameBuffer,
111                                const Viewport* viewport,
112                                const Vector4*  clearColor )
113 {
114   mCamera = camera;
115   mViewport = viewport ? *viewport : Viewport();
116   mIsViewportSet = NULL != viewport;
117   mClearColor = clearColor ? *clearColor : Color::BLACK;
118   mIsClearColorSet = NULL != clearColor;
119   mRenderTracker = NULL;
120   mNextFreeRenderList = 0;
121   mFrameBuffer = frameBuffer;
122
123   RenderListContainer::Iterator iter = mRenderLists.Begin();
124   RenderListContainer::ConstIterator end = mRenderLists.End();
125   for( ;iter != end; ++iter )
126   {
127     // since mRenderLists is a vector of RenderLists we dont want to clear it
128     // as it ends up releasing and later reallocating loads of vectors
129     // reset the renderlist
130     (*iter)->Reset();
131   }
132 }
133
134 } // namespace SceneGraph
135
136 } // namespace Internal
137
138 } // namespace Dali