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/queue/render-queue.h>
22 #include <dali/internal/common/message.h>
28 namespace // unnamed namespace
30 static const std::size_t INITIAL_BUFFER_SIZE = 32768;
31 static const std::size_t MAX_BUFFER_SIZE = 32768;
33 } // unnamed namespace
37 RenderQueue::RenderQueue()
38 : container0(nullptr),
41 container0 = new MessageBuffer(INITIAL_BUFFER_SIZE);
42 container1 = new MessageBuffer(INITIAL_BUFFER_SIZE);
45 RenderQueue::~RenderQueue()
49 for(MessageBuffer::Iterator iter = container0->Begin(); iter.IsValid(); iter.Next())
51 MessageBase* message = reinterpret_cast<MessageBase*>(iter.Get());
53 // Call virtual destructor explicitly; since delete will not be called after placement new
54 message->~MessageBase();
62 for(MessageBuffer::Iterator iter = container1->Begin(); iter.IsValid(); iter.Next())
64 MessageBase* message = reinterpret_cast<MessageBase*>(iter.Get());
66 // Call virtual destructor explicitly; since delete will not be called after placement new
67 message->~MessageBase();
74 uint32_t* RenderQueue::ReserveMessageSlot(BufferIndex updateBufferIndex, std::size_t size)
76 MessageBuffer* container = GetCurrentContainer(updateBufferIndex);
78 return container->ReserveMessageSlot(size);
81 void RenderQueue::ProcessMessages(BufferIndex bufferIndex)
83 MessageBuffer* container = GetCurrentContainer(bufferIndex);
85 for(MessageBuffer::Iterator iter = container->Begin(); iter.IsValid(); iter.Next())
87 MessageBase* message = reinterpret_cast<MessageBase*>(iter.Get());
89 message->Process(bufferIndex);
91 // Call virtual destructor explictly; since delete will not be called after placement new
92 message->~MessageBase();
97 LimitBufferCapacity(bufferIndex);
100 MessageBuffer* RenderQueue::GetCurrentContainer(BufferIndex bufferIndex)
102 MessageBuffer* container(nullptr);
105 * The update-thread queues messages with one container,
106 * whilst the render-thread is processing the other.
110 container = container0;
114 container = container1;
120 void RenderQueue::LimitBufferCapacity(BufferIndex bufferIndex)
124 if(MAX_BUFFER_SIZE < container0->GetCapacity())
127 container0 = nullptr;
128 container0 = new MessageBuffer(INITIAL_BUFFER_SIZE);
133 if(MAX_BUFFER_SIZE < container1->GetCapacity())
136 container1 = nullptr;
137 container1 = new MessageBuffer(INITIAL_BUFFER_SIZE);
142 } // namespace SceneGraph
144 } // namespace Internal