Skip to content

Commit

Permalink
tests: Test required dedicated allocations
Browse files Browse the repository at this point in the history
  • Loading branch information
ziga-lunarg committed Dec 26, 2024
1 parent 6a67b3c commit 1a0cde8
Showing 1 changed file with 111 additions and 0 deletions.
111 changes: 111 additions & 0 deletions tests/unit/memory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2334,3 +2334,114 @@ TEST_F(NegativeMemory, DISABLED_MaxMemoryAllocationSize) {
vk::AllocateMemory(device(), &alloc_info, nullptr, &memory);
m_errorMonitor->VerifyFound();
}

TEST_F(NegativeMemory, RequiredDedicatedAllocationBuffer) {
SetTargetApiVersion(VK_API_VERSION_1_1);
RETURN_IF_SKIP(Init());

auto buffer_info = vkt::Buffer::CreateInfo(4096, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
vkt::Buffer buffer(*m_device, buffer_info, vkt::no_mem);

vkt::Buffer buffer2(*m_device, buffer_info, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);

VkBufferMemoryRequirementsInfo2 buffer_memory_requirements_info = vku::InitStructHelper();
buffer_memory_requirements_info.buffer = buffer.handle();

VkMemoryDedicatedRequirements memory_dedicated_requirements = vku::InitStructHelper();

VkMemoryRequirements2 memory_requirements = vku::InitStructHelper(&memory_dedicated_requirements);
vk::GetBufferMemoryRequirements2(device(), &buffer_memory_requirements_info, &memory_requirements);

if (!memory_dedicated_requirements.requiresDedicatedAllocation) {
GTEST_SKIP() << "requiresDedicatedAllocation is false";
}

{
VkMemoryAllocateInfo memory_info = vku::InitStructHelper();
memory_info.allocationSize = memory_requirements.memoryRequirements.size;
bool pass = m_device->Physical().SetMemoryType(memory_requirements.memoryRequirements.memoryTypeBits, &memory_info,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
ASSERT_TRUE(pass);
vkt::DeviceMemory device_memory(*m_device, memory_info);

VkBindBufferMemoryInfo bind_buffer_memory_info = vku::InitStructHelper();
bind_buffer_memory_info.buffer = buffer.handle();
bind_buffer_memory_info.memory = device_memory.handle();
bind_buffer_memory_info.memoryOffset = 0u;
m_errorMonitor->SetDesiredError("VUID-VkBindBufferMemoryInfo-buffer-01444");
vk::BindBufferMemory2(device(), 1u, &bind_buffer_memory_info);
m_errorMonitor->VerifyFound();
}

{
VkMemoryDedicatedAllocateInfo memory_dedicated_allocate_info = vku::InitStructHelper();
memory_dedicated_allocate_info.buffer = buffer2.handle();
VkMemoryAllocateInfo memory_info = vku::InitStructHelper(&memory_dedicated_allocate_info);
memory_info.allocationSize = memory_requirements.memoryRequirements.size;
bool pass = m_device->Physical().SetMemoryType(memory_requirements.memoryRequirements.memoryTypeBits, &memory_info,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
ASSERT_TRUE(pass);
vkt::DeviceMemory device_memory(*m_device, memory_info);

m_errorMonitor->SetDesiredError("VUID-vkBindBufferMemory-memory-01508");
m_errorMonitor->SetDesiredError("VUID-vkBindBufferMemory-buffer-01444");
vk::BindBufferMemory(device(), buffer.handle(), device_memory.handle(), 0u);
m_errorMonitor->VerifyFound();
}
}

TEST_F(NegativeMemory, RequiredDedicatedAllocationImage) {
SetTargetApiVersion(VK_API_VERSION_1_1);
RETURN_IF_SKIP(Init());

VkImageCreateInfo image_create_info =
vkt::Image::ImageCreateInfo2D(32u, 32u, 1u, 1u, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT);
vkt::Image image(*m_device, image_create_info, vkt::no_mem);

vkt::Image image2(*m_device, image_create_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);

VkImageMemoryRequirementsInfo2 image_memory_requirements_info = vku::InitStructHelper();
image_memory_requirements_info.image = image.handle();

VkMemoryDedicatedRequirements memory_dedicated_requirements = vku::InitStructHelper();

VkMemoryRequirements2 memory_requirements = vku::InitStructHelper(&memory_dedicated_requirements);
vk::GetImageMemoryRequirements2(device(), &image_memory_requirements_info, &memory_requirements);

if (!memory_dedicated_requirements.requiresDedicatedAllocation) {
GTEST_SKIP() << "requiresDedicatedAllocation is false";
}

{
VkMemoryAllocateInfo memory_info = vku::InitStructHelper();
memory_info.allocationSize = memory_requirements.memoryRequirements.size;
bool pass = m_device->Physical().SetMemoryType(memory_requirements.memoryRequirements.memoryTypeBits, &memory_info,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
ASSERT_TRUE(pass);
vkt::DeviceMemory device_memory(*m_device, memory_info);

VkBindImageMemoryInfo bind_image_memory_info = vku::InitStructHelper();
bind_image_memory_info.image = image.handle();
bind_image_memory_info.memory = device_memory.handle();
bind_image_memory_info.memoryOffset = 0u;
m_errorMonitor->SetDesiredError("VUID-VkBindImageMemoryInfo-image-01445");
vk::BindImageMemory2(device(), 1u, &bind_image_memory_info);
m_errorMonitor->VerifyFound();
}

{
VkMemoryDedicatedAllocateInfo memory_dedicated_allocate_info = vku::InitStructHelper();
memory_dedicated_allocate_info.image = image2.handle();
VkMemoryAllocateInfo memory_info = vku::InitStructHelper(&memory_dedicated_allocate_info);
memory_info.allocationSize = memory_requirements.memoryRequirements.size;
bool pass = m_device->Physical().SetMemoryType(memory_requirements.memoryRequirements.memoryTypeBits, &memory_info,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
ASSERT_TRUE(pass);
vkt::DeviceMemory device_memory(*m_device, memory_info);

m_errorMonitor->SetDesiredError("VUID-vkBindImageMemory-memory-02628");
m_errorMonitor->SetDesiredError("VUID-vkBindImageMemory-image-01445");
vk::BindImageMemory(device(), image, device_memory, 0u);
m_errorMonitor->VerifyFound();
}
}

0 comments on commit 1a0cde8

Please sign in to comment.