blob: 2638f17a00aa2ea16c3ee3cbb38b557592bea601 [file] [log] [blame]
/*
* Copyright (c) 2023 Valve Corporation
* Copyright (c) 2023 LunarG, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*/
#include "../framework/layer_validation_tests.h"
void DescriptorBufferTest::InitBasicDescriptorBuffer(void* pNextFeatures) {
SetTargetApiVersion(VK_API_VERSION_1_2);
AddRequiredExtensions(VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME);
RETURN_IF_SKIP(InitFramework())
VkPhysicalDeviceDescriptorBufferFeaturesEXT descriptor_buffer_features = vku::InitStructHelper(pNextFeatures);
GetPhysicalDeviceFeatures2(descriptor_buffer_features);
if (!descriptor_buffer_features.descriptorBuffer) {
GTEST_SKIP() << "Test requires (unsupported) descriptorBuffer , skipping.";
}
RETURN_IF_SKIP(InitState(nullptr, &descriptor_buffer_features, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
}
TEST_F(PositiveDescriptorBuffer, BasicUsage) {
TEST_DESCRIPTION("Create VkBuffer with extension.");
RETURN_IF_SKIP(InitBasicDescriptorBuffer())
// *descriptorBufferAddressSpaceSize properties are guaranteed to be 2^27
VkBufferCreateInfo buffer_ci = vku::InitStructHelper();
buffer_ci.size = 4096;
{
buffer_ci.usage = VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT;
vkt::Buffer buffer(*m_device, buffer_ci);
}
{
buffer_ci.usage = VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT;
vkt::Buffer buffer(*m_device, buffer_ci);
}
{
buffer_ci.usage = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT |
VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT;
vkt::Buffer buffer(*m_device, buffer_ci);
}
}
TEST_F(PositiveDescriptorBuffer, BindBufferAndSetOffset) {
TEST_DESCRIPTION("Bind descriptor buffer and set descriptor offset.");
AddRequiredExtensions(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
VkPhysicalDeviceBufferDeviceAddressFeatures buffer_device_address_features = vku::InitStructHelper();
RETURN_IF_SKIP(InitBasicDescriptorBuffer(&buffer_device_address_features))
VkBufferCreateInfo buffer_ci = vku::InitStructHelper();
buffer_ci.size = 4096;
buffer_ci.usage = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT;
VkMemoryAllocateFlagsInfo allocate_flag_info = vku::InitStructHelper();
allocate_flag_info.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT;
vkt::Buffer buffer(*m_device, buffer_ci, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &allocate_flag_info);
VkDescriptorBufferBindingInfoEXT buffer_binding_info = vku::InitStructHelper();
buffer_binding_info.address = buffer.address();
buffer_binding_info.usage = VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT;
const VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT, nullptr};
const vkt::DescriptorSetLayout set_layout(*m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT);
const vkt::PipelineLayout pipeline_layout(*m_device, {&set_layout});
const uint32_t index = 0;
const VkDeviceSize offset = 0;
m_commandBuffer->begin();
vk::CmdBindDescriptorBuffersEXT(m_commandBuffer->handle(), 1, &buffer_binding_info);
vk::CmdSetDescriptorBufferOffsetsEXT(*m_commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &index, &offset);
m_commandBuffer->end();
}