1 /*------------------------------------------------------------------------ 2 * Vulkan Conformance Tests 3 * ------------------------ 4 * 5 * Copyright (c) 2017 The Khronos Group Inc. 6 * Copyright (c) 2017 Samsung Electronics Co., Ltd. 7 * 8 * Licensed under the Apache License, Version 2.0 (the "License"); 9 * you may not use this file except in compliance with the License. 10 * You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, software 15 * distributed under the License is distributed on an "AS IS" BASIS, 16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 * See the License for the specific language governing permissions and 18 * limitations under the License. 19 * 20 *//*! 21 * \file 22 * \brief Protected memory blit image tests 23 *//*--------------------------------------------------------------------*/ 24 25 #include "vktProtectedMemBlitImageTests.hpp" 26 27 #include "deRandom.hpp" 28 #include "tcuTestLog.hpp" 29 #include "tcuVector.hpp" 30 31 #include "vkPrograms.hpp" 32 #include "vktTestCase.hpp" 33 #include "vktTestGroupUtil.hpp" 34 #include "vkTypeUtil.hpp" 35 #include "vkBuilderUtil.hpp" 36 37 #include "vktProtectedMemContext.hpp" 38 #include "vktProtectedMemUtils.hpp" 39 #include "vktProtectedMemImageValidator.hpp" 40 41 namespace vkt 42 { 43 namespace ProtectedMem 44 { 45 46 namespace 47 { 48 49 enum { 50 RENDER_WIDTH = 128, 51 RENDER_HEIGHT = 128, 52 }; 53 54 class BlitImageTestInstance : public ProtectedTestInstance 55 { 56 public: 57 BlitImageTestInstance (Context& ctx, 58 const vk::VkClearColorValue& clearColorValue, 59 const ValidationData& refData, 60 const ImageValidator& validator, 61 const CmdBufferType cmdBufferType); 62 virtual tcu::TestStatus iterate (void); 63 64 private: 65 const vk::VkFormat m_imageFormat; 66 const vk::VkClearColorValue& m_clearColorValue; 67 const ValidationData& m_refData; 68 const ImageValidator& m_validator; 69 const CmdBufferType m_cmdBufferType; 70 }; 71 72 class BlitImageTestCase : public TestCase 73 { 74 public: 75 BlitImageTestCase (tcu::TestContext& testCtx, 76 const std::string& name, 77 vk::VkClearColorValue clearColorValue, 78 ValidationData data, 79 CmdBufferType cmdBufferType) 80 : TestCase (testCtx, name, "Clear and blit image.") 81 , m_clearColorValue (clearColorValue) 82 , m_refData (data) 83 , m_cmdBufferType (cmdBufferType) 84 { 85 } 86 87 virtual ~BlitImageTestCase (void) {} 88 virtual TestInstance* createInstance (Context& ctx) const 89 { 90 return new BlitImageTestInstance(ctx, m_clearColorValue, m_refData, m_validator, m_cmdBufferType); 91 } 92 virtual void initPrograms (vk::SourceCollections& programCollection) const 93 { 94 m_validator.initPrograms(programCollection); 95 } 96 private: 97 vk::VkClearColorValue m_clearColorValue; 98 ValidationData m_refData; 99 ImageValidator m_validator; 100 CmdBufferType m_cmdBufferType; 101 }; 102 103 BlitImageTestInstance::BlitImageTestInstance (Context& ctx, 104 const vk::VkClearColorValue& clearColorValue, 105 const ValidationData& refData, 106 const ImageValidator& validator, 107 const CmdBufferType cmdBufferType) 108 : ProtectedTestInstance (ctx) 109 , m_imageFormat (vk::VK_FORMAT_R8G8B8A8_UNORM) 110 , m_clearColorValue (clearColorValue) 111 , m_refData (refData) 112 , m_validator (validator) 113 , m_cmdBufferType (cmdBufferType) 114 { 115 } 116 117 tcu::TestStatus BlitImageTestInstance::iterate() 118 { 119 ProtectedContext& ctx (m_protectedContext); 120 const vk::DeviceInterface& vk = ctx.getDeviceInterface(); 121 const vk::VkDevice device = ctx.getDevice(); 122 const vk::VkQueue queue = ctx.getQueue(); 123 const deUint32 queueFamilyIndex = ctx.getQueueFamilyIndex(); 124 125 // Create images 126 de::MovePtr<vk::ImageWithMemory> colorImage = createImage2D(ctx, PROTECTION_ENABLED, queueFamilyIndex, 127 RENDER_WIDTH, RENDER_HEIGHT, 128 m_imageFormat, 129 vk::VK_IMAGE_USAGE_SAMPLED_BIT 130 | vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT); 131 de::MovePtr<vk::ImageWithMemory> colorImageSrc = createImage2D(ctx, PROTECTION_ENABLED, queueFamilyIndex, 132 RENDER_WIDTH, RENDER_HEIGHT, 133 m_imageFormat, 134 vk::VK_IMAGE_USAGE_SAMPLED_BIT 135 | vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT 136 | vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT); 137 138 vk::Unique<vk::VkPipelineLayout> pipelineLayout (createPipelineLayout(ctx, 0u, DE_NULL)); 139 140 vk::Unique<vk::VkCommandPool> cmdPool (makeCommandPool(vk, device, PROTECTION_ENABLED, queueFamilyIndex)); 141 vk::Unique<vk::VkCommandBuffer> cmdBuffer (vk::allocateCommandBuffer(vk, device, *cmdPool, vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY)); 142 vk::Unique<vk::VkCommandBuffer> secondaryCmdBuffer (vk::allocateCommandBuffer(vk, device, *cmdPool, vk::VK_COMMAND_BUFFER_LEVEL_SECONDARY)); 143 vk::VkCommandBuffer targetCmdBuffer = (m_cmdBufferType == CMD_BUFFER_SECONDARY) ? *secondaryCmdBuffer : *cmdBuffer; 144 145 // Begin cmd buffer 146 beginCommandBuffer(vk, *cmdBuffer); 147 148 if (m_cmdBufferType == CMD_BUFFER_SECONDARY) 149 { 150 // Begin secondary command buffer 151 const vk::VkCommandBufferInheritanceInfo secCmdBufInheritInfo = 152 { 153 vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 154 DE_NULL, 155 (vk::VkRenderPass)0u, // renderPass 156 0u, // subpass 157 (vk::VkFramebuffer)0u, // framebuffer 158 VK_FALSE, // occlusionQueryEnable 159 (vk::VkQueryControlFlags)0u, // queryFlags 160 (vk::VkQueryPipelineStatisticFlags)0u, // pipelineStatistics 161 }; 162 beginSecondaryCommandBuffer(vk, *secondaryCmdBuffer, secCmdBufInheritInfo); 163 } 164 165 // Start image barrier for source image. 166 { 167 const vk::VkImageMemoryBarrier startImgBarrier = 168 { 169 vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType 170 DE_NULL, // pNext 171 0, // srcAccessMask 172 vk::VK_ACCESS_TRANSFER_WRITE_BIT, // dstAccessMask 173 vk::VK_IMAGE_LAYOUT_UNDEFINED, // oldLayout 174 vk::VK_IMAGE_LAYOUT_GENERAL, // newLayout 175 queueFamilyIndex, // srcQueueFamilyIndex 176 queueFamilyIndex, // dstQueueFamilyIndex 177 **colorImageSrc, // image 178 { 179 vk::VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask 180 0u, // baseMipLevel 181 1u, // mipLevels 182 0u, // baseArraySlice 183 1u, // subresourceRange 184 } 185 }; 186 187 vk.cmdPipelineBarrier(targetCmdBuffer, 188 vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 189 vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, 190 (vk::VkDependencyFlags)0, 191 0, (const vk::VkMemoryBarrier*)DE_NULL, 192 0, (const vk::VkBufferMemoryBarrier*)DE_NULL, 193 1, &startImgBarrier); 194 } 195 196 // Image clear 197 const vk::VkImageSubresourceRange subresourceRange = 198 { 199 vk::VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask 200 0u, // uint32_t baseMipLevel 201 1u, // uint32_t levelCount 202 0u, // uint32_t baseArrayLayer 203 1u, // uint32_t layerCount 204 }; 205 vk.cmdClearColorImage(targetCmdBuffer, **colorImageSrc, vk::VK_IMAGE_LAYOUT_GENERAL, &m_clearColorValue, 1, &subresourceRange); 206 207 // Image barrier to change accessMask to transfer read bit for source image. 208 { 209 const vk::VkImageMemoryBarrier initializeBarrier = 210 { 211 vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType 212 DE_NULL, // pNext 213 vk::VK_ACCESS_TRANSFER_WRITE_BIT, // srcAccessMask 214 vk::VK_ACCESS_TRANSFER_READ_BIT, // dstAccessMask 215 vk::VK_IMAGE_LAYOUT_GENERAL, // oldLayout 216 vk::VK_IMAGE_LAYOUT_GENERAL, // newLayout 217 queueFamilyIndex, // srcQueueFamilyIndex 218 queueFamilyIndex, // dstQueueFamilyIndex 219 **colorImageSrc, // image 220 { 221 vk::VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask 222 0u, // baseMipLevel 223 1u, // mipLevels 224 0u, // baseArraySlice 225 1u, // subresourceRange 226 } 227 }; 228 229 vk.cmdPipelineBarrier(targetCmdBuffer, 230 vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 231 vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, 232 (vk::VkDependencyFlags)0, 233 0, (const vk::VkMemoryBarrier*)DE_NULL, 234 0, (const vk::VkBufferMemoryBarrier*)DE_NULL, 235 1, &initializeBarrier); 236 } 237 238 // Image barrier for destination image. 239 { 240 const vk::VkImageMemoryBarrier initializeBarrier = 241 { 242 vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType 243 DE_NULL, // pNext 244 0, // srcAccessMask 245 vk::VK_ACCESS_TRANSFER_WRITE_BIT, // dstAccessMask 246 vk::VK_IMAGE_LAYOUT_UNDEFINED, // oldLayout 247 vk::VK_IMAGE_LAYOUT_GENERAL, // newLayout 248 queueFamilyIndex, // srcQueueFamilyIndex 249 queueFamilyIndex, // dstQueueFamilyIndex 250 **colorImage, // image 251 { 252 vk::VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask 253 0u, // baseMipLevel 254 1u, // mipLevels 255 0u, // baseArraySlice 256 1u, // subresourceRange 257 } 258 }; 259 260 vk.cmdPipelineBarrier(targetCmdBuffer, 261 vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 262 vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, 263 (vk::VkDependencyFlags)0, 264 0, (const vk::VkMemoryBarrier*)DE_NULL, 265 0, (const vk::VkBufferMemoryBarrier*)DE_NULL, 266 1, &initializeBarrier); 267 } 268 269 // Blit image 270 const vk::VkImageSubresourceLayers imgSubResCopy = 271 { 272 vk::VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; 273 0u, // deUint32 mipLevel; 274 0u, // deUint32 baseArrayLayer; 275 1u, // deUint32 layerCount; 276 }; 277 const vk::VkOffset3D nullOffset = {0u, 0u, 0u}; 278 const vk::VkOffset3D imageOffset = {RENDER_WIDTH, RENDER_HEIGHT, 1}; 279 const vk::VkImageBlit imageBlit = 280 { 281 imgSubResCopy, // VkImageSubresourceLayers srcSubresource; 282 { 283 nullOffset, 284 imageOffset, 285 }, // VkOffset3D srcOffsets[2]; 286 imgSubResCopy, // VkImageSubresourceLayers dstSubresource; 287 { 288 nullOffset, 289 imageOffset, 290 }, // VkOffset3D dstOffsets[2]; 291 }; 292 vk.cmdBlitImage(targetCmdBuffer, **colorImageSrc, vk::VK_IMAGE_LAYOUT_GENERAL, 293 **colorImage, vk::VK_IMAGE_LAYOUT_GENERAL, 1u, &imageBlit, vk::VK_FILTER_NEAREST); 294 295 { 296 const vk::VkImageMemoryBarrier endImgBarrier = 297 { 298 vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType 299 DE_NULL, // pNext 300 vk::VK_ACCESS_TRANSFER_WRITE_BIT, // srcAccessMask 301 vk::VK_ACCESS_SHADER_READ_BIT, // dstAccessMask 302 vk::VK_IMAGE_LAYOUT_GENERAL, // oldLayout 303 vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // newLayout 304 queueFamilyIndex, // srcQueueFamilyIndex 305 queueFamilyIndex, // dstQueueFamilyIndex 306 **colorImage, // image 307 { 308 vk::VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask 309 0u, // baseMipLevel 310 1u, // mipLevels 311 0u, // baseArraySlice 312 1u, // subresourceRange 313 } 314 }; 315 vk.cmdPipelineBarrier(targetCmdBuffer, 316 vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 317 vk::VK_PIPELINE_STAGE_TRANSFER_BIT, 318 (vk::VkDependencyFlags)0, 319 0, (const vk::VkMemoryBarrier*)DE_NULL, 320 0, (const vk::VkBufferMemoryBarrier*)DE_NULL, 321 1, &endImgBarrier); 322 } 323 324 if (m_cmdBufferType == CMD_BUFFER_SECONDARY) 325 { 326 VK_CHECK(vk.endCommandBuffer(*secondaryCmdBuffer)); 327 vk.cmdExecuteCommands(*cmdBuffer, 1u, &secondaryCmdBuffer.get()); 328 } 329 330 VK_CHECK(vk.endCommandBuffer(*cmdBuffer)); 331 332 // Submit command buffer 333 const vk::Unique<vk::VkFence> fence (vk::createFence(vk, device)); 334 VK_CHECK(queueSubmit(ctx, PROTECTION_ENABLED, queue, *cmdBuffer, *fence, ~0ull)); 335 336 // Log out test data 337 ctx.getTestContext().getLog() 338 << tcu::TestLog::Message << "Color clear value: " << tcu::Vec4(m_clearColorValue.float32) << tcu::TestLog::EndMessage; 339 340 // Validate resulting image 341 if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat)) 342 return tcu::TestStatus::pass("Everything went OK"); 343 else 344 return tcu::TestStatus::fail("Something went really wrong"); 345 } 346 347 tcu::TestCaseGroup* createBlitImageTests (tcu::TestContext& testCtx, CmdBufferType cmdBufferType) 348 { 349 struct { 350 const vk::VkClearColorValue clearColorValue; 351 const ValidationData data; 352 } testData[] = { 353 { { { 1.0f, 0.0f, 0.0f, 1.0f } }, 354 { 355 { tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), tcu::Vec4(1.0f, 1.0f, 0.0f, 0.0f), 356 tcu::Vec4(0.1f, 0.1f, 0.0f, 0.0f), tcu::Vec4(0.5f, 0.5f, 0.0f, 0.0f), }, 357 { tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), 358 tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), } 359 } 360 }, 361 { { { 0.0f, 1.0f, 0.0f, 1.0f } }, 362 { 363 { tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), tcu::Vec4(1.0f, 1.0f, 0.0f, 0.0f), 364 tcu::Vec4(0.1f, 0.1f, 0.0f, 0.0f), tcu::Vec4(0.5f, 0.5f, 0.0f, 0.0f), }, 365 { tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f), tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f), 366 tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f), tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f), } 367 } 368 }, 369 { { { 0.0f, 0.0f, 1.0f, 1.0f } }, 370 { 371 { tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), tcu::Vec4(1.0f, 1.0f, 0.0f, 0.0f), 372 tcu::Vec4(0.1f, 0.1f, 0.0f, 0.0f), tcu::Vec4(0.5f, 0.5f, 0.0f, 0.0f), }, 373 { tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f), tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f), 374 tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f), tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f), } 375 } 376 }, 377 { { { 0.0f, 0.0f, 0.0f, 1.0f } }, 378 { 379 { tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), tcu::Vec4(1.0f, 1.0f, 0.0f, 0.0f), 380 tcu::Vec4(0.1f, 0.1f, 0.0f, 0.0f), tcu::Vec4(0.5f, 0.5f, 0.0f, 0.0f), }, 381 { tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f), tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f), 382 tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f), tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f), } 383 } 384 }, 385 { { { 1.0f, 0.0f, 0.0f, 1.0f } }, 386 { 387 { tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), tcu::Vec4(1.0f, 1.0f, 0.0f, 0.0f), 388 tcu::Vec4(0.1f, 0.1f, 0.0f, 0.0f), tcu::Vec4(0.5f, 0.5f, 0.0f, 0.0f), }, 389 { tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), 390 tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), } 391 } 392 }, 393 { { { 1.0f, 0.0f, 0.0f, 0.0f } }, 394 { 395 { tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), tcu::Vec4(1.0f, 1.0f, 0.0f, 0.0f), 396 tcu::Vec4(0.1f, 0.1f, 0.0f, 0.0f), tcu::Vec4(0.5f, 0.5f, 0.0f, 0.0f), }, 397 { tcu::Vec4(1.0f, 0.0f, 0.0f, 0.0f), tcu::Vec4(1.0f, 0.0f, 0.0f, 0.0f), 398 tcu::Vec4(1.0f, 0.0f, 0.0f, 0.0f), tcu::Vec4(1.0f, 0.0f, 0.0f, 0.0f), } 399 } 400 }, 401 { { { 0.1f, 0.2f, 0.3f, 0.0f } }, 402 { 403 { tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), tcu::Vec4(1.0f, 1.0f, 0.0f, 0.0f), 404 tcu::Vec4(0.1f, 0.1f, 0.0f, 0.0f), tcu::Vec4(0.5f, 0.5f, 0.0f, 0.0f), }, 405 { tcu::Vec4(0.1f, 0.2f, 0.3f, 0.0f), tcu::Vec4(0.1f, 0.2f, 0.3f, 0.0f), 406 tcu::Vec4(0.1f, 0.2f, 0.3f, 0.0f), tcu::Vec4(0.1f, 0.2f, 0.3f, 0.0f), } 407 } 408 }, 409 }; 410 411 de::MovePtr<tcu::TestCaseGroup> blitStaticTests (new tcu::TestCaseGroup(testCtx, "static", "Blit Image Tests with static input")); 412 413 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(testData); ++ndx) 414 { 415 const std::string name = "blit_" + de::toString(ndx + 1); 416 blitStaticTests->addChild(new BlitImageTestCase(testCtx, name.c_str(), testData[ndx].clearColorValue, testData[ndx].data, cmdBufferType)); 417 } 418 419 /* Add a few randomized tests */ 420 de::MovePtr<tcu::TestCaseGroup> blitRandomTests (new tcu::TestCaseGroup(testCtx, "random", "Blit Image Tests with random input")); 421 const int testCount = 10; 422 de::Random rnd (testCtx.getCommandLine().getBaseSeed()); 423 for (int ndx = 0; ndx < testCount; ++ndx) 424 { 425 const std::string name = "blit_" + de::toString(ndx + 1); 426 vk::VkClearValue clearValue = vk::makeClearValueColorF32( 427 rnd.getFloat(0.0, 1.0f), 428 rnd.getFloat(0.0, 1.0f), 429 rnd.getFloat(0.0, 1.0f), 430 rnd.getFloat(0.0, 1.0f)); 431 432 tcu::Vec4 refValue (clearValue.color.float32[0], clearValue.color.float32[1], clearValue.color.float32[2], clearValue.color.float32[3]); 433 ValidationData data = 434 { 435 { tcu::Vec4(rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f)), 436 tcu::Vec4(rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f)), 437 tcu::Vec4(rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f)), 438 tcu::Vec4(rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f)) }, 439 { refValue, refValue, refValue, refValue } 440 }; 441 blitRandomTests->addChild(new BlitImageTestCase(testCtx, name.c_str(), clearValue.color, data, cmdBufferType)); 442 } 443 444 std::string groupName = getCmdBufferTypeStr(cmdBufferType); 445 std::string groupDesc = "Blit Image Tests with " + groupName + " command buffer"; 446 de::MovePtr<tcu::TestCaseGroup> blitTests (new tcu::TestCaseGroup(testCtx, groupName.c_str(), groupDesc.c_str())); 447 blitTests->addChild(blitStaticTests.release()); 448 blitTests->addChild(blitRandomTests.release()); 449 return blitTests.release(); 450 } 451 452 } // anonymous 453 454 tcu::TestCaseGroup* createBlitImageTests (tcu::TestContext& testCtx) 455 { 456 de::MovePtr<tcu::TestCaseGroup> blitTests (new tcu::TestCaseGroup(testCtx, "blit", "Blit Image Tests")); 457 458 blitTests->addChild(createBlitImageTests(testCtx, CMD_BUFFER_PRIMARY)); 459 blitTests->addChild(createBlitImageTests(testCtx, CMD_BUFFER_SECONDARY)); 460 461 return blitTests.release(); 462 } 463 464 } // ProtectedMem 465 } // vkt 466