diff options
author | unknown <locke@lunarg.com> | 2019-06-03 11:47:40 -0600 |
---|---|---|
committer | Locke Lin <47329816+locke-lunarg@users.noreply.github.com> | 2019-06-05 00:21:24 -0600 |
commit | 11b2e80ae1ca5eec3c60fd199a79eb28d687bf34 (patch) | |
tree | 607e0bd1f3da8cd6c88fefb499a172ac90598ef7 /tests/layer_validation_tests.cpp | |
parent | 088160a6f470598c62f9c708d4f85215dab7c481 (diff) | |
download | vulkan-validation-layers-11b2e80ae1ca5eec3c60fd199a79eb28d687bf34.tar.gz |
tests: Add common code
Diffstat (limited to 'tests/layer_validation_tests.cpp')
-rw-r--r-- | tests/layer_validation_tests.cpp | 258 |
1 files changed, 253 insertions, 5 deletions
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp index 9f4187413..2f96d5de7 100644 --- a/tests/layer_validation_tests.cpp +++ b/tests/layer_validation_tests.cpp @@ -395,6 +395,101 @@ void NegHeightViewportTests(VkDeviceObj *m_device, VkCommandBufferObj *m_command } } +void CreateSamplerTest(VkLayerTest &test, const VkSamplerCreateInfo *pCreateInfo, std::string code) { + VkResult err; + VkSampler sampler = VK_NULL_HANDLE; + if (code.length()) + test.Monitor()->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, code); + else + test.Monitor()->ExpectSuccess(); + + err = vkCreateSampler(test.device(), pCreateInfo, NULL, &sampler); + if (code.length()) + test.Monitor()->VerifyFound(); + else + test.Monitor()->VerifyNotFound(); + + if (VK_SUCCESS == err) { + vkDestroySampler(test.device(), sampler, NULL); + } +} + +void CreateBufferTest(VkLayerTest &test, const VkBufferCreateInfo *pCreateInfo, std::string code) { + VkResult err; + VkBuffer buffer = VK_NULL_HANDLE; + if (code.length()) + test.Monitor()->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, code); + else + test.Monitor()->ExpectSuccess(); + + err = vkCreateBuffer(test.device(), pCreateInfo, NULL, &buffer); + if (code.length()) + test.Monitor()->VerifyFound(); + else + test.Monitor()->VerifyNotFound(); + + if (VK_SUCCESS == err) { + vkDestroyBuffer(test.device(), buffer, NULL); + } +} + +void CreateImageTest(VkLayerTest &test, const VkImageCreateInfo *pCreateInfo, std::string code) { + VkResult err; + VkImage image = VK_NULL_HANDLE; + if (code.length()) + test.Monitor()->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, code); + else + test.Monitor()->ExpectSuccess(); + + err = vkCreateImage(test.device(), pCreateInfo, NULL, &image); + if (code.length()) + test.Monitor()->VerifyFound(); + else + test.Monitor()->VerifyNotFound(); + + if (VK_SUCCESS == err) { + vkDestroyImage(test.device(), image, NULL); + } +} + +void CreateBufferViewTest(VkLayerTest &test, const VkBufferViewCreateInfo *pCreateInfo, std::string code) { + VkResult err; + VkBufferView view = VK_NULL_HANDLE; + if (code.length()) + test.Monitor()->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, code); + else + test.Monitor()->ExpectSuccess(); + + err = vkCreateBufferView(test.device(), pCreateInfo, NULL, &view); + if (code.length()) + test.Monitor()->VerifyFound(); + else + test.Monitor()->VerifyNotFound(); + + if (VK_SUCCESS == err) { + vkDestroyBufferView(test.device(), view, NULL); + } +} + +void CreateImageViewTest(VkLayerTest &test, const VkImageViewCreateInfo *pCreateInfo, std::string code) { + VkResult err; + VkImageView view = VK_NULL_HANDLE; + if (code.length()) + test.Monitor()->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, code); + else + test.Monitor()->ExpectSuccess(); + + err = vkCreateImageView(test.device(), pCreateInfo, NULL, &view); + if (code.length()) + test.Monitor()->VerifyFound(); + else + test.Monitor()->VerifyNotFound(); + + if (VK_SUCCESS == err) { + vkDestroyImageView(test.device(), view, NULL); + } +} + VkSamplerCreateInfo SafeSaneSamplerCreateInfo() { VkSamplerCreateInfo sampler_create_info = {}; sampler_create_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; @@ -1099,6 +1194,14 @@ bool VkVerticesObj::AddVertexInputToPipe(VkPipelineObj &aPipelineObj) { return true; } +bool VkVerticesObj::AddVertexInputToPipeHelpr(CreatePipelineHelper *pipelineHelper) { + pipelineHelper->vi_ci_.pVertexBindingDescriptions = VertexInputBindingDescription; + pipelineHelper->vi_ci_.vertexBindingDescriptionCount = BindingCount; + pipelineHelper->vi_ci_.pVertexAttributeDescriptions = VertexInputAttributeDescription; + pipelineHelper->vi_ci_.vertexAttributeDescriptionCount = AttributeCount; + return true; +} + void VkVerticesObj::BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount, VkDeviceSize *aOffsetList) { VkDeviceSize *offsetList; unsigned offsetCount; @@ -1145,6 +1248,70 @@ OneOffDescriptorSet::~OneOffDescriptorSet() { bool OneOffDescriptorSet::Initialized() { return pool_ != VK_NULL_HANDLE && layout_.initialized() && set_ != VK_NULL_HANDLE; } +void OneOffDescriptorSet::WriteDescriptorBuffer(int blinding, VkBuffer buffer, VkDeviceSize size, VkDescriptorType descriptorType) { + VkDescriptorBufferInfo buffer_info = {}; + buffer_info.buffer = buffer; + buffer_info.offset = 0; + buffer_info.range = size; + buffer_infos.emplace_back(buffer_info); + size_t index = buffer_infos.size() - 1; + + VkWriteDescriptorSet descriptor_write; + memset(&descriptor_write, 0, sizeof(descriptor_write)); + descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + descriptor_write.dstSet = set_; + descriptor_write.dstBinding = blinding; + descriptor_write.descriptorCount = 1; + descriptor_write.descriptorType = descriptorType; + descriptor_write.pBufferInfo = &buffer_infos[index]; + descriptor_write.pImageInfo = nullptr; + descriptor_write.pTexelBufferView = nullptr; + + descriptor_writes.emplace_back(descriptor_write); +} + +void OneOffDescriptorSet::WriteDescriptorBufferView(int blinding, VkBufferView &buffer_view, VkDescriptorType descriptorType) { + VkWriteDescriptorSet descriptor_write; + memset(&descriptor_write, 0, sizeof(descriptor_write)); + descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + descriptor_write.dstSet = set_; + descriptor_write.dstBinding = blinding; + descriptor_write.descriptorCount = 1; + descriptor_write.descriptorType = descriptorType; + descriptor_write.pTexelBufferView = &buffer_view; + descriptor_write.pImageInfo = nullptr; + descriptor_write.pBufferInfo = nullptr; + + descriptor_writes.emplace_back(descriptor_write); +} + +void OneOffDescriptorSet::WriteDescriptorImageView(int blinding, VkImageView image_view, VkSampler sampler, + VkDescriptorType descriptorType) { + VkDescriptorImageInfo image_info = {}; + image_info.imageView = image_view; + image_info.sampler = sampler; + image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + image_infos.emplace_back(image_info); + size_t index = image_infos.size() - 1; + + VkWriteDescriptorSet descriptor_write; + memset(&descriptor_write, 0, sizeof(descriptor_write)); + descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + descriptor_write.dstSet = set_; + descriptor_write.dstBinding = blinding; + descriptor_write.descriptorCount = 1; + descriptor_write.descriptorType = descriptorType; + descriptor_write.pImageInfo = &image_infos[index]; + descriptor_write.pBufferInfo = nullptr; + descriptor_write.pTexelBufferView = nullptr; + + descriptor_writes.emplace_back(descriptor_write); +} + +void OneOffDescriptorSet::UpdateDescriptorSets() { + vkUpdateDescriptorSets(device_->handle(), descriptor_writes.size(), descriptor_writes.data(), 0, NULL); +} + CreatePipelineHelper::CreatePipelineHelper(VkLayerTest &test) : layer_test_(test) {} CreatePipelineHelper::~CreatePipelineHelper() { @@ -1321,6 +1488,84 @@ VkResult CreatePipelineHelper::CreateGraphicsPipeline(bool implicit_destroy, boo return err; } +CreateComputePipelineHelper::CreateComputePipelineHelper(VkLayerTest &test) : layer_test_(test) {} + +CreateComputePipelineHelper::~CreateComputePipelineHelper() { + VkDevice device = layer_test_.device(); + vkDestroyPipelineCache(device, pipeline_cache_, nullptr); + vkDestroyPipeline(device, pipeline_, nullptr); +} + +void CreateComputePipelineHelper::InitDescriptorSetInfo() { + dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}}; +} + +void CreateComputePipelineHelper::InitPipelineLayoutInfo() { + pipeline_layout_ci_.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + pipeline_layout_ci_.setLayoutCount = 1; // Not really changeable because InitState() sets exactly one pSetLayout + pipeline_layout_ci_.pSetLayouts = nullptr; // must bound after it is created +} + +void CreateComputePipelineHelper::InitShaderInfo() { + cs_.reset(new VkShaderObj(layer_test_.DeviceObj(), bindStateMinimalShaderText, VK_SHADER_STAGE_COMPUTE_BIT, &layer_test_)); + // We shouldn't need a fragment shader but add it to be able to run on more devices +} + +void CreateComputePipelineHelper::InitComputePipelineInfo() { + cp_ci_.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; + cp_ci_.pNext = nullptr; + cp_ci_.flags = 0; +} + +void CreateComputePipelineHelper::InitPipelineCacheInfo() { + pc_ci_.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; + pc_ci_.pNext = nullptr; + pc_ci_.flags = 0; + pc_ci_.initialDataSize = 0; + pc_ci_.pInitialData = nullptr; +} + +void CreateComputePipelineHelper::InitInfo() { + InitDescriptorSetInfo(); + InitPipelineLayoutInfo(); + InitShaderInfo(); + InitComputePipelineInfo(); + InitPipelineCacheInfo(); +} + +void CreateComputePipelineHelper::InitState() { + VkResult err; + descriptor_set_.reset(new OneOffDescriptorSet(layer_test_.DeviceObj(), dsl_bindings_)); + ASSERT_TRUE(descriptor_set_->Initialized()); + + const std::vector<VkPushConstantRange> push_ranges( + pipeline_layout_ci_.pPushConstantRanges, + pipeline_layout_ci_.pPushConstantRanges + pipeline_layout_ci_.pushConstantRangeCount); + pipeline_layout_ = VkPipelineLayoutObj(layer_test_.DeviceObj(), {&descriptor_set_->layout_}, push_ranges); + + err = vkCreatePipelineCache(layer_test_.device(), &pc_ci_, NULL, &pipeline_cache_); + ASSERT_VK_SUCCESS(err); +} + +void CreateComputePipelineHelper::LateBindPipelineInfo() { + // By value or dynamically located items must be late bound + cp_ci_.layout = pipeline_layout_.handle(); + cp_ci_.stage = cs_.get()->GetStageCreateInfo(); +} + +VkResult CreateComputePipelineHelper::CreateComputePipeline(bool implicit_destroy, bool do_late_bind) { + VkResult err; + if (do_late_bind) { + LateBindPipelineInfo(); + } + if (implicit_destroy && (pipeline_ != VK_NULL_HANDLE)) { + vkDestroyPipeline(layer_test_.device(), pipeline_, nullptr); + pipeline_ = VK_NULL_HANDLE; + } + err = vkCreateComputePipelines(layer_test_.device(), pipeline_cache_, 1, &cp_ci_, NULL, &pipeline_); + return err; +} + CreateNVRayTracingPipelineHelper::CreateNVRayTracingPipelineHelper(VkLayerTest &test) : layer_test_(test) {} CreateNVRayTracingPipelineHelper::~CreateNVRayTracingPipelineHelper() { VkDevice device = layer_test_.device(); @@ -1557,16 +1802,19 @@ void BarrierQueueFamilyTestHelper::Context::Reset() { BarrierQueueFamilyTestHelper::BarrierQueueFamilyTestHelper(Context *context) : context_(context), image_(context->layer_test->DeviceObj()) {} -void BarrierQueueFamilyTestHelper::Init(std::vector<uint32_t> *families) { +void BarrierQueueFamilyTestHelper::Init(std::vector<uint32_t> *families, bool image_memory, bool buffer_memory) { VkDeviceObj *device_obj = context_->layer_test->DeviceObj(); - image_.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0, families); + + image_.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0, families, + image_memory); + ASSERT_TRUE(image_.initialized()); image_barrier_ = image_.image_memory_barrier(VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_TRANSFER_READ_BIT, image_.Layout(), image_.Layout(), image_.subresource_range(VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1)); VkMemoryPropertyFlags mem_prop = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; - buffer_.init_as_src_and_dst(*device_obj, 256, mem_prop, families); + buffer_.init_as_src_and_dst(*device_obj, 256, mem_prop, families, buffer_memory); ASSERT_TRUE(buffer_.initialized()); buffer_barrier_ = buffer_.buffer_memory_barrier(VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_TRANSFER_READ_BIT, 0, VK_WHOLE_SIZE); } @@ -1586,8 +1834,8 @@ BarrierQueueFamilyTestHelper::QueueFamilyObjs *BarrierQueueFamilyTestHelper::Get void BarrierQueueFamilyTestHelper::operator()(std::string img_err, std::string buf_err, uint32_t src, uint32_t dst, bool positive, uint32_t queue_family_index, Modifier mod) { auto monitor = context_->layer_test->Monitor(); - monitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT, img_err); - monitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT, buf_err); + if (img_err.length()) monitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT, img_err); + if (buf_err.length()) monitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT, buf_err); image_barrier_.srcQueueFamilyIndex = src; image_barrier_.dstQueueFamilyIndex = dst; |