From: Jussi Venho Date: Thu, 9 Jan 2020 11:02:38 +0000 (+0200) Subject: Add tests for scissor constraint X-Git-Tag: upstream/1.3.5~1495 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1e533f62a51374652227037d3bd0da1fdabe26ad;p=platform%2Fupstream%2FVK-GL-CTS.git Add tests for scissor constraint Test that scissor is correctly clamped to the framebuffer size. New tests: dEQP-VK.draw.scissor.static_scissor_framebuffer_border_in dEQP-VK.draw.scissor.dynamic_scissor_framebuffer_border_in dEQP-VK.draw.scissor.static_scissor_framebuffer_border_out dEQP-VK.draw.scissor.dynamic_scissor_framebuffer_border_out dEQP-VK.draw.scissor.static_scissor_oversized dEQP-VK.draw.scissor.dynamic_scissor_oversized Components: Vulkan VK-GL-CTS issue: 2095 Change-Id: I7e15e4db12380c84cd7d7297de62bca0a7551f2e --- diff --git a/android/cts/master/vk-master-2020-03-01.txt b/android/cts/master/vk-master-2020-03-01.txt index 013474f..102edc3 100644 --- a/android/cts/master/vk-master-2020-03-01.txt +++ b/android/cts/master/vk-master-2020-03-01.txt @@ -109151,6 +109151,12 @@ dEQP-VK.draw.scissor.dynamic_scissor_max_int32 dEQP-VK.draw.scissor.16_dynamic_scissors dEQP-VK.draw.scissor.dynamic_scissor_two_clears dEQP-VK.draw.scissor.dynamic_scissor_mix +dEQP-VK.draw.scissor.static_scissor_framebuffer_border_in +dEQP-VK.draw.scissor.dynamic_scissor_framebuffer_border_in +dEQP-VK.draw.scissor.static_scissor_framebuffer_border_out +dEQP-VK.draw.scissor.dynamic_scissor_framebuffer_border_out +dEQP-VK.draw.scissor.static_scissor_oversized +dEQP-VK.draw.scissor.dynamic_scissor_oversized dEQP-VK.draw.multiple_interpolation.separate.1_sample dEQP-VK.draw.multiple_interpolation.separate.2_samples dEQP-VK.draw.multiple_interpolation.separate.4_samples diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt index 10bce2c..f99ec43 100644 --- a/android/cts/master/vk-master.txt +++ b/android/cts/master/vk-master.txt @@ -412126,6 +412126,12 @@ dEQP-VK.draw.scissor.dynamic_scissor_max_int32 dEQP-VK.draw.scissor.16_dynamic_scissors dEQP-VK.draw.scissor.dynamic_scissor_two_clears dEQP-VK.draw.scissor.dynamic_scissor_mix +dEQP-VK.draw.scissor.static_scissor_framebuffer_border_in +dEQP-VK.draw.scissor.dynamic_scissor_framebuffer_border_in +dEQP-VK.draw.scissor.static_scissor_framebuffer_border_out +dEQP-VK.draw.scissor.dynamic_scissor_framebuffer_border_out +dEQP-VK.draw.scissor.static_scissor_oversized +dEQP-VK.draw.scissor.dynamic_scissor_oversized dEQP-VK.draw.multiple_interpolation.separate.1_sample dEQP-VK.draw.multiple_interpolation.separate.2_samples dEQP-VK.draw.multiple_interpolation.separate.4_samples diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawScissorTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawScissorTests.cpp index 05ecb6a..6318160 100644 --- a/external/vulkancts/modules/vulkan/draw/vktDrawScissorTests.cpp +++ b/external/vulkancts/modules/vulkan/draw/vktDrawScissorTests.cpp @@ -66,7 +66,7 @@ struct ColorQuad Vec4 m_color; }; -ColorQuad scissorQuad (ColorQuad quad, VkRect2D scissor) +ColorQuad scissorQuad (ColorQuad quad, VkRect2D scissor, VkExtent2D framebufferSize) { int left = quad.m_x; int right = quad.m_x + quad.m_width; @@ -76,11 +76,11 @@ ColorQuad scissorQuad (ColorQuad quad, VkRect2D scissor) left = de::max(left, scissor.offset.x); left = de::max(left, 0); right = de::min(right, scissor.offset.x + (int)scissor.extent.width); - right = de::min(right, (int)WIDTH); + right = de::min(right, (int)framebufferSize.width); top = de::max(top, scissor.offset.y); top = de::max(top, 0); bottom = de::min(bottom, scissor.offset.y + (int)scissor.extent.height); - bottom = de::min(bottom, (int)HEIGHT); + bottom = de::min(bottom, (int)framebufferSize.height); return ColorQuad(left, top, de::max(right - left, 0), de::max(bottom - top, 0), quad.m_color); } @@ -227,10 +227,13 @@ vector DynamicScissorTestCommand::updateScissors (vector sci struct TestParams { + TestParams() : framebufferSize({WIDTH,HEIGHT}) {}; + bool dynamicScissor; vector staticScissors; vector commands; bool usesMultipleScissors; + VkExtent2D framebufferSize; }; deUint32 countScissors (TestParams params) @@ -377,6 +380,7 @@ TestStatus ScissorTestInstance::iterate (void) Move framebuffer; Move pipeline; TextureLevel refImage; + VkExtent2D framebufferSize = m_params.framebufferSize; if (m_params.usesMultipleScissors) gs = createShaderModule(vk, device, m_context.getBinaryCollection().get("geom"), 0); @@ -385,8 +389,7 @@ TestStatus ScissorTestInstance::iterate (void) { const VkExtent3D targetImageExtent = { WIDTH, HEIGHT, 1 }; const ImageCreateInfo targetImageCreateInfo (VK_IMAGE_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM, targetImageExtent, 1, 1, VK_SAMPLE_COUNT_1_BIT, - VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT); - + VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT); colorTargetImage = Image::createAndAlloc(vk, device, targetImageCreateInfo, m_context.getDefaultAllocator(), m_context.getUniversalQueueFamilyIndex()); } @@ -402,7 +405,7 @@ TestStatus ScissorTestInstance::iterate (void) VK_ATTACHMENT_STORE_OP_STORE, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE, - VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)); const VkAttachmentReference colorAttachmentRef = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL }; @@ -412,7 +415,7 @@ TestStatus ScissorTestInstance::iterate (void) renderPass = createRenderPass(vk, device, &renderPassCreateInfo); - const FramebufferCreateInfo framebufferCreateInfo (*renderPass, colorAttachment, WIDTH, HEIGHT, 1); + const FramebufferCreateInfo framebufferCreateInfo(*renderPass, colorAttachment, framebufferSize.width, framebufferSize.height, 1); framebuffer = createFramebuffer(vk, device, &framebufferCreateInfo); } @@ -490,11 +493,16 @@ TestStatus ScissorTestInstance::iterate (void) // Queue commands and read results. { const ImageSubresourceRange subresourceRange (VK_IMAGE_ASPECT_COLOR_BIT); - const VkRect2D renderArea = makeRect2D(WIDTH, HEIGHT); + const VkRect2D renderArea = makeRect2D(framebufferSize); const VkDeviceSize vertexBufferOffset = 0; const VkOffset3D zeroOffset = { 0, 0, 0 }; const Vec4 clearColor (0.0f, 0.0f, 0.0f, 1.0f); + clearColorImage(vk, device, m_context.getUniversalQueue(), m_context.getUniversalQueueFamilyIndex(), colorTargetImage->object(), clearColor, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + beginCommandBuffer(vk, *cmdBuffer, 0u); beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, renderArea, clearColor); if (vertexBufferSize > 0) @@ -537,7 +545,7 @@ TestStatus ScissorTestInstance::iterate (void) for (size_t scissorIdx = 0; scissorIdx < scissors.size(); scissorIdx++) { - ColorQuad scissoredQuad = m_params.commands[commandIdx]->isScissored() ? scissorQuad(quad[0], scissors[scissorIdx]) : quad[0]; + ColorQuad scissoredQuad = m_params.commands[commandIdx]->isScissored() ? scissorQuad(quad[0], scissors[scissorIdx], framebufferSize) : quad[0]; if (scissoredQuad.m_width == 0 || scissoredQuad.m_height == 0) continue; @@ -828,6 +836,125 @@ void createTests (TestCaseGroup* testGroup) testGroup->addChild(new ScissorTestCase(testCtx, "dynamic_scissor_mix", "", params)); } + + // Static scissor off by one, inside frame buffer border + { + VkExtent2D size = + { + WIDTH / 2 - 1, + HEIGHT / 2 - 1 + }; + + TestParams params; + + params.framebufferSize = size; + params.dynamicScissor = false; + params.staticScissors.push_back(makeRect2D(1, 1, size.width - 2, size.height - 2)); + params.commands.push_back(TestCommandSp(new QuadDrawTestCommand(0, 0, WIDTH * 4, HEIGHT * 4, red))); + + testGroup->addChild(new ScissorTestCase(testCtx, "static_scissor_framebuffer_border_in", "", params)); + } + + // Dynamic scissor off by one, inside frame buffer border + { + VkExtent2D size = + { + WIDTH / 2 - 1, + HEIGHT / 2 - 1 + }; + + TestParams params; + vector scissors; + + params.framebufferSize = size; + params.dynamicScissor = true; + + scissors.push_back(makeRect2D(1, 1, size.width - 2, size.height - 2)); + params.commands.push_back(TestCommandSp(new DynamicScissorTestCommand(0, scissors))); + params.commands.push_back(TestCommandSp(new QuadDrawTestCommand(0, 0, WIDTH * 4, HEIGHT * 4, red))); + + testGroup->addChild(new ScissorTestCase(testCtx, "dynamic_scissor_framebuffer_border_in", "", params)); + } + + // Static scissor off by one, outside frame buffer border + { + VkExtent2D size = + { + WIDTH / 2 - 1, + HEIGHT / 2 - 1 + }; + + TestParams params; + + params.framebufferSize = size; + params.dynamicScissor = false; + + params.staticScissors.push_back(makeRect2D(0, 0, size.width + 1, size.height + 1)); + params.commands.push_back(TestCommandSp(new QuadDrawTestCommand(0, 0, WIDTH * 4, HEIGHT * 4, red))); + + testGroup->addChild(new ScissorTestCase(testCtx, "static_scissor_framebuffer_border_out", "", params)); + } + + // Dynamic scissor off by one, outside frame buffer border + { + VkExtent2D size = + { + WIDTH / 2 - 1, + HEIGHT / 2 - 1 + }; + + TestParams params; + vector scissors; + + params.framebufferSize = size; + params.dynamicScissor = true; + + scissors.push_back(makeRect2D(0, 0, size.width + 1, size.height + 1)); + params.commands.push_back(TestCommandSp(new DynamicScissorTestCommand(0, scissors))); + params.commands.push_back(TestCommandSp(new QuadDrawTestCommand(0, 0, WIDTH * 4, HEIGHT * 4, red))); + + testGroup->addChild(new ScissorTestCase(testCtx, "dynamic_scissor_framebuffer_border_out", "", params)); + } + + // Static oversized scissor, exceeds frame buffer and image attachment sizes + { + VkExtent2D size = + { + WIDTH / 2 - 1, + HEIGHT / 2 - 1 + }; + + TestParams params; + + params.framebufferSize = size; + params.dynamicScissor = false; + + params.staticScissors.push_back(makeRect2D(0, 0, WIDTH * 2, HEIGHT * 2)); + params.commands.push_back(TestCommandSp(new QuadDrawTestCommand(0, 0, WIDTH * 4, HEIGHT * 4, red))); + + testGroup->addChild(new ScissorTestCase(testCtx, "static_scissor_oversized", "", params)); + } + + // Dynamic oversized scissor, exceeds frame buffer and image attachment sizes + { + VkExtent2D size = + { + WIDTH / 2 - 1, + HEIGHT / 2 - 1 + }; + + TestParams params; + vector scissors; + + params.framebufferSize = size; + params.dynamicScissor = true; + + scissors.push_back(makeRect2D(0, 0, WIDTH * 2, HEIGHT * 2)); + params.commands.push_back(TestCommandSp(new DynamicScissorTestCommand(0, scissors))); + params.commands.push_back(TestCommandSp(new QuadDrawTestCommand(0, 0, WIDTH * 4, HEIGHT * 4, red))); + + testGroup->addChild(new ScissorTestCase(testCtx, "dynamic_scissor_oversized", "", params)); + } } } // anonymous diff --git a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt index 592c679..56fda34 100644 --- a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt +++ b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt @@ -412039,6 +412039,12 @@ dEQP-VK.draw.scissor.dynamic_scissor_max_int32 dEQP-VK.draw.scissor.16_dynamic_scissors dEQP-VK.draw.scissor.dynamic_scissor_two_clears dEQP-VK.draw.scissor.dynamic_scissor_mix +dEQP-VK.draw.scissor.static_scissor_framebuffer_border_in +dEQP-VK.draw.scissor.dynamic_scissor_framebuffer_border_in +dEQP-VK.draw.scissor.static_scissor_framebuffer_border_out +dEQP-VK.draw.scissor.dynamic_scissor_framebuffer_border_out +dEQP-VK.draw.scissor.static_scissor_oversized +dEQP-VK.draw.scissor.dynamic_scissor_oversized dEQP-VK.draw.multiple_interpolation.separate.1_sample dEQP-VK.draw.multiple_interpolation.separate.2_samples dEQP-VK.draw.multiple_interpolation.separate.4_samples diff --git a/external/vulkancts/mustpass/master/vk-default.txt b/external/vulkancts/mustpass/master/vk-default.txt index ddcecc4..2a05773 100644 --- a/external/vulkancts/mustpass/master/vk-default.txt +++ b/external/vulkancts/mustpass/master/vk-default.txt @@ -412000,6 +412000,12 @@ dEQP-VK.draw.scissor.dynamic_scissor_max_int32 dEQP-VK.draw.scissor.16_dynamic_scissors dEQP-VK.draw.scissor.dynamic_scissor_two_clears dEQP-VK.draw.scissor.dynamic_scissor_mix +dEQP-VK.draw.scissor.static_scissor_framebuffer_border_in +dEQP-VK.draw.scissor.dynamic_scissor_framebuffer_border_in +dEQP-VK.draw.scissor.static_scissor_framebuffer_border_out +dEQP-VK.draw.scissor.dynamic_scissor_framebuffer_border_out +dEQP-VK.draw.scissor.static_scissor_oversized +dEQP-VK.draw.scissor.dynamic_scissor_oversized dEQP-VK.draw.multiple_interpolation.separate.1_sample dEQP-VK.draw.multiple_interpolation.separate.2_samples dEQP-VK.draw.multiple_interpolation.separate.4_samples