2 * Copyright (c) 2023 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/render-vertex-buffer.h>
22 #include <dali/internal/event/rendering/vertex-buffer-impl.h> // Dali::Internal::VertexBuffer
30 VertexBuffer::VertexBuffer()
40 VertexBuffer::~VertexBuffer() = default;
42 void VertexBuffer::SetFormat(VertexBuffer::Format* format)
48 void VertexBuffer::SetData(Dali::Vector<uint8_t>* data, uint32_t size)
55 void VertexBuffer::SetVertexBufferUpdateCallback(Dali::VertexBufferUpdateCallback* callback)
57 mVertexBufferStateLock.ChangeState(VertexBufferSyncState::UNLOCKED, VertexBufferSyncState::LOCKED_FOR_EVENT);
58 mVertexBufferUpdateCallback.reset(callback);
59 mVertexBufferStateLock.ChangeState(VertexBufferSyncState::LOCKED_FOR_EVENT, VertexBufferSyncState::UNLOCKED);
62 bool VertexBuffer::Update(Graphics::Controller& graphicsController)
64 if(!mFormat || !mSize)
69 if(!mVertexBufferUpdateCallback && !mData)
74 if(!mGpuBuffer || mDataChanged)
78 mGpuBuffer = new GpuBuffer(graphicsController, 0 | Graphics::BufferUsage::VERTEX_BUFFER, GpuBuffer::WritePolicy::DISCARD);
81 // Update the GpuBuffer
82 if(mGpuBuffer && mData)
84 DALI_ASSERT_DEBUG(mSize && "No data in the property buffer!");
85 mGpuBuffer->UpdateDataBuffer(graphicsController, GetDataSize(), &((*mData)[0]));
88 mElementCount = mSize;
93 // To execute the callback the buffer must be already initialized.
94 mVertexBufferStateLock.ChangeState(VertexBufferSyncState::UNLOCKED, VertexBufferSyncState::LOCKED_FOR_UPDATE);
95 if(mVertexBufferUpdateCallback && mGpuBuffer)
97 // If running callback, we may end up with less elements in the buffer
98 // of the same capacity
99 uint32_t updatedSize = mSize * mFormat->size;
100 mGpuBuffer->UpdateDataBufferWithCallback(graphicsController, mVertexBufferUpdateCallback.get(), updatedSize);
101 mElementCount = updatedSize / mFormat->size;
103 mVertexBufferStateLock.ChangeState(VertexBufferSyncState::LOCKED_FOR_UPDATE, VertexBufferSyncState::UNLOCKED);
107 void VertexBuffer::SetDivisor(uint32_t divisor)
112 uint32_t VertexBuffer::GetDivisor()
117 } // namespace Render
118 } // namespace Internal