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