1515void DescriptorBufferTest::InitBasicDescriptorBuffer (void *instance_pnext) {
1616 SetTargetApiVersion (VK_API_VERSION_1_2);
1717 AddRequiredExtensions (VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME);
18+ AddRequiredExtensions (VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
1819 AddRequiredFeature (vkt::Feature::descriptorBuffer);
20+ AddRequiredFeature (vkt::Feature::bufferDeviceAddress);
1921 RETURN_IF_SKIP (Init (nullptr , nullptr , instance_pnext));
22+
23+ GetPhysicalDeviceProperties2 (descriptor_buffer_properties);
2024}
2125
2226class PositiveDescriptorBuffer : public DescriptorBufferTest {};
2327
2428TEST_F (PositiveDescriptorBuffer, BasicUsage) {
2529 TEST_DESCRIPTION (" Create VkBuffer with extension." );
26- RETURN_IF_SKIP (InitBasicDescriptorBuffer ());
30+ SetTargetApiVersion (VK_API_VERSION_1_2);
31+ AddRequiredExtensions (VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME);
32+ AddRequiredFeature (vkt::Feature::descriptorBuffer);
33+ RETURN_IF_SKIP (Init ());
2734
2835 // *descriptorBufferAddressSpaceSize properties are guaranteed to be 2^27
2936 VkBufferCreateInfo buffer_ci = vku::InitStructHelper ();
@@ -48,8 +55,6 @@ TEST_F(PositiveDescriptorBuffer, BasicUsage) {
4855
4956TEST_F (PositiveDescriptorBuffer, BindBufferAndSetOffset) {
5057 TEST_DESCRIPTION (" Bind descriptor buffer and set descriptor offset then draw." );
51- AddRequiredExtensions (VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
52- AddRequiredFeature (vkt::Feature::bufferDeviceAddress);
5358 RETURN_IF_SKIP (InitBasicDescriptorBuffer ());
5459 InitRenderTarget ();
5560
@@ -83,8 +88,6 @@ TEST_F(PositiveDescriptorBuffer, BindBufferAndSetOffset) {
8388
8489TEST_F (PositiveDescriptorBuffer, UnusedBoundBuffer) {
8590 TEST_DESCRIPTION (" https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/10290" );
86- AddRequiredExtensions (VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
87- AddRequiredFeature (vkt::Feature::bufferDeviceAddress);
8891 RETURN_IF_SKIP (InitBasicDescriptorBuffer ());
8992 InitRenderTarget ();
9093
@@ -126,10 +129,8 @@ TEST_F(PositiveDescriptorBuffer, UnusedBoundBuffer) {
126129
127130TEST_F (PositiveDescriptorBuffer, PipelineFlags2) {
128131 TEST_DESCRIPTION (" Use descriptor buffer with pipeline created with VkPipelineCreateFlags2CreateInfo" );
129- AddRequiredExtensions (VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
130132 AddRequiredExtensions (VK_KHR_MAINTENANCE_5_EXTENSION_NAME);
131133 AddRequiredFeature (vkt::Feature::maintenance5);
132- AddRequiredFeature (vkt::Feature::bufferDeviceAddress);
133134 RETURN_IF_SKIP (InitBasicDescriptorBuffer ());
134135 InitRenderTarget ();
135136
@@ -164,12 +165,8 @@ TEST_F(PositiveDescriptorBuffer, PipelineFlags2) {
164165}
165166
166167TEST_F (PositiveDescriptorBuffer, BindingMidBuffer) {
167- AddRequiredFeature (vkt::Feature::bufferDeviceAddress);
168168 RETURN_IF_SKIP (InitBasicDescriptorBuffer ());
169169
170- VkPhysicalDeviceDescriptorBufferPropertiesEXT descriptor_buffer_properties = vku::InitStructHelper ();
171- GetPhysicalDeviceProperties2 (descriptor_buffer_properties);
172-
173170 m_command_buffer.Begin ();
174171
175172 vkt::Buffer buffer (*m_device, 4096 , VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT, vkt::device_address);
@@ -183,12 +180,8 @@ TEST_F(PositiveDescriptorBuffer, BindingMidBuffer) {
183180
184181TEST_F (PositiveDescriptorBuffer, Basic) {
185182 TEST_DESCRIPTION (" Tries to use a full workflow." );
186- AddRequiredFeature (vkt::Feature::bufferDeviceAddress);
187183 RETURN_IF_SKIP (InitBasicDescriptorBuffer ());
188184
189- VkPhysicalDeviceDescriptorBufferPropertiesEXT descriptor_buffer_properties = vku::InitStructHelper ();
190- GetPhysicalDeviceProperties2 (descriptor_buffer_properties);
191-
192185 vkt::Buffer buffer_data (*m_device, 16 , 0 , vkt::device_address);
193186 uint32_t *data = (uint32_t *)buffer_data.Memory ().Map ();
194187 data[0 ] = 8 ;
@@ -197,15 +190,9 @@ TEST_F(PositiveDescriptorBuffer, Basic) {
197190
198191 VkDescriptorSetLayoutBinding binding = {0 , VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1 , VK_SHADER_STAGE_ALL, nullptr };
199192 vkt::DescriptorSetLayout ds_layout (*m_device, binding, VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT);
193+ vkt::PipelineLayout pipeline_layout (*m_device, {&ds_layout});
200194
201- VkPipelineLayoutCreateInfo pipe_layout_ci = vku::InitStructHelper ();
202- pipe_layout_ci.setLayoutCount = 1 ;
203- pipe_layout_ci.pSetLayouts = &ds_layout.handle ();
204- vkt::PipelineLayout pipeline_layout (*m_device, pipe_layout_ci);
205-
206- VkDeviceSize ds_layout_size = 0 ;
207- vk::GetDescriptorSetLayoutSizeEXT (device (), ds_layout, &ds_layout_size);
208-
195+ VkDeviceSize ds_layout_size = ds_layout.GetDescriptorBufferSize ();
209196 vkt::Buffer descriptor_buffer (*m_device, ds_layout_size, VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT,
210197 vkt::device_address);
211198
@@ -267,12 +254,8 @@ TEST_F(PositiveDescriptorBuffer, Basic) {
267254
268255TEST_F (PositiveDescriptorBuffer, MultipleSet) {
269256 TEST_DESCRIPTION (" Have a single VkBuffer of data spread across 3 different sets." );
270- AddRequiredFeature (vkt::Feature::bufferDeviceAddress);
271257 RETURN_IF_SKIP (InitBasicDescriptorBuffer ());
272258
273- VkPhysicalDeviceDescriptorBufferPropertiesEXT descriptor_buffer_properties = vku::InitStructHelper ();
274- GetPhysicalDeviceProperties2 (descriptor_buffer_properties);
275-
276259 vkt::Buffer buffer_data (*m_device, 16 , 0 , vkt::device_address);
277260 uint32_t *data = (uint32_t *)buffer_data.Memory ().Map ();
278261 data[0 ] = 8 ;
@@ -281,16 +264,9 @@ TEST_F(PositiveDescriptorBuffer, MultipleSet) {
281264
282265 VkDescriptorSetLayoutBinding binding = {0 , VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1 , VK_SHADER_STAGE_ALL, nullptr };
283266 vkt::DescriptorSetLayout ds_layout (*m_device, binding, VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT);
267+ vkt::PipelineLayout pipeline_layout (*m_device, {&ds_layout, &ds_layout, &ds_layout});
284268
285- const VkDescriptorSetLayout set_layouts[3 ] = {ds_layout, ds_layout, ds_layout};
286- VkPipelineLayoutCreateInfo pipe_layout_ci = vku::InitStructHelper ();
287- pipe_layout_ci.setLayoutCount = 3 ;
288- pipe_layout_ci.pSetLayouts = set_layouts;
289- vkt::PipelineLayout pipeline_layout (*m_device, pipe_layout_ci);
290-
291- VkDeviceSize ds_layout_size = 0 ;
292- vk::GetDescriptorSetLayoutSizeEXT (device (), ds_layout, &ds_layout_size);
293-
269+ VkDeviceSize ds_layout_size = ds_layout.GetDescriptorBufferSize ();
294270 vkt::Buffer descriptor_buffer (*m_device, ds_layout_size * 3 , VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT,
295271 vkt::device_address);
296272
@@ -378,12 +354,8 @@ TEST_F(PositiveDescriptorBuffer, MultipleSet) {
378354
379355TEST_F (PositiveDescriptorBuffer, MultipleBinding) {
380356 TEST_DESCRIPTION (" Have a single VkBuffer of data spread across 3 different bindings in the same set." );
381- AddRequiredFeature (vkt::Feature::bufferDeviceAddress);
382357 RETURN_IF_SKIP (InitBasicDescriptorBuffer ());
383358
384- VkPhysicalDeviceDescriptorBufferPropertiesEXT descriptor_buffer_properties = vku::InitStructHelper ();
385- GetPhysicalDeviceProperties2 (descriptor_buffer_properties);
386-
387359 vkt::Buffer buffer_data (*m_device, 16 , 0 , vkt::device_address);
388360 uint32_t *data = (uint32_t *)buffer_data.Memory ().Map ();
389361 data[0 ] = 8 ;
@@ -394,20 +366,9 @@ TEST_F(PositiveDescriptorBuffer, MultipleBinding) {
394366 {1 , VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1 , VK_SHADER_STAGE_ALL, nullptr },
395367 {2 , VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1 , VK_SHADER_STAGE_ALL, nullptr }};
396368 vkt::DescriptorSetLayout ds_layout (*m_device, bindings, VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT);
369+ vkt::PipelineLayout pipeline_layout (*m_device, {&ds_layout});
397370
398- VkPipelineLayoutCreateInfo pipe_layout_ci = vku::InitStructHelper ();
399- pipe_layout_ci.setLayoutCount = 1 ;
400- pipe_layout_ci.pSetLayouts = &ds_layout.handle ();
401- vkt::PipelineLayout pipeline_layout (*m_device, pipe_layout_ci);
402-
403- VkDeviceSize ds_layout_size = 0 ;
404- vk::GetDescriptorSetLayoutSizeEXT (device (), ds_layout, &ds_layout_size);
405-
406- VkDeviceSize ds_layout_binding_offsets[3 ];
407- vk::GetDescriptorSetLayoutBindingOffsetEXT (device (), ds_layout, 0 , &ds_layout_binding_offsets[0 ]);
408- vk::GetDescriptorSetLayoutBindingOffsetEXT (device (), ds_layout, 1 , &ds_layout_binding_offsets[1 ]);
409- vk::GetDescriptorSetLayoutBindingOffsetEXT (device (), ds_layout, 2 , &ds_layout_binding_offsets[2 ]);
410-
371+ VkDeviceSize ds_layout_size = ds_layout.GetDescriptorBufferSize ();
411372 vkt::Buffer descriptor_buffer (*m_device, ds_layout_size, VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT,
412373 vkt::device_address);
413374
@@ -427,13 +388,15 @@ TEST_F(PositiveDescriptorBuffer, MultipleBinding) {
427388
428389 // Sets data_buffer[1] to binding 1
429390 addr_info.address += 4 ;
391+ VkDeviceSize ds_layout_binding_offset = ds_layout.GetDescriptorBufferBindingOffset (1 );
430392 vk::GetDescriptorEXT (device (), &buffer_descriptor_info, descriptor_buffer_properties.storageBufferDescriptorSize ,
431- mapped_descriptor_data + ds_layout_binding_offsets[ 1 ] );
393+ mapped_descriptor_data + ds_layout_binding_offset );
432394
433395 // Sets data_buffer[2] to binding 2
434396 addr_info.address += 4 ;
397+ ds_layout_binding_offset = ds_layout.GetDescriptorBufferBindingOffset (2 );
435398 vk::GetDescriptorEXT (device (), &buffer_descriptor_info, descriptor_buffer_properties.storageBufferDescriptorSize ,
436- mapped_descriptor_data + ds_layout_binding_offsets[ 2 ] );
399+ mapped_descriptor_data + ds_layout_binding_offset );
437400
438401 char const *cs_source = R"glsl(
439402 #version 450
@@ -487,7 +450,6 @@ TEST_F(PositiveDescriptorBuffer, BindingInfoUsage2) {
487450 TEST_DESCRIPTION (" https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/9228" );
488451 AddRequiredExtensions (VK_KHR_MAINTENANCE_5_EXTENSION_NAME);
489452 AddRequiredFeature (vkt::Feature::maintenance5);
490- AddRequiredFeature (vkt::Feature::bufferDeviceAddress);
491453 RETURN_IF_SKIP (InitBasicDescriptorBuffer ());
492454
493455 VkBufferUsageFlags2CreateInfo buffer_usage_flags = vku::InitStructHelper ();
@@ -515,7 +477,6 @@ TEST_F(PositiveDescriptorBuffer, DescriptorBufferBindingInfoUsage2) {
515477 TEST_DESCRIPTION (" https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/9228" );
516478 AddRequiredExtensions (VK_KHR_MAINTENANCE_5_EXTENSION_NAME);
517479 AddRequiredFeature (vkt::Feature::maintenance5);
518- AddRequiredFeature (vkt::Feature::bufferDeviceAddress);
519480 RETURN_IF_SKIP (InitBasicDescriptorBuffer ());
520481
521482 vkt::Buffer buffer (*m_device, 4096 , VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT, vkt::device_address);
@@ -530,3 +491,92 @@ TEST_F(PositiveDescriptorBuffer, DescriptorBufferBindingInfoUsage2) {
530491 vk::CmdBindDescriptorBuffersEXT (m_command_buffer, 1 , &dbbi);
531492 m_command_buffer.End ();
532493}
494+
495+ TEST_F (PositiveDescriptorBuffer, TexelBuffer) {
496+ RETURN_IF_SKIP (InitBasicDescriptorBuffer ());
497+
498+ vkt::Buffer stroage_buffer (*m_device, 32 , VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, vkt::device_address);
499+ vkt::BufferView stroage_buffer_view (*m_device, stroage_buffer, VK_FORMAT_R32_UINT);
500+ vkt::Buffer uniform_buffer (*m_device, 32 , VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, vkt::device_address);
501+ vkt::BufferView uniform_buffer_view (*m_device, uniform_buffer, VK_FORMAT_R32_UINT);
502+
503+ uint32_t *data = (uint32_t *)uniform_buffer.Memory ().Map ();
504+ data[0 ] = 8 ;
505+ data[1 ] = 12 ;
506+ data[2 ] = 1 ;
507+ data[3 ] = 4 ;
508+
509+ std::vector<VkDescriptorSetLayoutBinding> bindings = {
510+ {0 , VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1 , VK_SHADER_STAGE_ALL, nullptr },
511+ {1 , VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1 , VK_SHADER_STAGE_ALL, nullptr }};
512+ vkt::DescriptorSetLayout ds_layout (*m_device, bindings, VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT);
513+ vkt::PipelineLayout pipeline_layout (*m_device, {&ds_layout});
514+
515+ VkDeviceSize ds_layout_size = ds_layout.GetDescriptorBufferSize ();
516+ vkt::Buffer descriptor_buffer (*m_device, ds_layout_size, VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT,
517+ vkt::device_address);
518+
519+ VkDescriptorAddressInfoEXT addr_info = vku::InitStructHelper ();
520+ addr_info.address = stroage_buffer.Address ();
521+ addr_info.range = 32 ;
522+ addr_info.format = VK_FORMAT_R32_UINT;
523+
524+ VkDescriptorGetInfoEXT buffer_descriptor_info = vku::InitStructHelper ();
525+ buffer_descriptor_info.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
526+ buffer_descriptor_info.data .pStorageTexelBuffer = &addr_info;
527+
528+ uint8_t *mapped_descriptor_data = (uint8_t *)descriptor_buffer.Memory ().Map ();
529+ vk::GetDescriptorEXT (device (), &buffer_descriptor_info, descriptor_buffer_properties.storageTexelBufferDescriptorSize ,
530+ mapped_descriptor_data);
531+
532+ addr_info.address = uniform_buffer.Address ();
533+ buffer_descriptor_info.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
534+ buffer_descriptor_info.data .pUniformTexelBuffer = &addr_info;
535+ VkDeviceSize ds_layout_binding_offset = ds_layout.GetDescriptorBufferBindingOffset (1 );
536+ vk::GetDescriptorEXT (device (), &buffer_descriptor_info, descriptor_buffer_properties.storageTexelBufferDescriptorSize ,
537+ mapped_descriptor_data + ds_layout_binding_offset);
538+
539+ char const *cs_source = R"glsl(
540+ #version 450
541+ layout(set = 0, binding = 0, r32ui) uniform uimageBuffer s_buffer;
542+ layout(set = 0, binding = 1) uniform usamplerBuffer u_buffer;
543+
544+ void main() {
545+ imageStore(s_buffer, 0, texelFetch(u_buffer, 0));
546+ imageStore(s_buffer, 1, texelFetch(u_buffer, 1));
547+ imageStore(s_buffer, 2, texelFetch(u_buffer, 2));
548+ imageStore(s_buffer, 3, texelFetch(u_buffer, 3));
549+ }
550+ )glsl" ;
551+
552+ CreateComputePipelineHelper pipe (*this );
553+ pipe.cs_ = VkShaderObj (this , cs_source, VK_SHADER_STAGE_COMPUTE_BIT, SPV_ENV_VULKAN_1_2);
554+ pipe.cp_ci_ .flags |= VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT;
555+ pipe.cp_ci_ .layout = pipeline_layout;
556+ pipe.CreateComputePipeline ();
557+
558+ m_command_buffer.Begin ();
559+ vk::CmdBindPipeline (m_command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipe);
560+
561+ VkDescriptorBufferBindingInfoEXT descriptor_buffer_binding_info = vku::InitStructHelper ();
562+ descriptor_buffer_binding_info.address = descriptor_buffer.Address ();
563+ descriptor_buffer_binding_info.usage = VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT;
564+ vk::CmdBindDescriptorBuffersEXT (m_command_buffer, 1 , &descriptor_buffer_binding_info);
565+
566+ uint32_t buffer_index = 0 ;
567+ VkDeviceSize buffer_offset = 0 ;
568+ vk::CmdSetDescriptorBufferOffsetsEXT (m_command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline_layout, 0 , 1 , &buffer_index,
569+ &buffer_offset);
570+ vk::CmdDispatch (m_command_buffer, 1 , 1 , 1 );
571+ m_command_buffer.End ();
572+
573+ m_default_queue->SubmitAndWait (m_command_buffer);
574+
575+ data = (uint32_t *)stroage_buffer.Memory ().Map ();
576+ if (!IsPlatformMockICD ()) {
577+ ASSERT_TRUE (data[0 ] == 8 );
578+ ASSERT_TRUE (data[1 ] == 12 );
579+ ASSERT_TRUE (data[2 ] == 1 );
580+ ASSERT_TRUE (data[3 ] == 4 );
581+ }
582+ }
0 commit comments