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/queue/render-queue.h>
21 #include <dali/internal/common/message.h>
29 namespace // unnamed namespace
32 static const std::size_t INITIAL_BUFFER_SIZE = 32768;
33 static const std::size_t MAX_BUFFER_SIZE = 32768;
35 } // unnamed namespace
40 RenderQueue::RenderQueue()
44 container0 = new MessageBuffer( INITIAL_BUFFER_SIZE );
45 container1 = new MessageBuffer( INITIAL_BUFFER_SIZE );
48 RenderQueue::~RenderQueue()
52 for( MessageBuffer::Iterator iter = container0->Begin(); iter.IsValid(); iter.Next() )
54 MessageBase* message = reinterpret_cast< MessageBase* >( iter.Get() );
56 // Call virtual destructor explictly; since delete will not be called after placement new
57 message->~MessageBase();
65 for( MessageBuffer::Iterator iter = container1->Begin(); iter.IsValid(); iter.Next() )
67 MessageBase* message = reinterpret_cast< MessageBase* >( iter.Get() );
69 // Call virtual destructor explictly; since delete will not be called after placement new
70 message->~MessageBase();
77 unsigned int* RenderQueue::ReserveMessageSlot( BufferIndex updateBufferIndex, std::size_t size )
79 MessageBuffer* container = GetCurrentContainer( updateBufferIndex );
81 return container->ReserveMessageSlot( size );
84 void RenderQueue::ProcessMessages( BufferIndex bufferIndex )
86 MessageBuffer* container = GetCurrentContainer( bufferIndex );
88 for( MessageBuffer::Iterator iter = container->Begin(); iter.IsValid(); iter.Next() )
90 MessageBase* message = reinterpret_cast< MessageBase* >( iter.Get() );
92 message->Process( bufferIndex );
94 // Call virtual destructor explictly; since delete will not be called after placement new
95 message->~MessageBase();
100 LimitBufferCapacity( bufferIndex );
103 MessageBuffer* RenderQueue::GetCurrentContainer( BufferIndex bufferIndex )
105 MessageBuffer* container( NULL );
108 * The update-thread queues messages with one container,
109 * whilst the render-thread is processing the other.
113 container = container0;
117 container = container1;
123 void RenderQueue::LimitBufferCapacity( BufferIndex bufferIndex )
127 if( MAX_BUFFER_SIZE < container0->GetCapacity() )
131 container0 = new MessageBuffer( INITIAL_BUFFER_SIZE );
136 if( MAX_BUFFER_SIZE < container1->GetCapacity() )
140 container1 = new MessageBuffer( INITIAL_BUFFER_SIZE );
145 } // namespace SceneGraph
147 } // namespace Internal