2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include <dali/internal/render/common/render-instruction.h>
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
32 RenderInstruction::RenderInstruction()
33 : mRenderTracker(nullptr),
35 mIsViewportSet(false),
36 mIsClearColorSet(false),
37 mIgnoreRenderToFbo(false),
38 mFrameBuffer(nullptr),
40 mNextFreeRenderList(0)
42 // reserve 6 lists, which is enough for three layers with opaque and transparent things on
43 mRenderLists.Reserve(6);
46 RenderInstruction::~RenderInstruction()
47 { // pointer container releases the renderlists
50 RenderList& RenderInstruction::GetNextFreeRenderList(size_t capacityRequired)
52 // check if we have enough lists, we can only be one behind at worst
53 if(mRenderLists.Count() <= mNextFreeRenderList)
55 mRenderLists.PushBack(new RenderList); // Push a new empty render list
58 // check capacity of the list and reserve if not big enough
59 if(mRenderLists[mNextFreeRenderList]->Capacity() < capacityRequired)
61 mRenderLists[mNextFreeRenderList]->Reserve(capacityRequired);
64 // return the list mNextFreeRenderList points to and increase by one
65 return *mRenderLists[mNextFreeRenderList++];
68 void RenderInstruction::UpdateCompleted()
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)
76 // tell the list to do its housekeeping
77 (*iter)->ReleaseUnusedItems();
80 // release any extra lists
81 if(mRenderLists.Count() > mNextFreeRenderList)
83 mRenderLists.Resize(mNextFreeRenderList);
87 RenderListContainer::SizeType RenderInstruction::RenderListCount() const
89 return mNextFreeRenderList;
92 const RenderList* RenderInstruction::GetRenderList(RenderListContainer::SizeType index) const
94 DALI_ASSERT_DEBUG((index < mNextFreeRenderList) && (index < mRenderLists.Size()) && "Renderlist index out of container bounds");
96 // Return null if the caller has passed an invalid index:
97 if(index >= std::min(mNextFreeRenderList, mRenderLists.Size()))
102 return mRenderLists[index];
105 void RenderInstruction::Reset(Camera* camera,
106 Render::FrameBuffer* frameBuffer,
107 const Viewport* viewport,
108 const Vector4* clearColor)
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;
119 RenderListContainer::Iterator iter = mRenderLists.Begin();
120 RenderListContainer::ConstIterator end = mRenderLists.End();
121 for(; iter != end; ++iter)
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
130 } // namespace SceneGraph
132 } // namespace Internal