Fix some validation issues with tests

This commit is contained in:
baldurk
2019-05-24 18:47:29 +01:00
parent bdf7213613
commit 42f074187c
5 changed files with 95 additions and 26 deletions
@@ -576,6 +576,8 @@ void main()
Present();
}
vkDeviceWaitIdle(device);
vkDestroyDescriptorPool(device, descpool, NULL);
vkDestroySampler(device, sampler, NULL);
+3 -3
View File
@@ -100,7 +100,7 @@ void main()
AllocatedImage msaaimg(
allocator,
vkh::ImageCreateInfo(scissor.extent.width, scissor.extent.height, 0, swapFormat,
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
VK_IMAGE_USAGE_SAMPLED_BIT,
1, 1, VK_SAMPLE_COUNT_4_BIT),
VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_GPU_ONLY}));
@@ -112,7 +112,7 @@ void main()
vkh::RenderPassCreator renderPassCreateInfo;
renderPassCreateInfo.attachments.push_back(vkh::AttachmentDescription(
swapFormat, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
swapFormat, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE, VK_SAMPLE_COUNT_4_BIT));
renderPassCreateInfo.attachments.push_back(
vkh::AttachmentDescription(swapFormat, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL));
@@ -196,7 +196,7 @@ void main()
vkh::ImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT,
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, msaaimg.image),
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, msaaimg.image),
});
VkRect2D region = scissor;
+1 -1
View File
@@ -112,7 +112,7 @@ void VulkanGraphicsTest::Prepare(int argc, char **argv)
{
if(!strcmp(layer.layerName, "VK_LAYER_LUNARG_standard_validation"))
{
enabledLayers.push_back(layer.layerName);
enabledLayers.push_back("VK_LAYER_LUNARG_standard_validation");
break;
}
}
+2
View File
@@ -982,6 +982,8 @@ void main()
Present();
}
vkDeviceWaitIdle(device);
for(size_t i = 0; i < ARRAY_COUNT(ycbcr); i++)
{
vkDestroySampler(device, ycbcr[i].sampler, NULL);
+87 -22
View File
@@ -33,6 +33,8 @@ TEST(VK_VS_Max_Desc_Set, VulkanGraphicsTest)
#version 430 core
#extension GL_EXT_samplerless_texture_functions : require
struct v2f
{
vec4 pos;
@@ -54,7 +56,7 @@ void main()
{
vertOut.pos = vec4(Position.xyz*vec3(1,-1,1), 1);
gl_Position = vertOut.pos;
vertOut.col = get_cbuffer_color();
vertOut.col = get_color();
vertOut.uv = vec4(UV.xy, 0, 1);
}
@@ -82,11 +84,21 @@ void main()
VkPhysicalDeviceProperties props = vkh::getPhysicalDeviceProperties(phys);
VkPhysicalDeviceLimits &limits = props.limits;
VkDescriptorSetLayout setlayout = createDescriptorSetLayout(vkh::DescriptorSetLayoutCreateInfo({
{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT},
}));
// we use sampled images up to the last set, since some drivers support fewer UBOs per stage
// than descriptor sets
VkDescriptorSetLayout imgsetlayout =
createDescriptorSetLayout(vkh::DescriptorSetLayoutCreateInfo({
{0, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_VERTEX_BIT},
}));
std::vector<VkDescriptorSetLayout> maxSetLayouts(limits.maxBoundDescriptorSets, setlayout);
VkDescriptorSetLayout ubosetlayout =
createDescriptorSetLayout(vkh::DescriptorSetLayoutCreateInfo({
{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT},
}));
std::vector<VkDescriptorSetLayout> maxSetLayouts(limits.maxBoundDescriptorSets, imgsetlayout);
maxSetLayouts.back() = ubosetlayout;
VkPipelineLayout layout = createPipelineLayout(vkh::PipelineLayoutCreateInfo(maxSetLayouts));
@@ -104,14 +116,27 @@ void main()
std::string dynamic_decl, dynamic_func;
dynamic_decl = "\n";
dynamic_func = "vec4 get_cbuffer_color() { return vec4(0)";
dynamic_func = "vec4 get_color() { return vec4(0)";
uint32_t numimgs = limits.maxBoundDescriptorSets - 1;
for(uint32_t i = 0; i < limits.maxBoundDescriptorSets; i++)
{
std::string istr = std::to_string(i);
dynamic_decl += "layout(set = " + istr + ", binding = 0, std140) uniform constsbuf" + istr +
" { vec4 col" + istr + "; };\n";
dynamic_func += " + col" + istr;
if(i < numimgs)
{
dynamic_decl +=
"layout(set = " + istr + ", binding = 0) uniform texture2D tex" + istr + ";\n";
dynamic_func +=
" + texelFetch(tex" + istr + ", ivec2(0), 0) / vec4(" + std::to_string(numimgs) + ")";
}
else
{
dynamic_decl +=
"layout(set = " + istr + ", binding = 0, std140) uniform constsbuf { vec4 col; };\n";
dynamic_func += " + col";
}
}
dynamic_decl += "\n";
@@ -133,27 +158,66 @@ void main()
vb.upload(DefaultTri);
Vec4f cbufferdata[512];
float divisor = 1.0f / float(limits.maxBoundDescriptorSets);
for(uint32_t i = 0; i < limits.maxBoundDescriptorSets; i++)
cbufferdata[i] = Vec4f(1.0f * divisor, 0.2f * divisor, 0.75f * divisor, 0.8f * divisor);
Vec4f cbufferdata = Vec4f(0.0f, 0.2f, 0.75f, 0.8f);
AllocatedBuffer cb(
allocator, vkh::BufferCreateInfo(sizeof(cbufferdata), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT |
VK_BUFFER_USAGE_TRANSFER_DST_BIT),
VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_CPU_TO_GPU}));
cb.upload(cbufferdata);
cb.upload(&cbufferdata, sizeof(cbufferdata));
VkDescriptorSet descset = allocateDescriptorSet(setlayout);
AllocatedImage img(allocator, vkh::ImageCreateInfo(
4, 4, 0, VK_FORMAT_R32G32B32A32_SFLOAT,
VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT),
VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_GPU_ONLY}));
VkImageView imgview = createImageView(
vkh::ImageViewCreateInfo(img.image, VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R32G32B32A32_SFLOAT));
{
VkCommandBuffer cmd = GetCommandBuffer();
vkBeginCommandBuffer(cmd, vkh::CommandBufferBeginInfo());
vkh::cmdPipelineBarrier(
cmd, {
vkh::ImageMemoryBarrier(0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, img.image),
});
vkCmdClearColorImage(cmd, img.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
vkh::ClearColorValue(1.0f, 0.0f, 0.0f, 0.0f), 1,
vkh::ImageSubresourceRange());
vkh::cmdPipelineBarrier(
cmd, {
vkh::ImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, img.image),
});
vkEndCommandBuffer(cmd);
Submit(99, 99, {cmd});
vkDeviceWaitIdle(device);
}
VkDescriptorSet imgdescset = allocateDescriptorSet(imgsetlayout);
VkDescriptorSet ubodescset = allocateDescriptorSet(ubosetlayout);
vkh::updateDescriptorSets(
device, {
vkh::WriteDescriptorSet(descset, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
{vkh::DescriptorBufferInfo(cb.buffer)}),
});
device,
{
vkh::WriteDescriptorSet(
imgdescset, 0, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
{
vkh::DescriptorImageInfo(imgview, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL),
}),
vkh::WriteDescriptorSet(ubodescset, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
{vkh::DescriptorBufferInfo(cb.buffer)}),
});
while(Running())
{
@@ -173,7 +237,8 @@ void main()
{vkh::ClearValue(0.0f, 0.0f, 0.0f, 1.0f)}),
VK_SUBPASS_CONTENTS_INLINE);
std::vector<VkDescriptorSet> descsets(limits.maxBoundDescriptorSets, descset);
std::vector<VkDescriptorSet> descsets(limits.maxBoundDescriptorSets, imgdescset);
descsets.back() = ubodescset;
vkh::cmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descsets, {});
vkCmdSetViewport(cmd, 0, 1, &viewport);
vkCmdSetScissor(cmd, 0, 1, &scissor);