| /* |
| * Copyright (c) 2015-2025 The Khronos Group Inc. |
| * Copyright (c) 2015-2025 Valve Corporation |
| * Copyright (c) 2015-2025 LunarG, Inc. |
| * Copyright (c) 2015-2025 Google, Inc. |
| * Modifications Copyright (C) 2020-2022 Advanced Micro Devices, Inc. All rights reserved. |
| * Modifications Copyright (C) 2021 ARM, Inc. All rights reserved. |
| * |
| * 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 <gtest/gtest.h> |
| #include <vulkan/vulkan_core.h> |
| #include "utils/cast_utils.h" |
| #include "../framework/layer_validation_tests.h" |
| #include "../framework/descriptor_helper.h" |
| |
| class NegativePushDescriptor : public VkLayerTest {}; |
| |
| TEST_F(NegativePushDescriptor, DSBufferInfo) { |
| TEST_DESCRIPTION("set that has incorrect parameters in VkDescriptorBufferInfo struct"); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| std::vector<VkDescriptorSetLayoutBinding> ds_bindings = { |
| {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}}; |
| OneOffDescriptorSet descriptor_set(m_device, ds_bindings); |
| |
| const VkDeviceSize min_alignment = m_device->Physical().limits_.minUniformBufferOffsetAlignment; |
| vkt::Buffer buffer(*m_device, min_alignment, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); |
| |
| VkDescriptorBufferInfo buffer_info = {buffer, 0, 0}; |
| VkWriteDescriptorSet descriptor_write = vku::InitStructHelper(); |
| descriptor_write.dstBinding = 0; |
| descriptor_write.descriptorCount = 1; |
| descriptor_write.pTexelBufferView = nullptr; |
| descriptor_write.pBufferInfo = &buffer_info; |
| descriptor_write.pImageInfo = nullptr; |
| descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
| descriptor_write.dstSet = descriptor_set.set_; |
| |
| vkt::DescriptorSetLayout push_dsl(*m_device, ds_bindings, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| vkt::PipelineLayout pipeline_layout(*m_device, {&push_dsl}); |
| |
| m_command_buffer.Begin(); |
| |
| // Cause error due to offset out of range |
| buffer_info.offset = min_alignment; |
| buffer_info.range = VK_WHOLE_SIZE; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorBufferInfo-offset-00340"); |
| vk::CmdPushDescriptorSetKHR(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| |
| // Now cause error due to range of 0 |
| buffer_info.offset = 0; |
| buffer_info.range = 0; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorBufferInfo-range-00341"); |
| vk::CmdPushDescriptorSetKHR(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| |
| // Now cause error due to range exceeding buffer size - offset |
| buffer_info.offset = 0; |
| buffer_info.range = min_alignment + 1; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorBufferInfo-range-00342"); |
| vk::CmdPushDescriptorSetKHR(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, DSBufferInfoTemplate) { |
| AddRequiredExtensions(VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| std::vector<VkDescriptorSetLayoutBinding> ds_bindings = { |
| {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}}; |
| OneOffDescriptorSet descriptor_set(m_device, ds_bindings); |
| |
| const VkDeviceSize min_alignment = m_device->Physical().limits_.minUniformBufferOffsetAlignment; |
| vkt::Buffer buffer(*m_device, min_alignment, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); |
| |
| // Setup for update w/ template tests |
| // Create a template of descriptor set updates |
| struct SimpleTemplateData { |
| uint8_t padding[7]; |
| VkDescriptorBufferInfo buffer_info; |
| uint32_t other_padding[4]; |
| }; |
| SimpleTemplateData update_template_data = {}; |
| update_template_data.buffer_info.buffer = buffer; |
| |
| VkDescriptorUpdateTemplateEntry update_template_entry = {}; |
| update_template_entry.dstBinding = 0; |
| update_template_entry.dstArrayElement = 0; |
| update_template_entry.descriptorCount = 1; |
| update_template_entry.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
| update_template_entry.offset = offsetof(SimpleTemplateData, buffer_info); |
| update_template_entry.stride = sizeof(SimpleTemplateData); |
| |
| vkt::DescriptorSetLayout push_dsl(*m_device, ds_bindings, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| vkt::PipelineLayout pipeline_layout(*m_device, {&push_dsl}); |
| |
| VkDescriptorUpdateTemplateCreateInfo push_template_ci = vku::InitStructHelper(); |
| push_template_ci.descriptorUpdateEntryCount = 1; |
| push_template_ci.pDescriptorUpdateEntries = &update_template_entry; |
| push_template_ci.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS; |
| push_template_ci.descriptorSetLayout = VK_NULL_HANDLE; |
| push_template_ci.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; |
| push_template_ci.pipelineLayout = pipeline_layout; |
| push_template_ci.set = 0; |
| vkt::DescriptorUpdateTemplate push_template(*m_device, push_template_ci); |
| |
| m_command_buffer.Begin(); |
| |
| // Cause error due to offset out of range |
| update_template_data.buffer_info.offset = min_alignment; |
| update_template_data.buffer_info.range = VK_WHOLE_SIZE; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorBufferInfo-offset-00340"); |
| vk::CmdPushDescriptorSetWithTemplateKHR(m_command_buffer, push_template, pipeline_layout, 0, &update_template_data); |
| m_errorMonitor->VerifyFound(); |
| |
| // Now cause error due to range of 0 |
| update_template_data.buffer_info.offset = 0; |
| update_template_data.buffer_info.range = 0; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorBufferInfo-range-00341"); |
| vk::CmdPushDescriptorSetWithTemplateKHR(m_command_buffer, push_template, pipeline_layout, 0, &update_template_data); |
| m_errorMonitor->VerifyFound(); |
| |
| // Now cause error due to range exceeding buffer size - offset |
| update_template_data.buffer_info.offset = 0; |
| update_template_data.buffer_info.range = min_alignment + 1; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorBufferInfo-range-00342"); |
| vk::CmdPushDescriptorSetWithTemplateKHR(m_command_buffer, push_template, pipeline_layout, 0, &update_template_data); |
| m_errorMonitor->VerifyFound(); |
| |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, DestroyDescriptorSetLayout) { |
| TEST_DESCRIPTION("Delete the DescriptorSetLayout and then call vkCmdPushDescriptorSetKHR"); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| vkt::Buffer buffer(*m_device, 32, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); |
| |
| VkDescriptorSetLayoutBinding ds_binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}; |
| VkDescriptorSetLayout ds_layout = VK_NULL_HANDLE; |
| VkDescriptorSetLayoutCreateInfo dsl_ci = vku::InitStructHelper(); |
| dsl_ci.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT; |
| dsl_ci.bindingCount = 1; |
| dsl_ci.pBindings = &ds_binding; |
| vk::CreateDescriptorSetLayout(device(), &dsl_ci, nullptr, &ds_layout); |
| |
| VkPipelineLayoutCreateInfo pipeline_layout_ci = vku::InitStructHelper(); |
| pipeline_layout_ci.setLayoutCount = 1; |
| pipeline_layout_ci.pSetLayouts = &ds_layout; |
| pipeline_layout_ci.pushConstantRangeCount = 0; |
| vkt::PipelineLayout pipeline_layout(*m_device, pipeline_layout_ci); |
| |
| VkDescriptorBufferInfo buffer_info = {buffer, 0, VK_WHOLE_SIZE}; |
| VkWriteDescriptorSet descriptor_write = vku::InitStructHelper(); |
| descriptor_write.dstBinding = 0; |
| descriptor_write.descriptorCount = 1; |
| descriptor_write.pTexelBufferView = nullptr; |
| descriptor_write.pBufferInfo = &buffer_info; |
| descriptor_write.pImageInfo = nullptr; |
| descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
| |
| m_command_buffer.Begin(); |
| |
| vk::DestroyDescriptorSetLayout(device(), ds_layout, nullptr); |
| m_errorMonitor->SetDesiredError("VUID-VkWriteDescriptorSet-dstSet-00320"); |
| vk::CmdPushDescriptorSetKHR(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, TemplateDestroyDescriptorSetLayout) { |
| TEST_DESCRIPTION("Delete the DescriptorSetLayout and then call vkCmdPushDescriptorSetWithTemplateKHR"); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| vkt::Buffer buffer(*m_device, 32, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); |
| |
| VkDescriptorSetLayoutBinding ds_binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}; |
| VkDescriptorSetLayout ds_layout = VK_NULL_HANDLE; |
| VkDescriptorSetLayoutCreateInfo dsl_ci = vku::InitStructHelper(); |
| dsl_ci.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT; |
| dsl_ci.bindingCount = 1; |
| dsl_ci.pBindings = &ds_binding; |
| vk::CreateDescriptorSetLayout(device(), &dsl_ci, nullptr, &ds_layout); |
| |
| VkPipelineLayoutCreateInfo pipeline_layout_ci = vku::InitStructHelper(); |
| pipeline_layout_ci.setLayoutCount = 1; |
| pipeline_layout_ci.pSetLayouts = &ds_layout; |
| pipeline_layout_ci.pushConstantRangeCount = 0; |
| vkt::PipelineLayout pipeline_layout(*m_device, pipeline_layout_ci); |
| |
| struct SimpleTemplateData { |
| VkDescriptorBufferInfo buff_info; |
| }; |
| |
| VkDescriptorUpdateTemplateEntry update_template_entry = {}; |
| update_template_entry.dstBinding = 0; |
| update_template_entry.dstArrayElement = 0; |
| update_template_entry.descriptorCount = 1; |
| update_template_entry.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
| update_template_entry.offset = offsetof(SimpleTemplateData, buff_info); |
| update_template_entry.stride = sizeof(SimpleTemplateData); |
| |
| VkDescriptorUpdateTemplateCreateInfo update_template_ci = vku::InitStructHelper(); |
| update_template_ci.descriptorUpdateEntryCount = 1; |
| update_template_ci.pDescriptorUpdateEntries = &update_template_entry; |
| update_template_ci.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS; |
| update_template_ci.descriptorSetLayout = ds_layout; |
| update_template_ci.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; |
| update_template_ci.pipelineLayout = pipeline_layout; |
| vkt::DescriptorUpdateTemplate update_template(*m_device, update_template_ci); |
| |
| SimpleTemplateData update_template_data; |
| update_template_data.buff_info = {buffer, 0, 32}; |
| |
| m_command_buffer.Begin(); |
| vk::DestroyDescriptorSetLayout(device(), ds_layout, nullptr); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSetWithTemplate-set-11854"); |
| vk::CmdPushDescriptorSetWithTemplateKHR(m_command_buffer, update_template, pipeline_layout, 0, &update_template_data); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, EmptyDescriptorSetLayout) { |
| TEST_DESCRIPTION("https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/8065"); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| // Layout is created with no bindings |
| VkDescriptorSetLayoutCreateInfo ds_layout_ci = vku::InitStructHelper(); |
| ds_layout_ci.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT; |
| vkt::DescriptorSetLayout ds_layout(*m_device, ds_layout_ci); |
| |
| VkDescriptorPoolSize pool_sizes = {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1}; |
| VkDescriptorPoolCreateInfo ds_pool_ci = vku::InitStructHelper(); |
| ds_pool_ci.maxSets = 1; |
| ds_pool_ci.poolSizeCount = 1; |
| ds_pool_ci.pPoolSizes = &pool_sizes; |
| vkt::DescriptorPool ds_pool(*m_device, ds_pool_ci); |
| |
| vkt::Buffer buffer(*m_device, 64, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); |
| |
| VkDescriptorBufferInfo buffer_info = {buffer, 0, VK_WHOLE_SIZE}; |
| VkWriteDescriptorSet descriptor_write = vku::InitStructHelper(); |
| descriptor_write.dstBinding = 0; |
| descriptor_write.descriptorCount = 1; |
| descriptor_write.pBufferInfo = &buffer_info; |
| descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
| |
| VkPipelineLayoutCreateInfo pipeline_layout_ci = vku::InitStructHelper(); |
| pipeline_layout_ci.setLayoutCount = 1; |
| pipeline_layout_ci.pSetLayouts = &ds_layout.handle(); |
| pipeline_layout_ci.pushConstantRangeCount = 0; |
| vkt::PipelineLayout pipeline_layout(*m_device, pipeline_layout_ci); |
| |
| m_command_buffer.Begin(); |
| m_errorMonitor->SetDesiredError("VUID-VkWriteDescriptorSet-dstBinding-10009"); |
| vk::CmdPushDescriptorSetKHR(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, DSUpdateIndex) { |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| vkt::DescriptorSetLayout ds_layout(*m_device, {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}, |
| VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| vkt::PipelineLayout pipeline_layout(*m_device, {&ds_layout}); |
| |
| vkt::Buffer buffer(*m_device, 32, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); |
| VkDescriptorBufferInfo buffer_info = {buffer, 0, VK_WHOLE_SIZE}; |
| VkWriteDescriptorSet descriptor_write = vku::InitStructHelper(); |
| descriptor_write.dstBinding = 2; |
| descriptor_write.descriptorCount = 1; |
| descriptor_write.pTexelBufferView = nullptr; |
| descriptor_write.pBufferInfo = &buffer_info; |
| descriptor_write.pImageInfo = nullptr; |
| descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
| |
| m_command_buffer.Begin(); |
| m_errorMonitor->SetDesiredError("VUID-VkWriteDescriptorSet-dstBinding-00315"); |
| vk::CmdPushDescriptorSetKHR(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, DSUpdateEmptyBinding) { |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, VK_SHADER_STAGE_ALL, nullptr}; |
| vkt::DescriptorSetLayout ds_layout(*m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| vkt::PipelineLayout pipeline_layout(*m_device, {&ds_layout}); |
| |
| vkt::Buffer buffer(*m_device, 32, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); |
| VkDescriptorBufferInfo buffer_info = {buffer, 0, VK_WHOLE_SIZE}; |
| VkWriteDescriptorSet descriptor_write = vku::InitStructHelper(); |
| descriptor_write.dstBinding = 0; |
| descriptor_write.descriptorCount = 1; |
| descriptor_write.pTexelBufferView = nullptr; |
| descriptor_write.pBufferInfo = &buffer_info; |
| descriptor_write.pImageInfo = nullptr; |
| descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
| |
| m_command_buffer.Begin(); |
| m_errorMonitor->SetDesiredError("VUID-VkWriteDescriptorSet-dstBinding-00316"); |
| vk::CmdPushDescriptorSetKHR(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, DSTypeMismatch) { |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| vkt::DescriptorSetLayout ds_layout(*m_device, {0, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_ALL, nullptr}, |
| VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| vkt::PipelineLayout pipeline_layout(*m_device, {&ds_layout}); |
| |
| vkt::Buffer buffer(*m_device, 32, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); |
| VkDescriptorBufferInfo buffer_info = {buffer, 0, VK_WHOLE_SIZE}; |
| VkWriteDescriptorSet descriptor_write = vku::InitStructHelper(); |
| descriptor_write.dstBinding = 0; |
| descriptor_write.descriptorCount = 1; |
| descriptor_write.pTexelBufferView = nullptr; |
| descriptor_write.pBufferInfo = &buffer_info; |
| descriptor_write.pImageInfo = nullptr; |
| descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
| |
| m_command_buffer.Begin(); |
| m_errorMonitor->SetDesiredError("VUID-VkWriteDescriptorSet-descriptorType-00319"); |
| vk::CmdPushDescriptorSetKHR(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, SetLayoutWithoutExtension) { |
| TEST_DESCRIPTION("Create a push descriptor set layout without loading the needed extension."); |
| RETURN_IF_SKIP(Init()); |
| |
| VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}; |
| |
| VkDescriptorSetLayoutCreateInfo ds_layout_ci = vku::InitStructHelper(); |
| ds_layout_ci.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT; |
| ds_layout_ci.bindingCount = 1; |
| ds_layout_ci.pBindings = &binding; |
| |
| VkDescriptorSetLayout ds_layout = VK_NULL_HANDLE; |
| |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorSetLayoutCreateInfo-flags-parameter"); |
| vk::CreateDescriptorSetLayout(*m_device, &ds_layout_ci, nullptr, &ds_layout); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativePushDescriptor, AllocateSet) { |
| TEST_DESCRIPTION("Attempt to allocate a push descriptor set."); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}; |
| VkDescriptorSetLayoutCreateInfo ds_layout_ci = vku::InitStructHelper(); |
| ds_layout_ci.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT; |
| ds_layout_ci.bindingCount = 1; |
| ds_layout_ci.pBindings = &binding; |
| vkt::DescriptorSetLayout ds_layout(*m_device, ds_layout_ci); |
| |
| VkDescriptorPoolSize pool_size = {binding.descriptorType, binding.descriptorCount}; |
| VkDescriptorPoolCreateInfo dspci = vku::InitStructHelper(); |
| dspci.poolSizeCount = 1; |
| dspci.pPoolSizes = &pool_size; |
| dspci.maxSets = 1; |
| vkt::DescriptorPool pool(*m_device, dspci); |
| |
| VkDescriptorSetAllocateInfo ds_alloc_info = vku::InitStructHelper(); |
| ds_alloc_info.descriptorPool = pool; |
| ds_alloc_info.descriptorSetCount = 1; |
| ds_alloc_info.pSetLayouts = &ds_layout.handle(); |
| |
| VkDescriptorSet ds = VK_NULL_HANDLE; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorSetAllocateInfo-pSetLayouts-00308"); |
| vk::AllocateDescriptorSets(*m_device, &ds_alloc_info, &ds); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativePushDescriptor, CreateDescriptorUpdateTemplate) { |
| TEST_DESCRIPTION("Verify error messages for invalid vkCreateDescriptorUpdateTemplate calls."); |
| #ifdef __ANDROID__ |
| GTEST_SKIP() << "Skipped on Android pending further investigation."; |
| #endif |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| VkDescriptorSetLayoutBinding dsl_binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}; |
| const vkt::DescriptorSetLayout ds_layout_ub(*m_device, {dsl_binding}); |
| const vkt::DescriptorSetLayout ds_layout_ub1(*m_device, {dsl_binding}); |
| const vkt::DescriptorSetLayout ds_layout_ub_push(*m_device, {dsl_binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| const vkt::PipelineLayout pipeline_layout(*m_device, {{&ds_layout_ub, &ds_layout_ub1, &ds_layout_ub_push}}); |
| |
| constexpr uint64_t badhandle = 0xcadecade; |
| VkDescriptorUpdateTemplateEntry entries = {0, 0, 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, sizeof(VkBuffer)}; |
| VkDescriptorUpdateTemplateCreateInfo create_info = vku::InitStructHelper(); |
| create_info.flags = 0; |
| create_info.descriptorUpdateEntryCount = 1; |
| create_info.pDescriptorUpdateEntries = &entries; |
| |
| auto do_test = [&](const char* err) { |
| VkDescriptorUpdateTemplateKHR dut = VK_NULL_HANDLE; |
| m_errorMonitor->SetDesiredError(err); |
| if (VK_SUCCESS == vk::CreateDescriptorUpdateTemplateKHR(*m_device, &create_info, nullptr, &dut)) { |
| vk::DestroyDescriptorUpdateTemplateKHR(*m_device, dut, nullptr); |
| } |
| m_errorMonitor->VerifyFound(); |
| }; |
| |
| // Descriptor set type template |
| create_info.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET; |
| // descriptorSetLayout is NULL |
| do_test("VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350"); |
| |
| // Bad pipelineLayout handle, to be ignored if template type is DESCRIPTOR_SET |
| { |
| create_info.pipelineLayout = CastFromUint64<VkPipelineLayout>(badhandle); |
| create_info.descriptorSetLayout = ds_layout_ub; |
| VkDescriptorUpdateTemplateKHR dut = VK_NULL_HANDLE; |
| if (VK_SUCCESS == vk::CreateDescriptorUpdateTemplateKHR(*m_device, &create_info, nullptr, &dut)) { |
| vk::DestroyDescriptorUpdateTemplateKHR(*m_device, dut, nullptr); |
| } |
| } |
| |
| create_info.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS; |
| // Bad pipelineLayout handle |
| do_test("VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352"); |
| |
| create_info.pipelineBindPoint = VK_PIPELINE_BIND_POINT_COMPUTE; |
| create_info.pipelineLayout = pipeline_layout; |
| create_info.set = 2; |
| |
| // Bad bindpoint -- force fuzz the bind point |
| memset(&create_info.pipelineBindPoint, 0xFE, sizeof(create_info.pipelineBindPoint)); |
| do_test("VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351"); |
| create_info.pipelineBindPoint = VK_PIPELINE_BIND_POINT_COMPUTE; |
| |
| // Bad pipeline layout |
| create_info.pipelineLayout = VK_NULL_HANDLE; |
| do_test("VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352"); |
| create_info.pipelineLayout = pipeline_layout; |
| |
| // Wrong set # |
| create_info.set = 0; |
| do_test("VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353"); |
| |
| // Invalid set # |
| create_info.set = 42; |
| do_test("VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353"); |
| |
| // Bad descriptorSetLayout handle, to be ignored if templateType is PUSH_DESCRIPTORS |
| create_info.set = 2; |
| create_info.descriptorSetLayout = CastFromUint64<VkDescriptorSetLayout>(badhandle); |
| VkDescriptorUpdateTemplateKHR dut = VK_NULL_HANDLE; |
| if (VK_SUCCESS == vk::CreateDescriptorUpdateTemplateKHR(*m_device, &create_info, nullptr, &dut)) { |
| vk::DestroyDescriptorUpdateTemplateKHR(*m_device, dut, nullptr); |
| } |
| // Bad descriptorSetLayout handle |
| create_info.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET; |
| do_test("VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350"); |
| } |
| |
| TEST_F(NegativePushDescriptor, CreateDescriptorUpdateTemplate14) { |
| TEST_DESCRIPTION("Verify error messages for invalid vkCreateDescriptorUpdateTemplate calls. Rely on 1.4 features"); |
| #ifdef __ANDROID__ |
| GTEST_SKIP() << "Skipped on Android pending further investigation."; |
| #endif |
| SetTargetApiVersion(VK_API_VERSION_1_4); |
| AddRequiredFeature(vkt::Feature::pushDescriptor); |
| RETURN_IF_SKIP(Init()); |
| |
| VkDescriptorSetLayoutBinding dsl_binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}; |
| const vkt::DescriptorSetLayout ds_layout_ub(*m_device, {dsl_binding}); |
| const vkt::DescriptorSetLayout ds_layout_ub1(*m_device, {dsl_binding}); |
| const vkt::DescriptorSetLayout ds_layout_ub_push(*m_device, {dsl_binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| const vkt::PipelineLayout pipeline_layout(*m_device, {{&ds_layout_ub, &ds_layout_ub1, &ds_layout_ub_push}}); |
| |
| constexpr uint64_t badhandle = 0xcadecade; |
| VkDescriptorUpdateTemplateEntry entries = {0, 0, 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, sizeof(VkBuffer)}; |
| VkDescriptorUpdateTemplateCreateInfo create_info = vku::InitStructHelper(); |
| create_info.flags = 0; |
| create_info.descriptorUpdateEntryCount = 1; |
| create_info.pDescriptorUpdateEntries = &entries; |
| |
| auto do_test = [&](const char* err) { |
| VkDescriptorUpdateTemplateKHR dut = VK_NULL_HANDLE; |
| m_errorMonitor->SetDesiredError(err); |
| if (VK_SUCCESS == vk::CreateDescriptorUpdateTemplate(*m_device, &create_info, nullptr, &dut)) { |
| vk::DestroyDescriptorUpdateTemplate(*m_device, dut, nullptr); |
| } |
| m_errorMonitor->VerifyFound(); |
| }; |
| |
| // Descriptor set type template |
| create_info.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET; |
| // descriptorSetLayout is NULL |
| do_test("VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350"); |
| |
| // Bad pipelineLayout handle, to be ignored if template type is DESCRIPTOR_SET |
| { |
| create_info.pipelineLayout = CastFromUint64<VkPipelineLayout>(badhandle); |
| create_info.descriptorSetLayout = ds_layout_ub; |
| VkDescriptorUpdateTemplateKHR dut = VK_NULL_HANDLE; |
| if (VK_SUCCESS == vk::CreateDescriptorUpdateTemplate(*m_device, &create_info, nullptr, &dut)) { |
| vk::DestroyDescriptorUpdateTemplate(*m_device, dut, nullptr); |
| } |
| } |
| |
| create_info.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS; |
| // Bad pipelineLayout handle |
| do_test("VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352"); |
| |
| create_info.pipelineBindPoint = VK_PIPELINE_BIND_POINT_COMPUTE; |
| create_info.pipelineLayout = pipeline_layout; |
| create_info.set = 2; |
| |
| // Bad bindpoint -- force fuzz the bind point |
| memset(&create_info.pipelineBindPoint, 0xFE, sizeof(create_info.pipelineBindPoint)); |
| do_test("VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351"); |
| create_info.pipelineBindPoint = VK_PIPELINE_BIND_POINT_COMPUTE; |
| |
| // Bad pipeline layout |
| create_info.pipelineLayout = VK_NULL_HANDLE; |
| do_test("VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352"); |
| create_info.pipelineLayout = pipeline_layout; |
| |
| // Wrong set # |
| create_info.set = 0; |
| do_test("VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353"); |
| |
| // Invalid set # |
| create_info.set = 42; |
| do_test("VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353"); |
| |
| // Bad descriptorSetLayout handle, to be ignored if templateType is PUSH_DESCRIPTORS |
| create_info.set = 2; |
| create_info.descriptorSetLayout = CastFromUint64<VkDescriptorSetLayout>(badhandle); |
| VkDescriptorUpdateTemplateKHR dut = VK_NULL_HANDLE; |
| if (VK_SUCCESS == vk::CreateDescriptorUpdateTemplate(*m_device, &create_info, nullptr, &dut)) { |
| vk::DestroyDescriptorUpdateTemplate(*m_device, dut, nullptr); |
| } |
| // Bad descriptorSetLayout handle |
| create_info.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET; |
| do_test("VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350"); |
| } |
| |
| TEST_F(NegativePushDescriptor, SetLayout) { |
| TEST_DESCRIPTION("Create a push descriptor set layout with invalid bindings."); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}; |
| |
| VkDescriptorSetLayoutCreateInfo ds_layout_ci = vku::InitStructHelper(); |
| ds_layout_ci.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT; |
| ds_layout_ci.bindingCount = 1; |
| ds_layout_ci.pBindings = &binding; |
| |
| // Starting with the initial VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC type set above.. |
| VkDescriptorSetLayout ds_layout = VK_NULL_HANDLE; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorSetLayoutCreateInfo-flags-00280"); |
| vk::CreateDescriptorSetLayout(*m_device, &ds_layout_ci, nullptr, &ds_layout); |
| m_errorMonitor->VerifyFound(); |
| |
| binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorSetLayoutCreateInfo-flags-00280"); |
| vk::CreateDescriptorSetLayout(*m_device, &ds_layout_ci, nullptr, &ds_layout); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativePushDescriptor, SetLayoutMaxPushDescriptors) { |
| TEST_DESCRIPTION("Create a push descriptor set layout with invalid bindings."); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| // Get the push descriptor limits |
| VkPhysicalDevicePushDescriptorPropertiesKHR push_descriptor_prop = vku::InitStructHelper(); |
| GetPhysicalDeviceProperties2(push_descriptor_prop); |
| |
| VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}; |
| |
| VkDescriptorSetLayoutCreateInfo ds_layout_ci = vku::InitStructHelper(); |
| ds_layout_ci.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT; |
| ds_layout_ci.bindingCount = 1; |
| ds_layout_ci.pBindings = &binding; |
| |
| if (push_descriptor_prop.maxPushDescriptors == vvl::kU32Max) { |
| GTEST_SKIP() << "maxPushDescriptors is set to maximum unit32_t value"; |
| } |
| |
| binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; |
| binding.descriptorCount = push_descriptor_prop.maxPushDescriptors + 1; |
| VkDescriptorSetLayout ds_layout = VK_NULL_HANDLE; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorSetLayoutCreateInfo-flags-00281"); |
| vk::CreateDescriptorSetLayout(*m_device, &ds_layout_ci, nullptr, &ds_layout); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativePushDescriptor, GetSupportSetLayout) { |
| TEST_DESCRIPTION("call vkGetDescriptorSetLayoutSupport on push descriptor set layout with invalid bindings."); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_MAINTENANCE_3_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}; |
| VkDescriptorSetLayoutCreateInfo ds_layout_ci = vku::InitStructHelper(); |
| ds_layout_ci.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT; |
| ds_layout_ci.bindingCount = 1; |
| ds_layout_ci.pBindings = &binding; |
| |
| VkDescriptorSetLayoutSupport support = vku::InitStructHelper(); |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorSetLayoutCreateInfo-flags-00280"); |
| vk::GetDescriptorSetLayoutSupportKHR(device(), &ds_layout_ci, &support); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativePushDescriptor, SetLayoutMutableDescriptor) { |
| TEST_DESCRIPTION("Create mutable descriptor set layout."); |
| AddRequiredExtensions(VK_EXT_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME); |
| AddRequiredExtensions(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| AddRequiredFeature(vkt::Feature::mutableDescriptorType); |
| RETURN_IF_SKIP(Init()); |
| InitRenderTarget(); |
| |
| VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_MUTABLE_EXT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}; |
| |
| VkDescriptorSetLayoutCreateInfo ds_layout_ci = vku::InitStructHelper(); |
| ds_layout_ci.bindingCount = 1; |
| ds_layout_ci.pBindings = &binding; |
| |
| VkDescriptorSetLayout ds_layout; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorSetLayoutCreateInfo-pBindings-07303"); |
| vk::CreateDescriptorSetLayout(device(), &ds_layout_ci, nullptr, &ds_layout); |
| m_errorMonitor->VerifyFound(); |
| |
| VkDescriptorType types[2] = { |
| VK_DESCRIPTOR_TYPE_SAMPLER, |
| VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, |
| }; |
| |
| VkMutableDescriptorTypeListEXT list = {2, types}; |
| VkMutableDescriptorTypeCreateInfoEXT mdtci = vku::InitStructHelper(); |
| mdtci.mutableDescriptorTypeListCount = 1; |
| mdtci.pMutableDescriptorTypeLists = &list; |
| |
| ds_layout_ci.pNext = &mdtci; |
| |
| list.descriptorTypeCount = 0; |
| binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER; |
| ds_layout_ci.flags = |
| VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT | VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_EXT; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorSetLayoutCreateInfo-flags-04590"); |
| vk::CreateDescriptorSetLayout(device(), &ds_layout_ci, nullptr, &ds_layout); |
| m_errorMonitor->VerifyFound(); |
| |
| ds_layout_ci.flags = |
| VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT | VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_EXT; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorSetLayoutCreateInfo-flags-04592"); |
| vk::CreateDescriptorSetLayout(device(), &ds_layout_ci, nullptr, &ds_layout); |
| m_errorMonitor->VerifyFound(); |
| |
| list.descriptorTypeCount = 2; |
| binding.descriptorType = VK_DESCRIPTOR_TYPE_MUTABLE_EXT; |
| ds_layout_ci.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorSetLayoutCreateInfo-flags-04591"); |
| vk::CreateDescriptorSetLayout(device(), &ds_layout_ci, nullptr, &ds_layout); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativePushDescriptor, DescriptorUpdateTemplateEntryWithInlineUniformBlock) { |
| TEST_DESCRIPTION("Test VkDescriptorUpdateTemplateEntry with descriptor type VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK"); |
| |
| AddRequiredExtensions(VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME); |
| AddRequiredExtensions(VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| std::vector<VkDescriptorSetLayoutBinding> ds_bindings = { |
| {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}}; |
| OneOffDescriptorSet descriptor_set(m_device, ds_bindings); |
| |
| vkt::Buffer buffer(*m_device, m_device->Physical().limits_.minUniformBufferOffsetAlignment, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); |
| |
| struct SimpleTemplateData { |
| VkDescriptorBufferInfo buff_info; |
| }; |
| |
| VkDescriptorUpdateTemplateEntry update_template_entry = {}; |
| update_template_entry.dstBinding = 0; |
| update_template_entry.dstArrayElement = 2; |
| update_template_entry.descriptorCount = 1; |
| update_template_entry.descriptorType = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK; |
| update_template_entry.offset = offsetof(SimpleTemplateData, buff_info); |
| update_template_entry.stride = sizeof(SimpleTemplateData); |
| |
| VkDescriptorUpdateTemplateCreateInfo update_template_ci = vku::InitStructHelper(); |
| update_template_ci.descriptorUpdateEntryCount = 1; |
| update_template_ci.pDescriptorUpdateEntries = &update_template_entry; |
| update_template_ci.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET; |
| update_template_ci.descriptorSetLayout = descriptor_set.layout_; |
| |
| VkDescriptorUpdateTemplate update_template = VK_NULL_HANDLE; |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorUpdateTemplateEntry-descriptor-02226"); |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorUpdateTemplateEntry-descriptor-02227"); |
| vk::CreateDescriptorUpdateTemplateKHR(device(), &update_template_ci, nullptr, &update_template); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativePushDescriptor, SetCmdPushQueueFamily) { |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| // Create ordinary and push descriptor set layout |
| VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}; |
| const vkt::DescriptorSetLayout ds_layout(*m_device, {binding}); |
| const vkt::DescriptorSetLayout push_ds_layout(*m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| |
| // Now use the descriptor set layouts to create a pipeline layout |
| const vkt::PipelineLayout pipeline_layout(*m_device, {&push_ds_layout, &ds_layout}); |
| |
| vkt::Buffer buffer(*m_device, sizeof(uint32_t) * 4, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT); |
| |
| // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from WriteDescriptorSet |
| // references its data), and the DescriptorSet() can be temporary, because the value is ignored |
| VkDescriptorBufferInfo buffer_info = {buffer, 0, VK_WHOLE_SIZE}; |
| |
| VkWriteDescriptorSet descriptor_write = |
| vkt::Device::WriteDescriptorSet(vkt::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info); |
| |
| // Create command pool on a non-graphics queue |
| const std::optional<uint32_t> compute_qfi = m_device->ComputeOnlyQueueFamily(); |
| const std::optional<uint32_t> transfer_qfi = m_device->TransferOnlyQueueFamily(); |
| if (!transfer_qfi && !compute_qfi) { |
| GTEST_SKIP() << "Queue family type not supported"; |
| } |
| |
| const uint32_t err_qfi = compute_qfi ? compute_qfi.value() : transfer_qfi.value(); |
| |
| vkt::CommandPool command_pool(*m_device, err_qfi); |
| vkt::CommandBuffer command_buffer(*m_device, command_pool); |
| command_buffer.Begin(); |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSet-pipelineBindPoint-00363"); |
| m_errorMonitor->SetDesiredError("VUID-VkWriteDescriptorSet-descriptorType-00330"); |
| if (err_qfi == transfer_qfi) { |
| // This as this queue neither supports the gfx or compute bindpoints, we'll get two errors |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSet-commandBuffer-cmdpool"); |
| } |
| vk::CmdPushDescriptorSetKHR(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| command_buffer.End(); |
| |
| // If we succeed in testing only one condition above, we need to test the other below. |
| if (transfer_qfi && err_qfi != transfer_qfi.value()) { |
| // Need to test the neither compute/gfx supported case separately. |
| vkt::CommandPool tran_command_pool(*m_device, transfer_qfi.value()); |
| vkt::CommandBuffer tran_command_buffer(*m_device, tran_command_pool); |
| tran_command_buffer.Begin(); |
| |
| // We can't avoid getting *both* errors in this case |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSet-pipelineBindPoint-00363"); |
| m_errorMonitor->SetDesiredError("VUID-VkWriteDescriptorSet-descriptorType-00330"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSet-commandBuffer-cmdpool"); |
| vk::CmdPushDescriptorSetKHR(tran_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| tran_command_buffer.End(); |
| } |
| } |
| |
| TEST_F(NegativePushDescriptor, SetCmdPush) { |
| TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments."); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| // Create ordinary and push descriptor set layout |
| VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}; |
| const vkt::DescriptorSetLayout ds_layout(*m_device, {binding}); |
| const vkt::DescriptorSetLayout push_ds_layout(*m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| |
| const vkt::PipelineLayout pipeline_layout(*m_device, {&push_ds_layout, &ds_layout}); |
| |
| vkt::Buffer buffer(*m_device, 16, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT); |
| |
| // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from WriteDescriptorSet |
| // references its data), and the DescriptorSet() can be temporary, because the value is ignored |
| VkDescriptorBufferInfo buffer_info = {buffer, 0, VK_WHOLE_SIZE}; |
| |
| VkWriteDescriptorSet descriptor_write = |
| vkt::Device::WriteDescriptorSet(vkt::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info); |
| |
| // Push to the non-push binding |
| m_command_buffer.Begin(); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSet-set-00365"); |
| vk::CmdPushDescriptorSetKHR(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 1, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| |
| // Specify set out of bounds |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSet-set-00364"); |
| vk::CmdPushDescriptorSetKHR(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 2, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.End(); |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSet-commandBuffer-recording"); |
| m_errorMonitor->SetDesiredError("VUID-VkWriteDescriptorSet-descriptorType-00330"); |
| vk::CmdPushDescriptorSetKHR(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativePushDescriptor, SetCmdPush14) { |
| TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments. Rely on 1.4 for the feature"); |
| SetTargetApiVersion(VK_API_VERSION_1_4); |
| AddRequiredFeature(vkt::Feature::pushDescriptor); |
| RETURN_IF_SKIP(Init()); |
| |
| // Create ordinary and push descriptor set layout |
| VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}; |
| const vkt::DescriptorSetLayout ds_layout(*m_device, {binding}); |
| const vkt::DescriptorSetLayout push_ds_layout(*m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| const vkt::PipelineLayout pipeline_layout(*m_device, {&push_ds_layout, &ds_layout}); |
| |
| vkt::Buffer buffer(*m_device, 16, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT); |
| |
| // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from WriteDescriptorSet |
| // references its data), and the DescriptorSet() can be temporary, because the value is ignored |
| VkDescriptorBufferInfo buffer_info = {buffer, 0, VK_WHOLE_SIZE}; |
| |
| VkWriteDescriptorSet descriptor_write = |
| vkt::Device::WriteDescriptorSet(vkt::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info); |
| |
| // Push to the non-push binding |
| m_command_buffer.Begin(); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSet-set-00365"); |
| vk::CmdPushDescriptorSet(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 1, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| |
| // Specify set out of bounds |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSet-set-00364"); |
| vk::CmdPushDescriptorSet(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 2, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.End(); |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSet-commandBuffer-recording"); |
| m_errorMonitor->SetDesiredError("VUID-VkWriteDescriptorSet-descriptorType-00330"); |
| vk::CmdPushDescriptorSet(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativePushDescriptor, DestroyLayout) { |
| TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments."); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| vkt::Buffer buffer(*m_device, sizeof(uint32_t) * 4, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT); |
| VkDescriptorBufferInfo buffer_info = {buffer, 0, VK_WHOLE_SIZE}; |
| VkWriteDescriptorSet descriptor_write = |
| vkt::Device::WriteDescriptorSet(vkt::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info); |
| |
| m_command_buffer.Begin(); |
| VkPipelineLayout invalid_layout = CastToHandle<VkPipelineLayout, uintptr_t>(0xbaadbeef); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSet-layout-parameter"); |
| vk::CmdPushDescriptorSetKHR(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, invalid_layout, 1, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativePushDescriptor, SetCmdBufferOffsetUnaligned) { |
| TEST_DESCRIPTION("Attempt to push a push descriptor set buffer with unaligned offset."); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| auto const min_alignment = m_device->Physical().limits_.minUniformBufferOffsetAlignment; |
| if (min_alignment == 0) { |
| GTEST_SKIP() << "minUniformBufferOffsetAlignment is zero"; |
| } |
| |
| VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}; |
| const vkt::DescriptorSetLayout push_ds_layout(*m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| ASSERT_TRUE(push_ds_layout.initialized()); |
| |
| const vkt::PipelineLayout pipeline_layout(*m_device, {&push_ds_layout}); |
| ASSERT_TRUE(pipeline_layout.initialized()); |
| |
| vkt::Buffer buffer(*m_device, sizeof(uint32_t) * 4, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); |
| |
| // Use an invalid alignment. |
| VkDescriptorBufferInfo buffer_info = {buffer, min_alignment - 1, VK_WHOLE_SIZE}; |
| VkWriteDescriptorSet descriptor_write = |
| vkt::Device::WriteDescriptorSet(vkt::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info); |
| |
| m_command_buffer.Begin(); |
| m_errorMonitor->SetDesiredError("VUID-VkWriteDescriptorSet-descriptorType-00327"); |
| vk::CmdPushDescriptorSetKHR(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, DescriptorWriteMissingImageInfo) { |
| TEST_DESCRIPTION("Attempt to write descriptor with missing image info"); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| OneOffDescriptorSet descriptor_set(m_device, |
| { |
| {0, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_ALL, nullptr}, |
| }, |
| VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| |
| const vkt::PipelineLayout pipeline_layout(*m_device, {&descriptor_set.layout_}); |
| |
| VkWriteDescriptorSet descriptor_write = vku::InitStructHelper(); |
| descriptor_write.dstSet = 0u; |
| descriptor_write.dstBinding = 0u; |
| descriptor_write.dstArrayElement = 0u; |
| descriptor_write.descriptorCount = 1u; |
| descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; |
| descriptor_write.pImageInfo = nullptr; |
| |
| m_command_buffer.Begin(); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSet-pDescriptorWrites-06494"); |
| vk::CmdPushDescriptorSetKHR(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0u, 1u, &descriptor_write); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, UnsupportedDescriptorTemplateBindPoint) { |
| TEST_DESCRIPTION("Push descriptor set with cmd buffer that doesn't support pipeline bind point"); |
| |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| const std::optional<uint32_t> compute_qfi = m_device->ComputeOnlyQueueFamily(); |
| if (!compute_qfi.has_value()) { |
| GTEST_SKIP() << "Required queue family capabilities not found."; |
| } |
| |
| vkt::CommandPool command_pool(*m_device, compute_qfi.value()); |
| vkt::CommandBuffer command_buffer(*m_device, command_pool); |
| |
| vkt::Buffer buffer(*m_device, 32, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); |
| |
| std::vector<VkDescriptorSetLayoutBinding> ds_bindings = { |
| {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}}; |
| OneOffDescriptorSet descriptor_set(m_device, ds_bindings); |
| |
| vkt::DescriptorSetLayout push_dsl(*m_device, ds_bindings, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| |
| vkt::PipelineLayout pipeline_layout(*m_device, {&push_dsl}); |
| |
| struct SimpleTemplateData { |
| VkDescriptorBufferInfo buff_info; |
| }; |
| |
| VkDescriptorUpdateTemplateEntry update_template_entry = {}; |
| update_template_entry.dstBinding = 0; |
| update_template_entry.dstArrayElement = 0; |
| update_template_entry.descriptorCount = 1; |
| update_template_entry.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
| update_template_entry.offset = offsetof(SimpleTemplateData, buff_info); |
| update_template_entry.stride = sizeof(SimpleTemplateData); |
| |
| VkDescriptorUpdateTemplateCreateInfo update_template_ci = vku::InitStructHelper(); |
| update_template_ci.descriptorUpdateEntryCount = 1; |
| update_template_ci.pDescriptorUpdateEntries = &update_template_entry; |
| update_template_ci.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS; |
| update_template_ci.descriptorSetLayout = descriptor_set.layout_; |
| update_template_ci.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; |
| update_template_ci.pipelineLayout = pipeline_layout; |
| vkt::DescriptorUpdateTemplate update_template(*m_device, update_template_ci); |
| |
| SimpleTemplateData update_template_data; |
| update_template_data.buff_info = {buffer, 0, 32}; |
| |
| command_buffer.Begin(); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSetWithTemplate-commandBuffer-00366"); |
| vk::CmdPushDescriptorSetWithTemplateKHR(command_buffer, update_template, pipeline_layout, 0, &update_template_data); |
| m_errorMonitor->VerifyFound(); |
| command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, InvalidDescriptorUpdateTemplateType) { |
| TEST_DESCRIPTION("Use descriptor template with invalid descriptorType"); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| vkt::Buffer buffer(*m_device, 32, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); |
| |
| std::vector<VkDescriptorSetLayoutBinding> ds_bindings = { |
| {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}}; |
| OneOffDescriptorSet descriptor_set(m_device, ds_bindings); |
| |
| vkt::DescriptorSetLayout push_dsl(*m_device, ds_bindings, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| |
| vkt::PipelineLayout pipeline_layout(*m_device, {&push_dsl}); |
| |
| struct SimpleTemplateData { |
| VkDescriptorBufferInfo buff_info; |
| }; |
| |
| VkDescriptorUpdateTemplateEntry update_template_entry = {}; |
| update_template_entry.dstBinding = 0; |
| update_template_entry.dstArrayElement = 0; |
| update_template_entry.descriptorCount = 1; |
| update_template_entry.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
| update_template_entry.offset = offsetof(SimpleTemplateData, buff_info); |
| update_template_entry.stride = sizeof(SimpleTemplateData); |
| |
| VkDescriptorUpdateTemplateCreateInfo update_template_ci = vku::InitStructHelper(); |
| update_template_ci.descriptorUpdateEntryCount = 1; |
| update_template_ci.pDescriptorUpdateEntries = &update_template_entry; |
| update_template_ci.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET; |
| update_template_ci.descriptorSetLayout = descriptor_set.layout_; |
| update_template_ci.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; |
| update_template_ci.pipelineLayout = pipeline_layout; |
| vkt::DescriptorUpdateTemplate update_template(*m_device, update_template_ci); |
| |
| SimpleTemplateData update_template_data; |
| update_template_data.buff_info = {buffer, 0, 32}; |
| |
| m_command_buffer.Begin(); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSetWithTemplate-descriptorUpdateTemplate-07994"); |
| vk::CmdPushDescriptorSetWithTemplateKHR(m_command_buffer, update_template, pipeline_layout, 0, &update_template_data); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, DescriptorTemplateIncompatibleLayout) { |
| TEST_DESCRIPTION("Update descriptor set with template with incompatible pipeline layout"); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| vkt::Buffer buffer(*m_device, 32, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); |
| |
| std::vector<VkDescriptorSetLayoutBinding> ds_bindings = { |
| {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}}; |
| OneOffDescriptorSet descriptor_set(m_device, ds_bindings); |
| |
| vkt::DescriptorSetLayout push_dsl(*m_device, ds_bindings, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| vkt::DescriptorSetLayout push_dsl2(*m_device, {{1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}}, |
| VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| vkt::DescriptorSetLayout normal_dsl(*m_device, ds_bindings); |
| |
| vkt::PipelineLayout pipeline_layout(*m_device, {&push_dsl}); |
| vkt::PipelineLayout pipeline_layout2(*m_device, {&push_dsl2}); |
| vkt::PipelineLayout pipeline_layout3(*m_device, {&push_dsl, &normal_dsl}); |
| |
| struct SimpleTemplateData { |
| VkDescriptorBufferInfo buff_info; |
| }; |
| |
| VkDescriptorUpdateTemplateEntry update_template_entry = {}; |
| update_template_entry.dstBinding = 0; |
| update_template_entry.dstArrayElement = 0; |
| update_template_entry.descriptorCount = 1; |
| update_template_entry.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
| update_template_entry.offset = offsetof(SimpleTemplateData, buff_info); |
| update_template_entry.stride = sizeof(SimpleTemplateData); |
| |
| VkDescriptorUpdateTemplateCreateInfo update_template_ci = vku::InitStructHelper(); |
| update_template_ci.descriptorUpdateEntryCount = 1; |
| update_template_ci.pDescriptorUpdateEntries = &update_template_entry; |
| update_template_ci.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS; |
| update_template_ci.descriptorSetLayout = descriptor_set.layout_; |
| update_template_ci.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; |
| update_template_ci.pipelineLayout = pipeline_layout; |
| vkt::DescriptorUpdateTemplate update_template(*m_device, update_template_ci); |
| |
| update_template_ci.descriptorSetLayout = normal_dsl; |
| update_template_ci.pipelineLayout = pipeline_layout3; |
| vkt::DescriptorUpdateTemplate update_template2(*m_device, update_template_ci); |
| |
| SimpleTemplateData update_template_data; |
| update_template_data.buff_info = {buffer, 0, 32}; |
| |
| m_command_buffer.Begin(); |
| |
| // bindings don't match up |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSetWithTemplate-layout-07993"); |
| vk::CmdPushDescriptorSetWithTemplateKHR(m_command_buffer, update_template, pipeline_layout2, 0, &update_template_data); |
| m_errorMonitor->VerifyFound(); |
| |
| // OOB |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSetWithTemplate-set-07304"); |
| vk::CmdPushDescriptorSetWithTemplateKHR(m_command_buffer, update_template, pipeline_layout, 1, &update_template_data); |
| m_errorMonitor->VerifyFound(); |
| |
| // Missing Push Descriptor Flag |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSetWithTemplate-set-07995"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSetWithTemplate-set-07305"); |
| vk::CmdPushDescriptorSetWithTemplateKHR(m_command_buffer, update_template2, pipeline_layout3, 1, &update_template_data); |
| m_errorMonitor->VerifyFound(); |
| |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, PushDescriptorSetInfoPerStage) { |
| SetTargetApiVersion(VK_API_VERSION_1_1); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_MAINTENANCE_6_EXTENSION_NAME); |
| AddRequiredExtensions(VK_NV_PER_STAGE_DESCRIPTOR_SET_EXTENSION_NAME); |
| AddRequiredFeature(vkt::Feature::dynamicPipelineLayout); |
| RETURN_IF_SKIP(Init()); |
| |
| vkt::Buffer buffer(*m_device, 256u, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT); |
| |
| VkDescriptorBufferInfo descriptor_buffer_info; |
| descriptor_buffer_info.buffer = buffer; |
| descriptor_buffer_info.offset = 0u; |
| descriptor_buffer_info.range = VK_WHOLE_SIZE; |
| |
| VkWriteDescriptorSet descriptor_write = vku::InitStructHelper(); |
| descriptor_write.dstSet = 0u; |
| descriptor_write.dstBinding = 0u; |
| descriptor_write.dstArrayElement = 0u; |
| descriptor_write.descriptorCount = 1u; |
| descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; |
| descriptor_write.pBufferInfo = &descriptor_buffer_info; |
| |
| VkPushDescriptorSetInfo push_descriptor_set_info = vku::InitStructHelper(); |
| push_descriptor_set_info.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; |
| push_descriptor_set_info.layout = VK_NULL_HANDLE; |
| push_descriptor_set_info.set = 0u; |
| push_descriptor_set_info.descriptorWriteCount = 1u; |
| push_descriptor_set_info.pDescriptorWrites = &descriptor_write; |
| |
| m_command_buffer.Begin(); |
| m_errorMonitor->SetDesiredError("VUID-VkPushDescriptorSetInfo-layout-09496"); |
| vk::CmdPushDescriptorSet2KHR(m_command_buffer, &push_descriptor_set_info); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, NullData) { |
| TEST_DESCRIPTION("Basic use of vkCmdPushDescriptorSetWithTemplateKHR"); |
| AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME); |
| RETURN_IF_SKIP(Init()); |
| |
| VkDescriptorSetLayoutBinding ds_bindings = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}; |
| OneOffDescriptorSet descriptor_set(m_device, {ds_bindings}); |
| vkt::DescriptorSetLayout push_dsl(*m_device, ds_bindings, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| |
| vkt::PipelineLayout pipeline_layout(*m_device, {&push_dsl}); |
| |
| struct SimpleTemplateData { |
| VkDescriptorBufferInfo buff_info; |
| }; |
| |
| VkDescriptorUpdateTemplateEntry update_template_entry = {}; |
| update_template_entry.dstBinding = 0; |
| update_template_entry.dstArrayElement = 0; |
| update_template_entry.descriptorCount = 1; |
| update_template_entry.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
| update_template_entry.offset = offsetof(SimpleTemplateData, buff_info); |
| update_template_entry.stride = sizeof(SimpleTemplateData); |
| |
| VkDescriptorUpdateTemplateCreateInfo update_template_ci = vku::InitStructHelper(); |
| update_template_ci.descriptorUpdateEntryCount = 1; |
| update_template_ci.pDescriptorUpdateEntries = &update_template_entry; |
| update_template_ci.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS; |
| update_template_ci.descriptorSetLayout = descriptor_set.layout_; |
| update_template_ci.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; |
| update_template_ci.pipelineLayout = pipeline_layout; |
| |
| vkt::DescriptorUpdateTemplate update_template(*m_device, update_template_ci); |
| |
| m_command_buffer.Begin(); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPushDescriptorSetWithTemplate-pData-01686"); |
| vk::CmdPushDescriptorSetWithTemplateKHR(m_command_buffer, update_template, pipeline_layout, 0, nullptr); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativePushDescriptor, Feature14) { |
| TEST_DESCRIPTION("https://gitlab.khronos.org/vulkan/vulkan/-/merge_requests/6885"); |
| SetTargetApiVersion(VK_API_VERSION_1_4); |
| RETURN_IF_SKIP(Init()); |
| InitRenderTarget(); |
| |
| VkDescriptorSetLayoutBinding dsl_binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}; |
| const vkt::DescriptorSetLayout ds_layout(*m_device, {dsl_binding}); |
| m_errorMonitor->SetDesiredError("VUID-VkDescriptorSetLayoutCreateInfo-flags-10354"); |
| const vkt::DescriptorSetLayout push_ds_layout(*m_device, {dsl_binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT); |
| m_errorMonitor->VerifyFound(); |
| } |