1 // Copyright 2019 The Amber Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "src/vulkan/index_buffer.h"
16
17 #include <cstring>
18
19 #include "src/make_unique.h"
20 #include "src/vulkan/command_buffer.h"
21 #include "src/vulkan/device.h"
22
23 namespace amber {
24 namespace vulkan {
25
IndexBuffer(Device * device)26 IndexBuffer::IndexBuffer(Device* device) : device_(device) {}
27
28 IndexBuffer::~IndexBuffer() = default;
29
SendIndexData(CommandBuffer * command,Buffer * buffer)30 Result IndexBuffer::SendIndexData(CommandBuffer* command, Buffer* buffer) {
31 if (transfer_buffer_) {
32 return Result(
33 "IndexBuffer::SendIndexData must be called once when it is created");
34 }
35
36 if (buffer->ElementCount() == 0)
37 return Result("IndexBuffer::SendIndexData |buffer| is empty");
38
39 transfer_buffer_ =
40 MakeUnique<TransferBuffer>(device_, buffer->GetSizeInBytes(), nullptr);
41 Result r = transfer_buffer_->AddUsageFlags(VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
42 VK_BUFFER_USAGE_TRANSFER_DST_BIT);
43 if (!r.IsSuccess())
44 return r;
45
46 r = transfer_buffer_->Initialize();
47 if (!r.IsSuccess())
48 return r;
49
50 std::memcpy(transfer_buffer_->HostAccessibleMemoryPtr(),
51 buffer->ValuePtr()->data(), buffer->GetSizeInBytes());
52
53 transfer_buffer_->CopyToDevice(command);
54 return {};
55 }
56
BindToCommandBuffer(CommandBuffer * command)57 Result IndexBuffer::BindToCommandBuffer(CommandBuffer* command) {
58 if (!transfer_buffer_) {
59 return Result(
60 "IndexBuffer::BindToCommandBuffer |transfer_buffer_| is nullptr");
61 }
62
63 device_->GetPtrs()->vkCmdBindIndexBuffer(command->GetVkCommandBuffer(),
64 transfer_buffer_->GetVkBuffer(), 0,
65 VK_INDEX_TYPE_UINT32);
66 return {};
67 }
68
69 } // namespace vulkan
70 } // namespace amber
71