| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/ui/lib/escher/impl/naive_buffer.h" |
| #include "src/ui/lib/escher/resources/resource_recycler.h" |
| #include "src/ui/lib/escher/test/common/gtest_escher.h" |
| #include "src/ui/lib/escher/vk/gpu_allocator.h" |
| |
| namespace escher { |
| |
| using BufferTest = escher::test::TestWithVkValidationLayer; |
| |
| VK_TEST_F(BufferTest, CreateWithPreExistingMemory) { |
| auto escher = test::GetEscher(); |
| auto allocator = escher->gpu_allocator(); |
| auto recycler = escher->resource_recycler(); |
| |
| constexpr vk::DeviceSize kDummyBufferSize = 10000; |
| // TODO(fxbug.dev/24563): Scenic may use a different set of bits when creating a |
| // buffer, resulting in a memory pool mismatch. |
| const auto kBufferUsageFlags = |
| vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eTransferDst; |
| const auto kMemoryPropertyFlags = |
| vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent; |
| |
| // This is silly, but without creating a buffer, I don't understand how to |
| // populate vk::MemoryRequirements::memoryTypeBits. |
| auto dummy_buffer = allocator->AllocateBuffer(recycler, kDummyBufferSize, kBufferUsageFlags, |
| kMemoryPropertyFlags); |
| vk::MemoryRequirements reqs = escher->vk_device().getBufferMemoryRequirements(dummy_buffer->vk()); |
| |
| // Now that we have the memory requirements, we can allocate some memory, so |
| // that we can test creating a buffer with pre-existing memory. |
| auto mem1 = allocator->AllocateMemory(reqs, kMemoryPropertyFlags); |
| |
| // Suballocate some memory. But before sub-allocation, we need to get the |
| // memory requirements of the "smaller" buffer as well. |
| constexpr vk::DeviceSize kBufferSize = 1000; |
| constexpr vk::DeviceSize kOffset = 512; |
| auto dummy_buffer_2 = |
| allocator->AllocateBuffer(recycler, kBufferSize, kBufferUsageFlags, kMemoryPropertyFlags); |
| vk::MemoryRequirements reqs_2 = |
| escher->vk_device().getBufferMemoryRequirements(dummy_buffer_2->vk()); |
| vk::DeviceSize sub_alloc_size = reqs_2.size; |
| auto mem2 = mem1->Suballocate(sub_alloc_size, kOffset); |
| EXPECT_EQ(mem1->mapped_ptr() + kOffset, mem2->mapped_ptr()); |
| |
| // Allocate 2 buffers, one from the original allocation, and one from the |
| // sub-allocation. |
| auto buf1 = impl::NaiveBuffer::New(recycler, mem1, kBufferUsageFlags, kDummyBufferSize); |
| auto buf2 = impl::NaiveBuffer::New(recycler, mem2, kBufferUsageFlags, kBufferSize); |
| ASSERT_TRUE(buf1); |
| EXPECT_EQ(mem1->mapped_ptr(), buf1->host_ptr()); |
| ASSERT_TRUE(buf2); |
| EXPECT_EQ(mem2->mapped_ptr(), buf2->host_ptr()); |
| } |
| |
| } // namespace escher |