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/renderers/uniform-buffer-view-pool.h>
22 #include <dali/internal/render/renderers/uniform-buffer-manager.h>
23 #include <dali/internal/render/renderers/uniform-buffer.h>
24 #include <dali/internal/render/renderers/uniform-buffer-view.h>
25 #include <dali/graphics-api/graphics-buffer-create-info.h>
26 #include <dali/graphics-api/graphics-buffer.h>
28 namespace Dali::Internal::Render
32 // Default UBO page size set to 32kb
33 const uint32_t DEFAULT_UBO_PAGE_SIZE = 32768;
36 UniformBufferViewPool::UniformBufferViewPool( UniformBufferManager& manager, uint32_t alignment ) :
40 mUniformBufferStorage = mUboManager.AllocateUniformBuffer( DEFAULT_UBO_PAGE_SIZE, alignment );
41 mAlignment = alignment;
45 UniformBufferViewPool::~UniformBufferViewPool() = default;
47 void UniformBufferViewPool::Rollback()
52 // turn buffer into single allocation by resizing it
53 // to current size with invalidation
54 auto currentSize = mUniformBufferStorage->GetSize();
55 mUniformBufferStorage->Resize( currentSize ? currentSize : DEFAULT_UBO_PAGE_SIZE, true );
58 Graphics::UniquePtr<UniformBufferView> UniformBufferViewPool::CreateUniformBufferView( size_t size )
61 auto newOffset = ((mCurrentOffset + size) / mAlignment) * mAlignment;
62 if(mAlignment > 1 && newOffset < mCurrentOffset + size)
64 newOffset += mAlignment;
67 // resize Ubo if needed
68 if( newOffset >= mUniformBufferStorage->GetSize())
70 // move offset to the new buffer
71 mCurrentOffset = mUniformBufferStorage->GetSize();
72 newOffset = ((mCurrentOffset + size) / mAlignment) * mAlignment;
74 // Adjust current offset so the view doesn't intersect multiple buffers
75 auto prevSize = mUniformBufferStorage->GetSize();
76 if(mCurrentOffset + size >= prevSize )
78 mCurrentOffset = prevSize;
79 newOffset = ((mCurrentOffset + size) / mAlignment) * mAlignment;
81 mUniformBufferStorage->Resize( mUniformBufferStorage->GetSize()+DEFAULT_UBO_PAGE_SIZE, false );
84 // create buffer view from
85 Graphics::UniquePtr<UniformBufferView> uboView = mUboManager.CreateUniformBufferView(mUniformBufferStorage.get(), mCurrentOffset, size);
88 mCurrentOffset = newOffset;
93 } // namespace Dali::Internal::Render