1 /* 2 * Copyright (c) 2015-2016 The Khronos Group Inc. 3 * Copyright (c) 2015-2016 Valve Corporation 4 * Copyright (c) 2015-2016 LunarG, Inc. 5 * Copyright (c) 2015-2016 Google, Inc. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a copy 8 * of this software and/or associated documentation files (the "Materials"), to 9 * deal in the Materials without restriction, including without limitation the 10 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 11 * sell copies of the Materials, and to permit persons to whom the Materials are 12 * furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice(s) and this permission notice shall be included in 15 * all copies or substantial portions of the Materials. 16 * 17 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20 * 21 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE 24 * USE OR OTHER DEALINGS IN THE MATERIALS. 25 * 26 * Author: Chia-I Wu <olvaffe (at) gmail.com> 27 * Author: Chris Forbes <chrisf (at) ijw.co.nz> 28 * Author: Courtney Goeltzenleuchter <courtney (at) LunarG.com> 29 * Author: Mark Lobodzinski <mark (at) lunarg.com> 30 * Author: Mike Stroyan <mike (at) LunarG.com> 31 * Author: Tobin Ehlis <tobine (at) google.com> 32 * Author: Tony Barbour <tony (at) LunarG.com> 33 */ 34 35 #include <vulkan/vulkan.h> 36 #include "test_common.h" 37 #include "vkrenderframework.h" 38 #include "vk_layer_config.h" 39 #include "icd-spv.h" 40 41 #define GLM_FORCE_RADIANS 42 #include "glm/glm.hpp" 43 #include <glm/gtc/matrix_transform.hpp> 44 45 #define MEM_TRACKER_TESTS 1 46 #define OBJ_TRACKER_TESTS 1 47 #define DRAW_STATE_TESTS 1 48 #define THREADING_TESTS 1 49 #define SHADER_CHECKER_TESTS 1 50 #define DEVICE_LIMITS_TESTS 1 51 #define IMAGE_TESTS 1 52 53 //-------------------------------------------------------------------------------------- 54 // Mesh and VertexFormat Data 55 //-------------------------------------------------------------------------------------- 56 struct Vertex { 57 float posX, posY, posZ, posW; // Position data 58 float r, g, b, a; // Color 59 }; 60 61 #define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f 62 63 typedef enum _BsoFailSelect { 64 BsoFailNone = 0x00000000, 65 BsoFailLineWidth = 0x00000001, 66 BsoFailDepthBias = 0x00000002, 67 BsoFailViewport = 0x00000004, 68 BsoFailScissor = 0x00000008, 69 BsoFailBlend = 0x00000010, 70 BsoFailDepthBounds = 0x00000020, 71 BsoFailStencilReadMask = 0x00000040, 72 BsoFailStencilWriteMask = 0x00000080, 73 BsoFailStencilReference = 0x00000100, 74 } BsoFailSelect; 75 76 struct vktriangle_vs_uniform { 77 // Must start with MVP 78 float mvp[4][4]; 79 float position[3][4]; 80 float color[3][4]; 81 }; 82 83 static const char bindStateVertShaderText[] = 84 "#version 400\n" 85 "#extension GL_ARB_separate_shader_objects : require\n" 86 "#extension GL_ARB_shading_language_420pack : require\n" 87 "vec2 vertices[3];\n" 88 "out gl_PerVertex {\n" 89 " vec4 gl_Position;\n" 90 "};\n" 91 "void main() {\n" 92 " vertices[0] = vec2(-1.0, -1.0);\n" 93 " vertices[1] = vec2( 1.0, -1.0);\n" 94 " vertices[2] = vec2( 0.0, 1.0);\n" 95 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n" 96 "}\n"; 97 98 static const char bindStateFragShaderText[] = 99 "#version 400\n" 100 "#extension GL_ARB_separate_shader_objects: require\n" 101 "#extension GL_ARB_shading_language_420pack: require\n" 102 "\n" 103 "layout(location = 0) out vec4 uFragColor;\n" 104 "void main(){\n" 105 " uFragColor = vec4(0,1,0,1);\n" 106 "}\n"; 107 108 static VKAPI_ATTR VkBool32 VKAPI_CALL 109 myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, 110 uint64_t srcObject, size_t location, int32_t msgCode, 111 const char *pLayerPrefix, const char *pMsg, void *pUserData); 112 113 // ******************************************************** 114 // ErrorMonitor Usage: 115 // 116 // Call SetDesiredFailureMsg with a string to be compared against all 117 // encountered log messages. Passing NULL will match all log messages. 118 // logMsg will return true for skipCall only if msg is matched or NULL. 119 // 120 // Call DesiredMsgFound to determine if the desired failure message 121 // was encountered. 122 123 class ErrorMonitor { 124 public: 125 ErrorMonitor() { 126 test_platform_thread_create_mutex(&m_mutex); 127 test_platform_thread_lock_mutex(&m_mutex); 128 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT; 129 m_bailout = NULL; 130 test_platform_thread_unlock_mutex(&m_mutex); 131 } 132 133 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) { 134 test_platform_thread_lock_mutex(&m_mutex); 135 m_desiredMsg.clear(); 136 m_failureMsg.clear(); 137 m_otherMsgs.clear(); 138 m_desiredMsg = msgString; 139 m_msgFound = VK_FALSE; 140 m_msgFlags = msgFlags; 141 test_platform_thread_unlock_mutex(&m_mutex); 142 } 143 144 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) { 145 VkBool32 result = VK_FALSE; 146 test_platform_thread_lock_mutex(&m_mutex); 147 if (m_bailout != NULL) { 148 *m_bailout = true; 149 } 150 string errorString(msgString); 151 if (msgFlags & m_msgFlags) { 152 if (errorString.find(m_desiredMsg) != string::npos) { 153 m_failureMsg = errorString; 154 m_msgFound = VK_TRUE; 155 result = VK_TRUE; 156 } else { 157 m_otherMsgs.push_back(errorString); 158 } 159 } 160 test_platform_thread_unlock_mutex(&m_mutex); 161 return result; 162 } 163 164 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; } 165 166 string GetFailureMsg(void) { return m_failureMsg; } 167 168 VkBool32 DesiredMsgFound(void) { return m_msgFound; } 169 170 void SetBailout(bool *bailout) { m_bailout = bailout; } 171 172 void DumpFailureMsgs(void) { 173 vector<string> otherMsgs = GetOtherFailureMsgs(); 174 cout << "Other error messages logged for this test were:" << endl; 175 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) { 176 cout << " " << *iter << endl; 177 } 178 } 179 180 private: 181 VkFlags m_msgFlags; 182 string m_desiredMsg; 183 string m_failureMsg; 184 vector<string> m_otherMsgs; 185 test_platform_thread_mutex m_mutex; 186 bool *m_bailout; 187 VkBool32 m_msgFound; 188 }; 189 190 static VKAPI_ATTR VkBool32 VKAPI_CALL 191 myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, 192 uint64_t srcObject, size_t location, int32_t msgCode, 193 const char *pLayerPrefix, const char *pMsg, void *pUserData) { 194 if (msgFlags & 195 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT | 196 VK_DEBUG_REPORT_ERROR_BIT_EXT)) { 197 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData; 198 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg); 199 } 200 return false; 201 } 202 203 class VkLayerTest : public VkRenderFramework { 204 public: 205 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer); 206 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer); 207 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, 208 BsoFailSelect failMask); 209 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, 210 VkPipelineObj &pipelineobj, 211 VkDescriptorSetObj &descriptorSet, 212 BsoFailSelect failMask); 213 void GenericDrawPreparation(VkPipelineObj &pipelineobj, 214 VkDescriptorSetObj &descriptorSet, 215 BsoFailSelect failMask) { 216 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, 217 failMask); 218 } 219 220 /* Convenience functions that use built-in command buffer */ 221 VkResult BeginCommandBuffer() { 222 return BeginCommandBuffer(*m_commandBuffer); 223 } 224 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); } 225 void Draw(uint32_t vertexCount, uint32_t instanceCount, 226 uint32_t firstVertex, uint32_t firstInstance) { 227 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, 228 firstInstance); 229 } 230 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, 231 uint32_t firstIndex, int32_t vertexOffset, 232 uint32_t firstInstance) { 233 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, 234 vertexOffset, firstInstance); 235 } 236 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); } 237 void QueueCommandBuffer(const VkFence &fence) { 238 m_commandBuffer->QueueCommandBuffer(fence); 239 } 240 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, 241 VkDeviceSize offset, uint32_t binding) { 242 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding); 243 } 244 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) { 245 m_commandBuffer->BindIndexBuffer(indexBuffer, offset); 246 } 247 248 protected: 249 ErrorMonitor *m_errorMonitor; 250 251 virtual void SetUp() { 252 std::vector<const char *> instance_layer_names; 253 std::vector<const char *> device_layer_names; 254 std::vector<const char *> instance_extension_names; 255 std::vector<const char *> device_extension_names; 256 257 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); 258 /* 259 * Since CreateDbgMsgCallback is an instance level extension call 260 * any extension / layer that utilizes that feature also needs 261 * to be enabled at create instance time. 262 */ 263 // Use Threading layer first to protect others from 264 // ThreadCommandBufferCollision test 265 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading"); 266 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker"); 267 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation"); 268 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits"); 269 instance_layer_names.push_back("VK_LAYER_LUNARG_image"); 270 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects"); 271 272 device_layer_names.push_back("VK_LAYER_GOOGLE_threading"); 273 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker"); 274 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation"); 275 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits"); 276 device_layer_names.push_back("VK_LAYER_LUNARG_image"); 277 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects"); 278 279 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; 280 this->app_info.pNext = NULL; 281 this->app_info.pApplicationName = "layer_tests"; 282 this->app_info.applicationVersion = 1; 283 this->app_info.pEngineName = "unittest"; 284 this->app_info.engineVersion = 1; 285 this->app_info.apiVersion = VK_API_VERSION_1_0; 286 287 m_errorMonitor = new ErrorMonitor; 288 InitFramework(instance_layer_names, device_layer_names, 289 instance_extension_names, device_extension_names, 290 myDbgFunc, m_errorMonitor); 291 } 292 293 virtual void TearDown() { 294 // Clean up resources before we reset 295 ShutdownFramework(); 296 delete m_errorMonitor; 297 } 298 }; 299 300 VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) { 301 VkResult result; 302 303 result = commandBuffer.BeginCommandBuffer(); 304 305 /* 306 * For render test all drawing happens in a single render pass 307 * on a single command buffer. 308 */ 309 if (VK_SUCCESS == result && renderPass()) { 310 commandBuffer.BeginRenderPass(renderPassBeginInfo()); 311 } 312 313 return result; 314 } 315 316 VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) { 317 VkResult result; 318 319 if (renderPass()) { 320 commandBuffer.EndRenderPass(); 321 } 322 323 result = commandBuffer.EndCommandBuffer(); 324 325 return result; 326 } 327 328 void VkLayerTest::VKTriangleTest(const char *vertShaderText, 329 const char *fragShaderText, 330 BsoFailSelect failMask) { 331 // Create identity matrix 332 int i; 333 struct vktriangle_vs_uniform data; 334 335 glm::mat4 Projection = glm::mat4(1.0f); 336 glm::mat4 View = glm::mat4(1.0f); 337 glm::mat4 Model = glm::mat4(1.0f); 338 glm::mat4 MVP = Projection * View * Model; 339 const int matrixSize = sizeof(MVP); 340 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float); 341 342 memcpy(&data.mvp, &MVP[0][0], matrixSize); 343 344 static const Vertex tri_data[] = { 345 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, 346 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, 347 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)}, 348 }; 349 350 for (i = 0; i < 3; i++) { 351 data.position[i][0] = tri_data[i].posX; 352 data.position[i][1] = tri_data[i].posY; 353 data.position[i][2] = tri_data[i].posZ; 354 data.position[i][3] = tri_data[i].posW; 355 data.color[i][0] = tri_data[i].r; 356 data.color[i][1] = tri_data[i].g; 357 data.color[i][2] = tri_data[i].b; 358 data.color[i][3] = tri_data[i].a; 359 } 360 361 ASSERT_NO_FATAL_FAILURE(InitState()); 362 ASSERT_NO_FATAL_FAILURE(InitViewport()); 363 364 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), 365 (const void *)&data); 366 367 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this); 368 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, 369 this); 370 371 VkPipelineObj pipelineobj(m_device); 372 pipelineobj.AddColorAttachment(); 373 pipelineobj.AddShader(&vs); 374 pipelineobj.AddShader(&ps); 375 if (failMask & BsoFailLineWidth) { 376 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH); 377 } 378 if (failMask & BsoFailDepthBias) { 379 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS); 380 } 381 // Viewport and scissors must stay in synch or other errors will occur than 382 // the ones we want 383 if (failMask & BsoFailViewport) { 384 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT); 385 m_viewports.clear(); 386 m_scissors.clear(); 387 } 388 if (failMask & BsoFailScissor) { 389 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR); 390 m_scissors.clear(); 391 m_viewports.clear(); 392 } 393 if (failMask & BsoFailBlend) { 394 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS); 395 } 396 if (failMask & BsoFailDepthBounds) { 397 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS); 398 } 399 if (failMask & BsoFailStencilReadMask) { 400 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK); 401 } 402 if (failMask & BsoFailStencilWriteMask) { 403 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK); 404 } 405 if (failMask & BsoFailStencilReference) { 406 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE); 407 } 408 409 VkDescriptorSetObj descriptorSet(m_device); 410 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 411 constantBuffer); 412 413 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 414 ASSERT_VK_SUCCESS(BeginCommandBuffer()); 415 416 GenericDrawPreparation(pipelineobj, descriptorSet, failMask); 417 418 // render triangle 419 Draw(3, 1, 0, 0); 420 421 // finalize recording of the command buffer 422 EndCommandBuffer(); 423 424 QueueCommandBuffer(); 425 } 426 427 void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, 428 VkPipelineObj &pipelineobj, 429 VkDescriptorSetObj &descriptorSet, 430 BsoFailSelect failMask) { 431 if (m_depthStencil->Initialized()) { 432 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, 433 m_stencil_clear_color, m_depthStencil); 434 } else { 435 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, 436 m_stencil_clear_color, NULL); 437 } 438 439 commandBuffer->PrepareAttachments(); 440 // Make sure depthWriteEnable is set so that Depth fail test will work 441 // correctly 442 // Make sure stencilTestEnable is set so that Stencil fail test will work 443 // correctly 444 VkStencilOpState stencil = {}; 445 stencil.failOp = VK_STENCIL_OP_KEEP; 446 stencil.passOp = VK_STENCIL_OP_KEEP; 447 stencil.depthFailOp = VK_STENCIL_OP_KEEP; 448 stencil.compareOp = VK_COMPARE_OP_NEVER; 449 450 VkPipelineDepthStencilStateCreateInfo ds_ci = {}; 451 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; 452 ds_ci.pNext = NULL; 453 ds_ci.depthTestEnable = VK_FALSE; 454 ds_ci.depthWriteEnable = VK_TRUE; 455 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER; 456 ds_ci.depthBoundsTestEnable = VK_FALSE; 457 ds_ci.stencilTestEnable = VK_TRUE; 458 ds_ci.front = stencil; 459 ds_ci.back = stencil; 460 461 pipelineobj.SetDepthStencil(&ds_ci); 462 pipelineobj.SetViewport(m_viewports); 463 pipelineobj.SetScissor(m_scissors); 464 descriptorSet.CreateVKDescriptorSet(commandBuffer); 465 VkResult err = pipelineobj.CreateVKPipeline( 466 descriptorSet.GetPipelineLayout(), renderPass()); 467 ASSERT_VK_SUCCESS(err); 468 commandBuffer->BindPipeline(pipelineobj); 469 commandBuffer->BindDescriptorSet(descriptorSet); 470 } 471 472 // ******************************************************************************************************************** 473 // ******************************************************************************************************************** 474 // ******************************************************************************************************************** 475 // ******************************************************************************************************************** 476 #if MEM_TRACKER_TESTS 477 #if 0 478 TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion) 479 { 480 vk_testing::Fence testFence; 481 VkFenceCreateInfo fenceInfo = {}; 482 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; 483 fenceInfo.pNext = NULL; 484 fenceInfo.flags = 0; 485 486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB"); 487 488 ASSERT_NO_FATAL_FAILURE(InitState()); 489 490 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; 491 vk_testing::Buffer buffer; 492 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs); 493 494 BeginCommandBuffer(); 495 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111); 496 EndCommandBuffer(); 497 498 testFence.init(*m_device, fenceInfo); 499 500 // Bypass framework since it does the waits automatically 501 VkResult err = VK_SUCCESS; 502 VkSubmitInfo submit_info; 503 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; 504 submit_info.pNext = NULL; 505 submit_info.waitSemaphoreCount = 0; 506 submit_info.pWaitSemaphores = NULL; 507 submit_info.pWaitDstStageMask = NULL; 508 submit_info.commandBufferCount = 1; 509 submit_info.pCommandBuffers = &m_commandBuffer->handle(); 510 submit_info.signalSemaphoreCount = 0; 511 submit_info.pSignalSemaphores = NULL; 512 513 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle()); 514 ASSERT_VK_SUCCESS( err ); 515 516 // Introduce failure by calling begin again before checking fence 517 vkResetCommandBuffer(m_commandBuffer->handle(), 0); 518 519 if (!m_errorMonitor->DesiredMsgFound()) { 520 FAIL() << "Did not receive Error 'Resetting CB (0xaddress) before it has completed. You must check CB flag before.'"; 521 m_errorMonitor->DumpFailureMsgs(); 522 } 523 } 524 525 TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion) 526 { 527 vk_testing::Fence testFence; 528 VkFenceCreateInfo fenceInfo = {}; 529 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; 530 fenceInfo.pNext = NULL; 531 fenceInfo.flags = 0; 532 533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB"); 534 535 ASSERT_NO_FATAL_FAILURE(InitState()); 536 ASSERT_NO_FATAL_FAILURE(InitViewport()); 537 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 538 539 BeginCommandBuffer(); 540 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL); 541 EndCommandBuffer(); 542 543 testFence.init(*m_device, fenceInfo); 544 545 // Bypass framework since it does the waits automatically 546 VkResult err = VK_SUCCESS; 547 VkSubmitInfo submit_info; 548 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; 549 submit_info.pNext = NULL; 550 submit_info.waitSemaphoreCount = 0; 551 submit_info.pWaitSemaphores = NULL; 552 submit_info.pWaitDstStageMask = NULL; 553 submit_info.commandBufferCount = 1; 554 submit_info.pCommandBuffers = &m_commandBuffer->handle(); 555 submit_info.signalSemaphoreCount = 0; 556 submit_info.pSignalSemaphores = NULL; 557 558 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle()); 559 ASSERT_VK_SUCCESS( err ); 560 561 VkCommandBufferInheritanceInfo hinfo = {}; 562 VkCommandBufferBeginInfo info = {}; 563 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; 564 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; 565 info.renderPass = VK_NULL_HANDLE; 566 info.subpass = 0; 567 info.framebuffer = VK_NULL_HANDLE; 568 info.occlusionQueryEnable = VK_FALSE; 569 info.queryFlags = 0; 570 info.pipelineStatistics = 0; 571 572 // Introduce failure by calling BCB again before checking fence 573 vkBeginCommandBuffer(m_commandBuffer->handle(), &info); 574 575 if (!m_errorMonitor->DesiredMsgFound()) { 576 FAIL() << "Did not receive Error 'Calling vkBeginCommandBuffer() on an active CB (0xaddress) before it has completed'"; 577 m_errorMonitor->DumpFailureMsgs(); 578 579 } 580 } 581 #endif 582 TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) { 583 VkResult err; 584 bool pass; 585 586 m_errorMonitor->SetDesiredFailureMsg( 587 VK_DEBUG_REPORT_ERROR_BIT_EXT, 588 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT"); 589 590 ASSERT_NO_FATAL_FAILURE(InitState()); 591 592 // Create an image, allocate memory, free it, and then try to bind it 593 VkImage image; 594 VkDeviceMemory mem; 595 VkMemoryRequirements mem_reqs; 596 597 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM; 598 const int32_t tex_width = 32; 599 const int32_t tex_height = 32; 600 601 VkImageCreateInfo image_create_info = {}; 602 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 603 image_create_info.pNext = NULL; 604 image_create_info.imageType = VK_IMAGE_TYPE_2D; 605 image_create_info.format = tex_format; 606 image_create_info.extent.width = tex_width; 607 image_create_info.extent.height = tex_height; 608 image_create_info.extent.depth = 1; 609 image_create_info.mipLevels = 1; 610 image_create_info.arrayLayers = 1; 611 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 612 image_create_info.tiling = VK_IMAGE_TILING_LINEAR; 613 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT; 614 image_create_info.flags = 0; 615 616 VkMemoryAllocateInfo mem_alloc = {}; 617 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 618 mem_alloc.pNext = NULL; 619 mem_alloc.allocationSize = 0; 620 // Introduce failure, do NOT set memProps to 621 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT 622 mem_alloc.memoryTypeIndex = 1; 623 624 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image); 625 ASSERT_VK_SUCCESS(err); 626 627 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs); 628 629 mem_alloc.allocationSize = mem_reqs.size; 630 631 pass = 632 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, 633 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); 634 if (!pass) { // If we can't find any unmappable memory this test doesn't 635 // make sense 636 vkDestroyImage(m_device->device(), image, NULL); 637 return; 638 } 639 640 // allocate memory 641 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem); 642 ASSERT_VK_SUCCESS(err); 643 644 // Try to bind free memory that has been freed 645 err = vkBindImageMemory(m_device->device(), image, mem, 0); 646 ASSERT_VK_SUCCESS(err); 647 648 // Map memory as if to initialize the image 649 void *mappedAddress = NULL; 650 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, 651 &mappedAddress); 652 653 if (!m_errorMonitor->DesiredMsgFound()) { 654 FAIL() << "Did not receive Error 'Error received did not match " 655 "expected error message from vkMapMemory in MemTracker'"; 656 m_errorMonitor->DumpFailureMsgs(); 657 } 658 659 vkDestroyImage(m_device->device(), image, NULL); 660 } 661 662 // TODO : Is this test still valid. Not sure it is with updates to memory 663 // binding model 664 // Verify and delete the test of fix the check 665 // TEST_F(VkLayerTest, FreeBoundMemory) 666 //{ 667 // VkResult err; 668 // 669 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, 670 // "Freeing memory object while it still has references"); 671 // 672 // ASSERT_NO_FATAL_FAILURE(InitState()); 673 674 // // Create an image, allocate memory, free it, and then try to bind it 675 // VkImage image; 676 // VkDeviceMemory mem; 677 // VkMemoryRequirements mem_reqs; 678 // 679 // const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM; 680 // const int32_t tex_width = 32; 681 // const int32_t tex_height = 32; 682 // 683 // const VkImageCreateInfo image_create_info = { 684 // .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, 685 // .pNext = NULL, 686 // .imageType = VK_IMAGE_TYPE_2D, 687 // .format = tex_format, 688 // .extent = { tex_width, tex_height, 1 }, 689 // .mipLevels = 1, 690 // .arraySize = 1, 691 // .samples = VK_SAMPLE_COUNT_1_BIT, 692 // .tiling = VK_IMAGE_TILING_LINEAR, 693 // .usage = VK_IMAGE_USAGE_SAMPLED_BIT, 694 // .flags = 0, 695 // }; 696 // VkMemoryAllocateInfo mem_alloc = { 697 // .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, 698 // .pNext = NULL, 699 // .allocationSize = 0, 700 // .memoryTypeIndex = 0, 701 // }; 702 // 703 // err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image); 704 // ASSERT_VK_SUCCESS(err); 705 // 706 // err = vkGetImageMemoryRequirements(m_device->device(), 707 // image, 708 // &mem_reqs); 709 // ASSERT_VK_SUCCESS(err); 710 // 711 // mem_alloc.allocationSize = mem_reqs.size; 712 // 713 // err = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 714 // 0); 715 // ASSERT_VK_SUCCESS(err); 716 // 717 // // allocate memory 718 // err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem); 719 // ASSERT_VK_SUCCESS(err); 720 // 721 // // Bind memory to Image object 722 // err = vkBindImageMemory(m_device->device(), image, mem, 0); 723 // ASSERT_VK_SUCCESS(err); 724 // 725 // // Introduce validation failure, free memory while still bound to object 726 // vkFreeMemory(m_device->device(), mem, NULL); 727 // 728 // if (!m_errorMonitor->DesiredMsgFound()) { 729 // FAIL() << "Did not receive Warning 'Freeing memory object while it 730 // still has references'"); 731 // m_errorMonitor->DumpFailureMsgs(); 732 // } 733 //} 734 735 TEST_F(VkLayerTest, RebindMemory) { 736 VkResult err; 737 bool pass; 738 739 m_errorMonitor->SetDesiredFailureMsg( 740 VK_DEBUG_REPORT_ERROR_BIT_EXT, 741 "which has already been bound to mem object"); 742 743 ASSERT_NO_FATAL_FAILURE(InitState()); 744 745 // Create an image, allocate memory, free it, and then try to bind it 746 VkImage image; 747 VkDeviceMemory mem1; 748 VkDeviceMemory mem2; 749 VkMemoryRequirements mem_reqs; 750 751 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM; 752 const int32_t tex_width = 32; 753 const int32_t tex_height = 32; 754 755 VkImageCreateInfo image_create_info = {}; 756 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 757 image_create_info.pNext = NULL; 758 image_create_info.imageType = VK_IMAGE_TYPE_2D; 759 image_create_info.format = tex_format; 760 image_create_info.extent.width = tex_width; 761 image_create_info.extent.height = tex_height; 762 image_create_info.extent.depth = 1; 763 image_create_info.mipLevels = 1; 764 image_create_info.arrayLayers = 1; 765 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 766 image_create_info.tiling = VK_IMAGE_TILING_LINEAR; 767 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT; 768 image_create_info.flags = 0; 769 770 VkMemoryAllocateInfo mem_alloc = {}; 771 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 772 mem_alloc.pNext = NULL; 773 mem_alloc.allocationSize = 0; 774 mem_alloc.memoryTypeIndex = 0; 775 776 // Introduce failure, do NOT set memProps to 777 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT 778 mem_alloc.memoryTypeIndex = 1; 779 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image); 780 ASSERT_VK_SUCCESS(err); 781 782 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs); 783 784 mem_alloc.allocationSize = mem_reqs.size; 785 pass = 786 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0); 787 ASSERT_TRUE(pass); 788 789 // allocate 2 memory objects 790 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1); 791 ASSERT_VK_SUCCESS(err); 792 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2); 793 ASSERT_VK_SUCCESS(err); 794 795 // Bind first memory object to Image object 796 err = vkBindImageMemory(m_device->device(), image, mem1, 0); 797 ASSERT_VK_SUCCESS(err); 798 799 // Introduce validation failure, try to bind a different memory object to 800 // the same image object 801 err = vkBindImageMemory(m_device->device(), image, mem2, 0); 802 803 if (!m_errorMonitor->DesiredMsgFound()) { 804 FAIL() << "Did not receive Error when rebinding memory to an object"; 805 m_errorMonitor->DumpFailureMsgs(); 806 } 807 808 vkDestroyImage(m_device->device(), image, NULL); 809 vkFreeMemory(m_device->device(), mem1, NULL); 810 vkFreeMemory(m_device->device(), mem2, NULL); 811 } 812 813 TEST_F(VkLayerTest, SubmitSignaledFence) { 814 vk_testing::Fence testFence; 815 816 m_errorMonitor->SetDesiredFailureMsg( 817 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences " 818 "must be reset before being submitted"); 819 820 VkFenceCreateInfo fenceInfo = {}; 821 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; 822 fenceInfo.pNext = NULL; 823 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; 824 825 ASSERT_NO_FATAL_FAILURE(InitState()); 826 ASSERT_NO_FATAL_FAILURE(InitViewport()); 827 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 828 829 BeginCommandBuffer(); 830 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, 831 m_stencil_clear_color, NULL); 832 EndCommandBuffer(); 833 834 testFence.init(*m_device, fenceInfo); 835 836 VkSubmitInfo submit_info; 837 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; 838 submit_info.pNext = NULL; 839 submit_info.waitSemaphoreCount = 0; 840 submit_info.pWaitSemaphores = NULL; 841 submit_info.pWaitDstStageMask = NULL; 842 submit_info.commandBufferCount = 1; 843 submit_info.pCommandBuffers = &m_commandBuffer->handle(); 844 submit_info.signalSemaphoreCount = 0; 845 submit_info.pSignalSemaphores = NULL; 846 847 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle()); 848 vkQueueWaitIdle(m_device->m_queue); 849 850 if (!m_errorMonitor->DesiredMsgFound()) { 851 FAIL() << "Did not receive Error 'VkQueueSubmit with fence in " 852 "SIGNALED_STATE'"; 853 m_errorMonitor->DumpFailureMsgs(); 854 } 855 } 856 857 TEST_F(VkLayerTest, ResetUnsignaledFence) { 858 vk_testing::Fence testFence; 859 VkFenceCreateInfo fenceInfo = {}; 860 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; 861 fenceInfo.pNext = NULL; 862 863 // TODO: verify that this matches layer 864 m_errorMonitor->SetDesiredFailureMsg( 865 VK_DEBUG_REPORT_WARNING_BIT_EXT, 866 "submitted to VkResetFences in UNSIGNALED STATE"); 867 868 ASSERT_NO_FATAL_FAILURE(InitState()); 869 testFence.init(*m_device, fenceInfo); 870 VkFence fences[1] = {testFence.handle()}; 871 vkResetFences(m_device->device(), 1, fences); 872 873 if (!m_errorMonitor->DesiredMsgFound()) { 874 FAIL() << "Did not receive Error 'VkResetFences with fence in " 875 "UNSIGNALED_STATE'"; 876 m_errorMonitor->DumpFailureMsgs(); 877 } 878 } 879 880 /* TODO: Update for changes due to bug-14075 tiling across render passes */ 881 #if 0 882 TEST_F(VkLayerTest, InvalidUsageBits) 883 { 884 // Initiate Draw w/o a PSO bound 885 886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 887 "Invalid usage flag for image "); 888 889 ASSERT_NO_FATAL_FAILURE(InitState()); 890 VkCommandBufferObj commandBuffer(m_device); 891 BeginCommandBuffer(); 892 893 const VkExtent3D e3d = { 894 .width = 128, 895 .height = 128, 896 .depth = 1, 897 }; 898 const VkImageCreateInfo ici = { 899 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, 900 .pNext = NULL, 901 .imageType = VK_IMAGE_TYPE_2D, 902 .format = VK_FORMAT_D32_SFLOAT_S8_UINT, 903 .extent = e3d, 904 .mipLevels = 1, 905 .arraySize = 1, 906 .samples = VK_SAMPLE_COUNT_1_BIT, 907 .tiling = VK_IMAGE_TILING_LINEAR, 908 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 909 .flags = 0, 910 }; 911 912 VkImage dsi; 913 vkCreateImage(m_device->device(), &ici, NULL, &dsi); 914 VkDepthStencilView dsv; 915 const VkDepthStencilViewCreateInfo dsvci = { 916 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO, 917 .pNext = NULL, 918 .image = dsi, 919 .mipLevel = 0, 920 .baseArrayLayer = 0, 921 .arraySize = 1, 922 .flags = 0, 923 }; 924 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv); 925 926 if (!m_errorMonitor->DesiredMsgFound()) { 927 FAIL() << "Error received was not 'Invalid usage flag for image...'"; 928 m_errorMonitor->DumpFailureMsgs(); 929 } 930 } 931 #endif // 0 932 #endif // MEM_TRACKER_TESTS 933 934 #if OBJ_TRACKER_TESTS 935 TEST_F(VkLayerTest, PipelineNotBound) { 936 VkResult err; 937 938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 939 "Invalid VkPipeline Object "); 940 941 ASSERT_NO_FATAL_FAILURE(InitState()); 942 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 943 944 VkDescriptorPoolSize ds_type_count = {}; 945 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 946 ds_type_count.descriptorCount = 1; 947 948 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 949 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 950 ds_pool_ci.pNext = NULL; 951 ds_pool_ci.maxSets = 1; 952 ds_pool_ci.poolSizeCount = 1; 953 ds_pool_ci.pPoolSizes = &ds_type_count; 954 955 VkDescriptorPool ds_pool; 956 err = 957 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 958 ASSERT_VK_SUCCESS(err); 959 960 VkDescriptorSetLayoutBinding dsl_binding = {}; 961 dsl_binding.binding = 0; 962 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 963 dsl_binding.descriptorCount = 1; 964 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 965 dsl_binding.pImmutableSamplers = NULL; 966 967 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 968 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 969 ds_layout_ci.pNext = NULL; 970 ds_layout_ci.bindingCount = 1; 971 ds_layout_ci.pBindings = &dsl_binding; 972 973 VkDescriptorSetLayout ds_layout; 974 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 975 &ds_layout); 976 ASSERT_VK_SUCCESS(err); 977 978 VkDescriptorSet descriptorSet; 979 VkDescriptorSetAllocateInfo alloc_info = {}; 980 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 981 alloc_info.descriptorSetCount = 1; 982 alloc_info.descriptorPool = ds_pool; 983 alloc_info.pSetLayouts = &ds_layout; 984 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 985 &descriptorSet); 986 ASSERT_VK_SUCCESS(err); 987 988 VkPipelineLayoutCreateInfo pipeline_layout_ci = {}; 989 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 990 pipeline_layout_ci.pNext = NULL; 991 pipeline_layout_ci.setLayoutCount = 1; 992 pipeline_layout_ci.pSetLayouts = &ds_layout; 993 994 VkPipelineLayout pipeline_layout; 995 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 996 &pipeline_layout); 997 ASSERT_VK_SUCCESS(err); 998 999 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be); 1000 1001 BeginCommandBuffer(); 1002 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), 1003 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline); 1004 1005 if (!m_errorMonitor->DesiredMsgFound()) { 1006 FAIL() 1007 << "Error received was not 'Invalid VkPipeline Object 0xbaadb1be'" 1008 << endl; 1009 m_errorMonitor->DumpFailureMsgs(); 1010 } 1011 1012 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); 1013 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 1014 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 1015 } 1016 1017 TEST_F(VkLayerTest, BindInvalidMemory) { 1018 VkResult err; 1019 bool pass; 1020 1021 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 1022 "Invalid VkDeviceMemory Object "); 1023 1024 ASSERT_NO_FATAL_FAILURE(InitState()); 1025 1026 // Create an image, allocate memory, free it, and then try to bind it 1027 VkImage image; 1028 VkDeviceMemory mem; 1029 VkMemoryRequirements mem_reqs; 1030 1031 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM; 1032 const int32_t tex_width = 32; 1033 const int32_t tex_height = 32; 1034 1035 VkImageCreateInfo image_create_info = {}; 1036 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 1037 image_create_info.pNext = NULL; 1038 image_create_info.imageType = VK_IMAGE_TYPE_2D; 1039 image_create_info.format = tex_format; 1040 image_create_info.extent.width = tex_width; 1041 image_create_info.extent.height = tex_height; 1042 image_create_info.extent.depth = 1; 1043 image_create_info.mipLevels = 1; 1044 image_create_info.arrayLayers = 1; 1045 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 1046 image_create_info.tiling = VK_IMAGE_TILING_LINEAR; 1047 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT; 1048 image_create_info.flags = 0; 1049 1050 VkMemoryAllocateInfo mem_alloc = {}; 1051 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 1052 mem_alloc.pNext = NULL; 1053 mem_alloc.allocationSize = 0; 1054 mem_alloc.memoryTypeIndex = 0; 1055 1056 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image); 1057 ASSERT_VK_SUCCESS(err); 1058 1059 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs); 1060 1061 mem_alloc.allocationSize = mem_reqs.size; 1062 1063 pass = 1064 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0); 1065 ASSERT_TRUE(pass); 1066 1067 // allocate memory 1068 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem); 1069 ASSERT_VK_SUCCESS(err); 1070 1071 // Introduce validation failure, free memory before binding 1072 vkFreeMemory(m_device->device(), mem, NULL); 1073 1074 // Try to bind free memory that has been freed 1075 err = vkBindImageMemory(m_device->device(), image, mem, 0); 1076 // This may very well return an error. 1077 (void)err; 1078 1079 if (!m_errorMonitor->DesiredMsgFound()) { 1080 FAIL() << "Did not receive Error 'Invalid VkDeviceMemory Object " 1081 "0x<handle>'"; 1082 m_errorMonitor->DumpFailureMsgs(); 1083 } 1084 1085 vkDestroyImage(m_device->device(), image, NULL); 1086 } 1087 1088 TEST_F(VkLayerTest, BindMemoryToDestroyedObject) { 1089 VkResult err; 1090 bool pass; 1091 1092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 1093 "Invalid VkImage Object "); 1094 1095 ASSERT_NO_FATAL_FAILURE(InitState()); 1096 1097 // Create an image object, allocate memory, destroy the object and then try 1098 // to bind it 1099 VkImage image; 1100 VkDeviceMemory mem; 1101 VkMemoryRequirements mem_reqs; 1102 1103 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM; 1104 const int32_t tex_width = 32; 1105 const int32_t tex_height = 32; 1106 1107 VkImageCreateInfo image_create_info = {}; 1108 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 1109 image_create_info.pNext = NULL; 1110 image_create_info.imageType = VK_IMAGE_TYPE_2D; 1111 image_create_info.format = tex_format; 1112 image_create_info.extent.width = tex_width; 1113 image_create_info.extent.height = tex_height; 1114 image_create_info.extent.depth = 1; 1115 image_create_info.mipLevels = 1; 1116 image_create_info.arrayLayers = 1; 1117 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 1118 image_create_info.tiling = VK_IMAGE_TILING_LINEAR; 1119 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT; 1120 image_create_info.flags = 0; 1121 1122 VkMemoryAllocateInfo mem_alloc = {}; 1123 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 1124 mem_alloc.pNext = NULL; 1125 mem_alloc.allocationSize = 0; 1126 mem_alloc.memoryTypeIndex = 0; 1127 1128 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image); 1129 ASSERT_VK_SUCCESS(err); 1130 1131 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs); 1132 1133 mem_alloc.allocationSize = mem_reqs.size; 1134 pass = 1135 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0); 1136 ASSERT_TRUE(pass); 1137 1138 // Allocate memory 1139 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem); 1140 ASSERT_VK_SUCCESS(err); 1141 1142 // Introduce validation failure, destroy Image object before binding 1143 vkDestroyImage(m_device->device(), image, NULL); 1144 ASSERT_VK_SUCCESS(err); 1145 1146 // Now Try to bind memory to this destroyed object 1147 err = vkBindImageMemory(m_device->device(), image, mem, 0); 1148 // This may very well return an error. 1149 (void)err; 1150 1151 if (!m_errorMonitor->DesiredMsgFound()) { 1152 FAIL() << "Did not receive Error 'Invalid VkImage Object 0x<handle>'"; 1153 m_errorMonitor->DumpFailureMsgs(); 1154 } 1155 1156 vkFreeMemory(m_device->device(), mem, NULL); 1157 } 1158 1159 #endif // OBJ_TRACKER_TESTS 1160 1161 #if DRAW_STATE_TESTS 1162 TEST_F(VkLayerTest, LineWidthStateNotBound) { 1163 m_errorMonitor->SetDesiredFailureMsg( 1164 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1165 "Dynamic line width state not set for this command buffer"); 1166 1167 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line " 1168 "width state object is not bound beforehand"); 1169 1170 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, 1171 BsoFailLineWidth); 1172 1173 if (!m_errorMonitor->DesiredMsgFound()) { 1174 FAIL() << "Did not receive Error 'Dynamic line width state not set for " 1175 "this command buffer'"; 1176 m_errorMonitor->DumpFailureMsgs(); 1177 } 1178 } 1179 1180 TEST_F(VkLayerTest, DepthBiasStateNotBound) { 1181 m_errorMonitor->SetDesiredFailureMsg( 1182 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1183 "Dynamic depth bias state not set for this command buffer"); 1184 1185 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth " 1186 "bias state object is not bound beforehand"); 1187 1188 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, 1189 BsoFailDepthBias); 1190 1191 if (!m_errorMonitor->DesiredMsgFound()) { 1192 FAIL() << "Did not receive Error 'Dynamic depth bias state not set for " 1193 "this command buffer'"; 1194 m_errorMonitor->DumpFailureMsgs(); 1195 } 1196 } 1197 1198 // Disable these two tests until we can sort out how to track multiple layer 1199 // errors 1200 TEST_F(VkLayerTest, ViewportStateNotBound) { 1201 m_errorMonitor->SetDesiredFailureMsg( 1202 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1203 "Dynamic viewport state not set for this command buffer"); 1204 1205 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport " 1206 "state object is not bound beforehand"); 1207 1208 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, 1209 BsoFailViewport); 1210 1211 if (!m_errorMonitor->DesiredMsgFound()) { 1212 FAIL() << "Did not recieve Error 'Dynamic scissor state not set for " 1213 "this command buffer'"; 1214 m_errorMonitor->DumpFailureMsgs(); 1215 } 1216 } 1217 1218 TEST_F(VkLayerTest, ScissorStateNotBound) { 1219 m_errorMonitor->SetDesiredFailureMsg( 1220 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1221 "Dynamic scissor state not set for this command buffer"); 1222 1223 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport " 1224 "state object is not bound beforehand"); 1225 1226 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, 1227 BsoFailScissor); 1228 1229 if (!m_errorMonitor->DesiredMsgFound()) { 1230 FAIL() << "Did not recieve Error ' Expected: 'Dynamic scissor state " 1231 "not set for this command buffer'"; 1232 m_errorMonitor->DumpFailureMsgs(); 1233 } 1234 } 1235 1236 TEST_F(VkLayerTest, BlendStateNotBound) { 1237 m_errorMonitor->SetDesiredFailureMsg( 1238 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1239 "Dynamic blend object state not set for this command buffer"); 1240 1241 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend " 1242 "state object is not bound beforehand"); 1243 1244 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, 1245 BsoFailBlend); 1246 1247 if (!m_errorMonitor->DesiredMsgFound()) { 1248 FAIL() << "Did not recieve Error 'Dynamic blend object state not set " 1249 "for this command buffer'"; 1250 m_errorMonitor->DumpFailureMsgs(); 1251 } 1252 } 1253 1254 TEST_F(VkLayerTest, DepthBoundsStateNotBound) { 1255 m_errorMonitor->SetDesiredFailureMsg( 1256 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1257 "Dynamic depth bounds state not set for this command buffer"); 1258 1259 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth " 1260 "bounds state object is not bound beforehand"); 1261 1262 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, 1263 BsoFailDepthBounds); 1264 1265 if (!m_errorMonitor->DesiredMsgFound()) { 1266 FAIL() << "Did not receive Error 'Dynamic depth bounds state not set " 1267 "for this command buffer'"; 1268 m_errorMonitor->DumpFailureMsgs(); 1269 } 1270 } 1271 1272 TEST_F(VkLayerTest, StencilReadMaskNotSet) { 1273 m_errorMonitor->SetDesiredFailureMsg( 1274 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1275 "Dynamic stencil read mask state not set for this command buffer"); 1276 1277 ASSERT_NO_FATAL_FAILURE(InitState()); 1278 1279 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil " 1280 "read mask is not set beforehand"); 1281 1282 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, 1283 BsoFailStencilReadMask); 1284 1285 if (!m_errorMonitor->DesiredMsgFound()) { 1286 FAIL() << "Did not receive Error 'Dynamic stencil read mask state not " 1287 "set for this command buffer'"; 1288 m_errorMonitor->DumpFailureMsgs(); 1289 } 1290 } 1291 1292 TEST_F(VkLayerTest, StencilWriteMaskNotSet) { 1293 m_errorMonitor->SetDesiredFailureMsg( 1294 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1295 "Dynamic stencil write mask state not set for this command buffer"); 1296 1297 ASSERT_NO_FATAL_FAILURE(InitState()); 1298 1299 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil " 1300 "write mask is not set beforehand"); 1301 1302 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, 1303 BsoFailStencilWriteMask); 1304 1305 if (!m_errorMonitor->DesiredMsgFound()) { 1306 FAIL() << "Did not receive Error 'Dynamic stencil write mask state not " 1307 "set for this command buffer'"; 1308 m_errorMonitor->DumpFailureMsgs(); 1309 } 1310 } 1311 1312 TEST_F(VkLayerTest, StencilReferenceNotSet) { 1313 m_errorMonitor->SetDesiredFailureMsg( 1314 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1315 "Dynamic stencil reference state not set for this command buffer"); 1316 1317 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil " 1318 "reference is not set beforehand"); 1319 1320 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, 1321 BsoFailStencilReference); 1322 1323 if (!m_errorMonitor->DesiredMsgFound()) { 1324 FAIL() << "Did not receive Error 'Dynamic stencil reference state not " 1325 "set for this command buffer'"; 1326 m_errorMonitor->DumpFailureMsgs(); 1327 } 1328 } 1329 1330 TEST_F(VkLayerTest, CommandBufferTwoSubmits) { 1331 vk_testing::Fence testFence; 1332 1333 m_errorMonitor->SetDesiredFailureMsg( 1334 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1335 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has " 1336 "been submitted"); 1337 1338 VkFenceCreateInfo fenceInfo = {}; 1339 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; 1340 fenceInfo.pNext = NULL; 1341 fenceInfo.flags = 0; 1342 1343 ASSERT_NO_FATAL_FAILURE(InitState()); 1344 ASSERT_NO_FATAL_FAILURE(InitViewport()); 1345 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 1346 1347 // We luck out b/c by default the framework creates CB w/ the 1348 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set 1349 BeginCommandBuffer(); 1350 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, 1351 m_stencil_clear_color, NULL); 1352 EndCommandBuffer(); 1353 1354 testFence.init(*m_device, fenceInfo); 1355 1356 // Bypass framework since it does the waits automatically 1357 VkResult err = VK_SUCCESS; 1358 VkSubmitInfo submit_info; 1359 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; 1360 submit_info.pNext = NULL; 1361 submit_info.waitSemaphoreCount = 0; 1362 submit_info.pWaitSemaphores = NULL; 1363 submit_info.pWaitDstStageMask = NULL; 1364 submit_info.commandBufferCount = 1; 1365 submit_info.pCommandBuffers = &m_commandBuffer->handle(); 1366 submit_info.signalSemaphoreCount = 0; 1367 submit_info.pSignalSemaphores = NULL; 1368 1369 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle()); 1370 ASSERT_VK_SUCCESS(err); 1371 1372 // Cause validation error by re-submitting cmd buffer that should only be 1373 // submitted once 1374 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle()); 1375 1376 if (!m_errorMonitor->DesiredMsgFound()) { 1377 FAIL() << "Did not receive Error 'CB (0xaddress) was created w/ " 1378 "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set...'"; 1379 m_errorMonitor->DumpFailureMsgs(); 1380 } 1381 } 1382 1383 TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) { 1384 // Initiate Draw w/o a PSO bound 1385 VkResult err; 1386 1387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 1388 "Unable to allocate 1 descriptors of " 1389 "type " 1390 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER "); 1391 1392 ASSERT_NO_FATAL_FAILURE(InitState()); 1393 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 1394 1395 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer 1396 // descriptor from it 1397 VkDescriptorPoolSize ds_type_count = {}; 1398 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER; 1399 ds_type_count.descriptorCount = 1; 1400 1401 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 1402 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 1403 ds_pool_ci.pNext = NULL; 1404 ds_pool_ci.flags = 0; 1405 ds_pool_ci.maxSets = 1; 1406 ds_pool_ci.poolSizeCount = 1; 1407 ds_pool_ci.pPoolSizes = &ds_type_count; 1408 1409 VkDescriptorPool ds_pool; 1410 err = 1411 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 1412 ASSERT_VK_SUCCESS(err); 1413 1414 VkDescriptorSetLayoutBinding dsl_binding = {}; 1415 dsl_binding.binding = 0; 1416 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 1417 dsl_binding.descriptorCount = 1; 1418 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 1419 dsl_binding.pImmutableSamplers = NULL; 1420 1421 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 1422 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 1423 ds_layout_ci.pNext = NULL; 1424 ds_layout_ci.bindingCount = 1; 1425 ds_layout_ci.pBindings = &dsl_binding; 1426 1427 VkDescriptorSetLayout ds_layout; 1428 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 1429 &ds_layout); 1430 ASSERT_VK_SUCCESS(err); 1431 1432 VkDescriptorSet descriptorSet; 1433 VkDescriptorSetAllocateInfo alloc_info = {}; 1434 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 1435 alloc_info.descriptorSetCount = 1; 1436 alloc_info.descriptorPool = ds_pool; 1437 alloc_info.pSetLayouts = &ds_layout; 1438 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 1439 &descriptorSet); 1440 1441 if (!m_errorMonitor->DesiredMsgFound()) { 1442 FAIL() << "Did not receive Error 'Unable to allocate 1 descriptors of " 1443 "type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER...'"; 1444 m_errorMonitor->DumpFailureMsgs(); 1445 } 1446 1447 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 1448 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 1449 } 1450 1451 TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) { 1452 VkResult err; 1453 1454 m_errorMonitor->SetDesiredFailureMsg( 1455 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1456 "It is invalid to call vkFreeDescriptorSets() with a pool created " 1457 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT."); 1458 1459 ASSERT_NO_FATAL_FAILURE(InitState()); 1460 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 1461 1462 VkDescriptorPoolSize ds_type_count = {}; 1463 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 1464 ds_type_count.descriptorCount = 1; 1465 1466 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 1467 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 1468 ds_pool_ci.pNext = NULL; 1469 ds_pool_ci.maxSets = 1; 1470 ds_pool_ci.poolSizeCount = 1; 1471 ds_pool_ci.flags = 0; 1472 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means 1473 // app can only call vkResetDescriptorPool on this pool.; 1474 ds_pool_ci.pPoolSizes = &ds_type_count; 1475 1476 VkDescriptorPool ds_pool; 1477 err = 1478 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 1479 ASSERT_VK_SUCCESS(err); 1480 1481 VkDescriptorSetLayoutBinding dsl_binding = {}; 1482 dsl_binding.binding = 0; 1483 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 1484 dsl_binding.descriptorCount = 1; 1485 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 1486 dsl_binding.pImmutableSamplers = NULL; 1487 1488 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 1489 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 1490 ds_layout_ci.pNext = NULL; 1491 ds_layout_ci.bindingCount = 1; 1492 ds_layout_ci.pBindings = &dsl_binding; 1493 1494 VkDescriptorSetLayout ds_layout; 1495 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 1496 &ds_layout); 1497 ASSERT_VK_SUCCESS(err); 1498 1499 VkDescriptorSet descriptorSet; 1500 VkDescriptorSetAllocateInfo alloc_info = {}; 1501 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 1502 alloc_info.descriptorSetCount = 1; 1503 alloc_info.descriptorPool = ds_pool; 1504 alloc_info.pSetLayouts = &ds_layout; 1505 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 1506 &descriptorSet); 1507 ASSERT_VK_SUCCESS(err); 1508 1509 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet); 1510 if (!m_errorMonitor->DesiredMsgFound()) { 1511 FAIL() << "Did not receive Error 'It is invalid to call " 1512 "vkFreeDescriptorSets() with a pool created with...'"; 1513 m_errorMonitor->DumpFailureMsgs(); 1514 } 1515 1516 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 1517 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 1518 } 1519 1520 TEST_F(VkLayerTest, InvalidDescriptorPool) { 1521 // TODO : Simple check for bad object should be added to ObjectTracker to 1522 // catch this case 1523 // The DS check for this is after driver has been called to validate DS 1524 // internal data struct 1525 // Attempt to clear DS Pool with bad object 1526 /* 1527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 1528 "Unable to find pool node for pool 0xbaad6001 specified in 1529 vkResetDescriptorPool() call"); 1530 1531 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001; 1532 vkResetDescriptorPool(device(), badPool); 1533 1534 if (!m_errorMonitor->DesiredMsgFound()) { 1535 FAIL() << "Did not receive Error 'Unable to find pool node for pool 1536 0xbaad6001 specified in vkResetDescriptorPool() call'"; 1537 m_errorMonitor->DumpFailureMsgs(); 1538 }*/ 1539 } 1540 1541 TEST_F(VkLayerTest, InvalidDescriptorSet) { 1542 // TODO : Simple check for bad object should be added to ObjectTracker to 1543 // catch this case 1544 // The DS check for this is after driver has been called to validate DS 1545 // internal data struct 1546 // Create a valid cmd buffer 1547 // call vkCmdBindDescriptorSets w/ false DS 1548 } 1549 1550 TEST_F(VkLayerTest, InvalidDescriptorSetLayout) { 1551 // TODO : Simple check for bad object should be added to ObjectTracker to 1552 // catch this case 1553 // The DS check for this is after driver has been called to validate DS 1554 // internal data struct 1555 } 1556 1557 TEST_F(VkLayerTest, InvalidPipeline) { 1558 // TODO : Simple check for bad object should be added to ObjectTracker to 1559 // catch this case 1560 // The DS check for this is after driver has been called to validate DS 1561 // internal data struct 1562 // Create a valid cmd buffer 1563 // call vkCmdBindPipeline w/ false Pipeline 1564 // 1565 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 1566 // "Attempt to bind Pipeline "); 1567 // 1568 // ASSERT_NO_FATAL_FAILURE(InitState()); 1569 // VkCommandBufferObj commandBuffer(m_device); 1570 // BeginCommandBuffer(); 1571 // VkPipeline badPipeline = (VkPipeline)0xbaadb1be; 1572 // vkCmdBindPipeline(commandBuffer.GetBufferHandle(), 1573 // VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline); 1574 // 1575 // if (!m_errorMonitor->DesiredMsgFound()) { 1576 // FAIL() << "Did not receive Error 'Attempt to bind Pipeline 1577 // 0xbaadb1be that doesn't exist!'"; 1578 // m_errorMonitor->DumpFailureMsgs(); 1579 // } 1580 } 1581 1582 TEST_F(VkLayerTest, DescriptorSetNotUpdated) { 1583 // Create and update CommandBuffer then call QueueSubmit w/o calling End on 1584 // CommandBuffer 1585 VkResult err; 1586 1587 // TODO: verify that this matches layer 1588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, 1589 " bound but it was never updated. "); 1590 1591 ASSERT_NO_FATAL_FAILURE(InitState()); 1592 ASSERT_NO_FATAL_FAILURE(InitViewport()); 1593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 1594 VkDescriptorPoolSize ds_type_count = {}; 1595 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 1596 ds_type_count.descriptorCount = 1; 1597 1598 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 1599 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 1600 ds_pool_ci.pNext = NULL; 1601 ds_pool_ci.maxSets = 1; 1602 ds_pool_ci.poolSizeCount = 1; 1603 ds_pool_ci.pPoolSizes = &ds_type_count; 1604 1605 VkDescriptorPool ds_pool; 1606 err = 1607 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 1608 ASSERT_VK_SUCCESS(err); 1609 1610 VkDescriptorSetLayoutBinding dsl_binding = {}; 1611 dsl_binding.binding = 0; 1612 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 1613 dsl_binding.descriptorCount = 1; 1614 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 1615 dsl_binding.pImmutableSamplers = NULL; 1616 1617 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 1618 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 1619 ds_layout_ci.pNext = NULL; 1620 ds_layout_ci.bindingCount = 1; 1621 ds_layout_ci.pBindings = &dsl_binding; 1622 VkDescriptorSetLayout ds_layout; 1623 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 1624 &ds_layout); 1625 ASSERT_VK_SUCCESS(err); 1626 1627 VkDescriptorSet descriptorSet; 1628 VkDescriptorSetAllocateInfo alloc_info = {}; 1629 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 1630 alloc_info.descriptorSetCount = 1; 1631 alloc_info.descriptorPool = ds_pool; 1632 alloc_info.pSetLayouts = &ds_layout; 1633 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 1634 &descriptorSet); 1635 ASSERT_VK_SUCCESS(err); 1636 1637 VkPipelineLayoutCreateInfo pipeline_layout_ci = {}; 1638 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 1639 pipeline_layout_ci.pNext = NULL; 1640 pipeline_layout_ci.setLayoutCount = 1; 1641 pipeline_layout_ci.pSetLayouts = &ds_layout; 1642 1643 VkPipelineLayout pipeline_layout; 1644 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 1645 &pipeline_layout); 1646 ASSERT_VK_SUCCESS(err); 1647 1648 VkShaderObj vs(m_device, bindStateVertShaderText, 1649 VK_SHADER_STAGE_VERTEX_BIT, this); 1650 // TODO - We shouldn't need a fragment shader but add it to be able to run 1651 // on more devices 1652 VkShaderObj fs(m_device, bindStateFragShaderText, 1653 VK_SHADER_STAGE_FRAGMENT_BIT, this); 1654 1655 VkPipelineObj pipe(m_device); 1656 pipe.AddShader(&vs); 1657 pipe.AddShader(&fs); 1658 pipe.CreateVKPipeline(pipeline_layout, renderPass()); 1659 1660 BeginCommandBuffer(); 1661 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), 1662 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle()); 1663 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), 1664 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1665 1, &descriptorSet, 0, NULL); 1666 1667 if (!m_errorMonitor->DesiredMsgFound()) { 1668 FAIL() << "Did not recieve Warning 'DS <blah> bound but it was never " 1669 "updated. You may want to either update it or not bind it.'"; 1670 m_errorMonitor->DumpFailureMsgs(); 1671 } 1672 1673 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); 1674 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 1675 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 1676 } 1677 1678 TEST_F(VkLayerTest, InvalidBufferViewObject) { 1679 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView 1680 VkResult err; 1681 1682 m_errorMonitor->SetDesiredFailureMsg( 1683 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1684 "Attempt to update descriptor with invalid bufferView "); 1685 1686 ASSERT_NO_FATAL_FAILURE(InitState()); 1687 VkDescriptorPoolSize ds_type_count = {}; 1688 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER; 1689 ds_type_count.descriptorCount = 1; 1690 1691 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 1692 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 1693 ds_pool_ci.pNext = NULL; 1694 ds_pool_ci.maxSets = 1; 1695 ds_pool_ci.poolSizeCount = 1; 1696 ds_pool_ci.pPoolSizes = &ds_type_count; 1697 1698 VkDescriptorPool ds_pool; 1699 err = 1700 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 1701 ASSERT_VK_SUCCESS(err); 1702 1703 VkDescriptorSetLayoutBinding dsl_binding = {}; 1704 dsl_binding.binding = 0; 1705 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER; 1706 dsl_binding.descriptorCount = 1; 1707 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 1708 dsl_binding.pImmutableSamplers = NULL; 1709 1710 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 1711 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 1712 ds_layout_ci.pNext = NULL; 1713 ds_layout_ci.bindingCount = 1; 1714 ds_layout_ci.pBindings = &dsl_binding; 1715 VkDescriptorSetLayout ds_layout; 1716 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 1717 &ds_layout); 1718 ASSERT_VK_SUCCESS(err); 1719 1720 VkDescriptorSet descriptorSet; 1721 VkDescriptorSetAllocateInfo alloc_info = {}; 1722 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 1723 alloc_info.descriptorSetCount = 1; 1724 alloc_info.descriptorPool = ds_pool; 1725 alloc_info.pSetLayouts = &ds_layout; 1726 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 1727 &descriptorSet); 1728 ASSERT_VK_SUCCESS(err); 1729 1730 VkBufferView view = 1731 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object 1732 VkWriteDescriptorSet descriptor_write; 1733 memset(&descriptor_write, 0, sizeof(descriptor_write)); 1734 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; 1735 descriptor_write.dstSet = descriptorSet; 1736 descriptor_write.dstBinding = 0; 1737 descriptor_write.descriptorCount = 1; 1738 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER; 1739 descriptor_write.pTexelBufferView = &view; 1740 1741 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL); 1742 1743 if (!m_errorMonitor->DesiredMsgFound()) { 1744 FAIL() << "Did not receive Error 'Attempt to update descriptor with " 1745 "invalid bufferView'"; 1746 m_errorMonitor->DumpFailureMsgs(); 1747 } 1748 1749 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 1750 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 1751 } 1752 1753 TEST_F(VkLayerTest, InvalidDynamicOffsetCases) { 1754 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error 1755 // cases: 1756 // 1. No dynamicOffset supplied 1757 // 2. Too many dynamicOffsets supplied 1758 // 3. Dynamic offset oversteps buffer being updated 1759 VkResult err; 1760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 1761 " requires 1 dynamicOffsets, but only " 1762 "0 dynamicOffsets are left in " 1763 "pDynamicOffsets "); 1764 1765 ASSERT_NO_FATAL_FAILURE(InitState()); 1766 ASSERT_NO_FATAL_FAILURE(InitViewport()); 1767 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 1768 1769 VkDescriptorPoolSize ds_type_count = {}; 1770 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; 1771 ds_type_count.descriptorCount = 1; 1772 1773 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 1774 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 1775 ds_pool_ci.pNext = NULL; 1776 ds_pool_ci.maxSets = 1; 1777 ds_pool_ci.poolSizeCount = 1; 1778 ds_pool_ci.pPoolSizes = &ds_type_count; 1779 1780 VkDescriptorPool ds_pool; 1781 err = 1782 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 1783 ASSERT_VK_SUCCESS(err); 1784 1785 VkDescriptorSetLayoutBinding dsl_binding = {}; 1786 dsl_binding.binding = 0; 1787 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; 1788 dsl_binding.descriptorCount = 1; 1789 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 1790 dsl_binding.pImmutableSamplers = NULL; 1791 1792 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 1793 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 1794 ds_layout_ci.pNext = NULL; 1795 ds_layout_ci.bindingCount = 1; 1796 ds_layout_ci.pBindings = &dsl_binding; 1797 VkDescriptorSetLayout ds_layout; 1798 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 1799 &ds_layout); 1800 ASSERT_VK_SUCCESS(err); 1801 1802 VkDescriptorSet descriptorSet; 1803 VkDescriptorSetAllocateInfo alloc_info = {}; 1804 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 1805 alloc_info.descriptorSetCount = 1; 1806 alloc_info.descriptorPool = ds_pool; 1807 alloc_info.pSetLayouts = &ds_layout; 1808 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 1809 &descriptorSet); 1810 ASSERT_VK_SUCCESS(err); 1811 1812 VkPipelineLayoutCreateInfo pipeline_layout_ci = {}; 1813 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 1814 pipeline_layout_ci.pNext = NULL; 1815 pipeline_layout_ci.setLayoutCount = 1; 1816 pipeline_layout_ci.pSetLayouts = &ds_layout; 1817 1818 VkPipelineLayout pipeline_layout; 1819 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 1820 &pipeline_layout); 1821 ASSERT_VK_SUCCESS(err); 1822 1823 // Create a buffer to update the descriptor with 1824 uint32_t qfi = 0; 1825 VkBufferCreateInfo buffCI = {}; 1826 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; 1827 buffCI.size = 1024; 1828 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT; 1829 buffCI.queueFamilyIndexCount = 1; 1830 buffCI.pQueueFamilyIndices = &qfi; 1831 1832 VkBuffer dyub; 1833 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub); 1834 ASSERT_VK_SUCCESS(err); 1835 // Correctly update descriptor to avoid "NOT_UPDATED" error 1836 VkDescriptorBufferInfo buffInfo = {}; 1837 buffInfo.buffer = dyub; 1838 buffInfo.offset = 0; 1839 buffInfo.range = 1024; 1840 1841 VkWriteDescriptorSet descriptor_write; 1842 memset(&descriptor_write, 0, sizeof(descriptor_write)); 1843 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; 1844 descriptor_write.dstSet = descriptorSet; 1845 descriptor_write.dstBinding = 0; 1846 descriptor_write.descriptorCount = 1; 1847 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; 1848 descriptor_write.pBufferInfo = &buffInfo; 1849 1850 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL); 1851 1852 BeginCommandBuffer(); 1853 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), 1854 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1855 1, &descriptorSet, 0, NULL); 1856 if (!m_errorMonitor->DesiredMsgFound()) { 1857 FAIL() << "Error received was not 'descriptorSet #0 (0x<ADDR>) " 1858 "requires 1 dynamicOffsets, but only 0 dynamicOffsets are " 1859 "left in pDynamicOffsets array...'"; 1860 m_errorMonitor->DumpFailureMsgs(); 1861 } 1862 uint32_t pDynOff[2] = {512, 756}; 1863 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors 1864 m_errorMonitor->SetDesiredFailureMsg( 1865 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1866 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but "); 1867 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), 1868 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1869 1, &descriptorSet, 2, pDynOff); 1870 if (!m_errorMonitor->DesiredMsgFound()) { 1871 FAIL() << "Error received was not 'Attempting to bind 1 descriptorSets " 1872 "with 1 dynamic descriptors, but dynamicOffsetCount is 0...'"; 1873 m_errorMonitor->DumpFailureMsgs(); 1874 } 1875 // Finally cause error due to dynamicOffset being too big 1876 m_errorMonitor->SetDesiredFailureMsg( 1877 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1878 " from its update, this oversteps its buffer ("); 1879 // Create PSO to be used for draw-time errors below 1880 char const *vsSource = 1881 "#version 400\n" 1882 "#extension GL_ARB_separate_shader_objects: require\n" 1883 "#extension GL_ARB_shading_language_420pack: require\n" 1884 "\n" 1885 "out gl_PerVertex { \n" 1886 " vec4 gl_Position;\n" 1887 "};\n" 1888 "void main(){\n" 1889 " gl_Position = vec4(1);\n" 1890 "}\n"; 1891 char const *fsSource = 1892 "#version 400\n" 1893 "#extension GL_ARB_separate_shader_objects: require\n" 1894 "#extension GL_ARB_shading_language_420pack: require\n" 1895 "\n" 1896 "layout(location=0) out vec4 x;\n" 1897 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n" 1898 "void main(){\n" 1899 " x = vec4(bar.y);\n" 1900 "}\n"; 1901 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 1902 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 1903 VkPipelineObj pipe(m_device); 1904 pipe.AddShader(&vs); 1905 pipe.AddShader(&fs); 1906 pipe.AddColorAttachment(); 1907 pipe.CreateVKPipeline(pipeline_layout, renderPass()); 1908 1909 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), 1910 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle()); 1911 // This update should succeed, but offset size of 512 will overstep buffer 1912 // /w range 1024 & size 1024 1913 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), 1914 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1915 1, &descriptorSet, 1, pDynOff); 1916 Draw(1, 0, 0, 0); 1917 if (!m_errorMonitor->DesiredMsgFound()) { 1918 FAIL() << "Error received was not 'VkDescriptorSet (0x<ADDR>) bound as " 1919 "set #0 has dynamic offset 512. Combined with offet 0 and " 1920 "range 1024 from its update, this oversteps...'"; 1921 m_errorMonitor->DumpFailureMsgs(); 1922 } 1923 1924 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); 1925 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 1926 } 1927 1928 TEST_F(VkLayerTest, InvalidPushConstants) { 1929 // Hit push constant error cases: 1930 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize 1931 // 2. Incorrectly set push constant size to 0 1932 // 3. Incorrectly set push constant size to non-multiple of 4 1933 // 4. Attempt push constant update that exceeds maxPushConstantSize 1934 VkResult err; 1935 m_errorMonitor->SetDesiredFailureMsg( 1936 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1937 "vkCreatePipelineLayout() call has push constants with offset "); 1938 1939 ASSERT_NO_FATAL_FAILURE(InitState()); 1940 ASSERT_NO_FATAL_FAILURE(InitViewport()); 1941 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 1942 1943 VkPushConstantRange pc_range = {}; 1944 pc_range.size = 0xFFFFFFFFu; 1945 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; 1946 VkPipelineLayoutCreateInfo pipeline_layout_ci = {}; 1947 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 1948 pipeline_layout_ci.pushConstantRangeCount = 1; 1949 pipeline_layout_ci.pPushConstantRanges = &pc_range; 1950 1951 VkPipelineLayout pipeline_layout; 1952 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 1953 &pipeline_layout); 1954 1955 if (!m_errorMonitor->DesiredMsgFound()) { 1956 FAIL() << "Error received was not 'vkCreatePipelineLayout() call has " 1957 "push constants with offset 0...'"; 1958 m_errorMonitor->DumpFailureMsgs(); 1959 } 1960 // Now cause errors due to size 0 and non-4 byte aligned size 1961 pc_range.size = 0; 1962 m_errorMonitor->SetDesiredFailureMsg( 1963 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1964 "vkCreatePipelineLayout() call has push constant index 0 with size 0"); 1965 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 1966 &pipeline_layout); 1967 if (!m_errorMonitor->DesiredMsgFound()) { 1968 FAIL() << "Error received was not 'vkCreatePipelineLayout() call has " 1969 "push constant index 0 with size 0...'"; 1970 m_errorMonitor->DumpFailureMsgs(); 1971 } 1972 pc_range.size = 1; 1973 m_errorMonitor->SetDesiredFailureMsg( 1974 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1975 "vkCreatePipelineLayout() call has push constant index 0 with size 1"); 1976 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 1977 &pipeline_layout); 1978 if (!m_errorMonitor->DesiredMsgFound()) { 1979 FAIL() << "Error received was not 'vkCreatePipelineLayout() call has " 1980 "push constant index 0 with size 0...'"; 1981 m_errorMonitor->DumpFailureMsgs(); 1982 } 1983 // Cause error due to bad size in vkCmdPushConstants() call 1984 m_errorMonitor->SetDesiredFailureMsg( 1985 VK_DEBUG_REPORT_ERROR_BIT_EXT, 1986 "vkCmdPushConstants() call has push constants with offset "); 1987 pipeline_layout_ci.pushConstantRangeCount = 0; 1988 pipeline_layout_ci.pPushConstantRanges = NULL; 1989 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 1990 &pipeline_layout); 1991 ASSERT_VK_SUCCESS(err); 1992 BeginCommandBuffer(); 1993 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 1994 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL); 1995 if (!m_errorMonitor->DesiredMsgFound()) { 1996 FAIL() << "Error received was not 'vkCmdPushConstants() call has push " 1997 "constants with offset 0...'"; 1998 m_errorMonitor->DumpFailureMsgs(); 1999 } 2000 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); 2001 } 2002 2003 TEST_F(VkLayerTest, DescriptorSetCompatibility) { 2004 // Test various desriptorSet errors with bad binding combinations 2005 VkResult err; 2006 2007 ASSERT_NO_FATAL_FAILURE(InitState()); 2008 ASSERT_NO_FATAL_FAILURE(InitViewport()); 2009 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 2010 2011 static const uint32_t NUM_DESCRIPTOR_TYPES = 5; 2012 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {}; 2013 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 2014 ds_type_count[0].descriptorCount = 10; 2015 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; 2016 ds_type_count[1].descriptorCount = 2; 2017 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; 2018 ds_type_count[2].descriptorCount = 2; 2019 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER; 2020 ds_type_count[3].descriptorCount = 5; 2021 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT 2022 // type 2023 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT; 2024 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER; 2025 ds_type_count[4].descriptorCount = 2; 2026 2027 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 2028 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 2029 ds_pool_ci.pNext = NULL; 2030 ds_pool_ci.maxSets = 5; 2031 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES; 2032 ds_pool_ci.pPoolSizes = ds_type_count; 2033 2034 VkDescriptorPool ds_pool; 2035 err = 2036 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 2037 ASSERT_VK_SUCCESS(err); 2038 2039 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2; 2040 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {}; 2041 dsl_binding[0].binding = 0; 2042 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 2043 dsl_binding[0].descriptorCount = 5; 2044 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL; 2045 dsl_binding[0].pImmutableSamplers = NULL; 2046 2047 // Create layout identical to set0 layout but w/ different stageFlags 2048 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {}; 2049 dsl_fs_stage_only.binding = 0; 2050 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 2051 dsl_fs_stage_only.descriptorCount = 5; 2052 dsl_fs_stage_only.stageFlags = 2053 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at 2054 // bind time 2055 dsl_fs_stage_only.pImmutableSamplers = NULL; 2056 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 2057 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 2058 ds_layout_ci.pNext = NULL; 2059 ds_layout_ci.bindingCount = 1; 2060 ds_layout_ci.pBindings = dsl_binding; 2061 static const uint32_t NUM_LAYOUTS = 4; 2062 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {}; 2063 VkDescriptorSetLayout ds_layout_fs_only = {}; 2064 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only 2065 // layout for error case 2066 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 2067 &ds_layout[0]); 2068 ASSERT_VK_SUCCESS(err); 2069 ds_layout_ci.pBindings = &dsl_fs_stage_only; 2070 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 2071 &ds_layout_fs_only); 2072 ASSERT_VK_SUCCESS(err); 2073 dsl_binding[0].binding = 0; 2074 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; 2075 dsl_binding[0].descriptorCount = 2; 2076 dsl_binding[1].binding = 1; 2077 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; 2078 dsl_binding[1].descriptorCount = 2; 2079 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL; 2080 dsl_binding[1].pImmutableSamplers = NULL; 2081 ds_layout_ci.pBindings = dsl_binding; 2082 ds_layout_ci.bindingCount = 2; 2083 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 2084 &ds_layout[1]); 2085 ASSERT_VK_SUCCESS(err); 2086 dsl_binding[0].binding = 0; 2087 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER; 2088 dsl_binding[0].descriptorCount = 5; 2089 ds_layout_ci.bindingCount = 1; 2090 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 2091 &ds_layout[2]); 2092 ASSERT_VK_SUCCESS(err); 2093 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER; 2094 dsl_binding[0].descriptorCount = 2; 2095 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 2096 &ds_layout[3]); 2097 ASSERT_VK_SUCCESS(err); 2098 2099 static const uint32_t NUM_SETS = 4; 2100 VkDescriptorSet descriptorSet[NUM_SETS] = {}; 2101 VkDescriptorSetAllocateInfo alloc_info = {}; 2102 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 2103 alloc_info.descriptorSetCount = NUM_LAYOUTS; 2104 alloc_info.descriptorPool = ds_pool; 2105 alloc_info.pSetLayouts = ds_layout; 2106 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 2107 descriptorSet); 2108 ASSERT_VK_SUCCESS(err); 2109 VkDescriptorSet ds0_fs_only = {}; 2110 alloc_info.descriptorSetCount = 1; 2111 alloc_info.pSetLayouts = &ds_layout_fs_only; 2112 err = 2113 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only); 2114 ASSERT_VK_SUCCESS(err); 2115 2116 VkPipelineLayoutCreateInfo pipeline_layout_ci = {}; 2117 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 2118 pipeline_layout_ci.pNext = NULL; 2119 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS; 2120 pipeline_layout_ci.pSetLayouts = ds_layout; 2121 2122 VkPipelineLayout pipeline_layout; 2123 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 2124 &pipeline_layout); 2125 ASSERT_VK_SUCCESS(err); 2126 // Create pipelineLayout with only one setLayout 2127 pipeline_layout_ci.setLayoutCount = 1; 2128 VkPipelineLayout single_pipe_layout; 2129 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 2130 &single_pipe_layout); 2131 ASSERT_VK_SUCCESS(err); 2132 // Create pipelineLayout with 2 descriptor setLayout at index 0 2133 pipeline_layout_ci.pSetLayouts = &ds_layout[3]; 2134 VkPipelineLayout pipe_layout_one_desc; 2135 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 2136 &pipe_layout_one_desc); 2137 ASSERT_VK_SUCCESS(err); 2138 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0 2139 pipeline_layout_ci.pSetLayouts = &ds_layout[2]; 2140 VkPipelineLayout pipe_layout_five_samp; 2141 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 2142 &pipe_layout_five_samp); 2143 ASSERT_VK_SUCCESS(err); 2144 // Create pipelineLayout with UB type, but stageFlags for FS only 2145 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only; 2146 VkPipelineLayout pipe_layout_fs_only; 2147 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 2148 &pipe_layout_fs_only); 2149 ASSERT_VK_SUCCESS(err); 2150 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine 2151 VkDescriptorSetLayout pl_bad_s0[2] = {}; 2152 pl_bad_s0[0] = ds_layout_fs_only; 2153 pl_bad_s0[1] = ds_layout[1]; 2154 pipeline_layout_ci.setLayoutCount = 2; 2155 pipeline_layout_ci.pSetLayouts = pl_bad_s0; 2156 VkPipelineLayout pipe_layout_bad_set0; 2157 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 2158 &pipe_layout_bad_set0); 2159 ASSERT_VK_SUCCESS(err); 2160 2161 // Create a buffer to update the descriptor with 2162 uint32_t qfi = 0; 2163 VkBufferCreateInfo buffCI = {}; 2164 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; 2165 buffCI.size = 1024; 2166 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT; 2167 buffCI.queueFamilyIndexCount = 1; 2168 buffCI.pQueueFamilyIndices = &qfi; 2169 2170 VkBuffer dyub; 2171 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub); 2172 ASSERT_VK_SUCCESS(err); 2173 // Correctly update descriptor to avoid "NOT_UPDATED" error 2174 static const uint32_t NUM_BUFFS = 5; 2175 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {}; 2176 for (uint32_t i = 0; i < NUM_BUFFS; ++i) { 2177 buffInfo[i].buffer = dyub; 2178 buffInfo[i].offset = 0; 2179 buffInfo[i].range = 1024; 2180 } 2181 VkImage image; 2182 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM; 2183 const int32_t tex_width = 32; 2184 const int32_t tex_height = 32; 2185 VkImageCreateInfo image_create_info = {}; 2186 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 2187 image_create_info.pNext = NULL; 2188 image_create_info.imageType = VK_IMAGE_TYPE_2D; 2189 image_create_info.format = tex_format; 2190 image_create_info.extent.width = tex_width; 2191 image_create_info.extent.height = tex_height; 2192 image_create_info.extent.depth = 1; 2193 image_create_info.mipLevels = 1; 2194 image_create_info.arrayLayers = 1; 2195 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 2196 image_create_info.tiling = VK_IMAGE_TILING_LINEAR; 2197 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT; 2198 image_create_info.flags = 0; 2199 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image); 2200 ASSERT_VK_SUCCESS(err); 2201 2202 VkMemoryRequirements memReqs; 2203 VkDeviceMemory imageMem; 2204 bool pass; 2205 VkMemoryAllocateInfo memAlloc = {}; 2206 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 2207 memAlloc.pNext = NULL; 2208 memAlloc.allocationSize = 0; 2209 memAlloc.memoryTypeIndex = 0; 2210 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs); 2211 memAlloc.allocationSize = memReqs.size; 2212 pass = 2213 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0); 2214 ASSERT_TRUE(pass); 2215 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem); 2216 ASSERT_VK_SUCCESS(err); 2217 err = vkBindImageMemory(m_device->device(), image, imageMem, 0); 2218 ASSERT_VK_SUCCESS(err); 2219 2220 VkImageViewCreateInfo image_view_create_info = {}; 2221 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; 2222 image_view_create_info.image = image; 2223 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D; 2224 image_view_create_info.format = tex_format; 2225 image_view_create_info.subresourceRange.layerCount = 1; 2226 image_view_create_info.subresourceRange.baseMipLevel = 0; 2227 image_view_create_info.subresourceRange.levelCount = 1; 2228 image_view_create_info.subresourceRange.aspectMask = 2229 VK_IMAGE_ASPECT_COLOR_BIT; 2230 2231 VkImageView view; 2232 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, 2233 &view); 2234 ASSERT_VK_SUCCESS(err); 2235 VkDescriptorImageInfo imageInfo[4] = {}; 2236 imageInfo[0].imageView = view; 2237 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; 2238 imageInfo[1].imageView = view; 2239 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; 2240 imageInfo[2].imageView = view; 2241 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; 2242 imageInfo[3].imageView = view; 2243 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; 2244 2245 static const uint32_t NUM_SET_UPDATES = 3; 2246 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {}; 2247 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; 2248 descriptor_write[0].dstSet = descriptorSet[0]; 2249 descriptor_write[0].dstBinding = 0; 2250 descriptor_write[0].descriptorCount = 5; 2251 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 2252 descriptor_write[0].pBufferInfo = buffInfo; 2253 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; 2254 descriptor_write[1].dstSet = descriptorSet[1]; 2255 descriptor_write[1].dstBinding = 0; 2256 descriptor_write[1].descriptorCount = 2; 2257 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; 2258 descriptor_write[1].pImageInfo = imageInfo; 2259 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; 2260 descriptor_write[2].dstSet = descriptorSet[1]; 2261 descriptor_write[2].dstBinding = 1; 2262 descriptor_write[2].descriptorCount = 2; 2263 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; 2264 descriptor_write[2].pImageInfo = &imageInfo[2]; 2265 2266 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL); 2267 2268 // Create PSO to be used for draw-time errors below 2269 char const *vsSource = 2270 "#version 400\n" 2271 "#extension GL_ARB_separate_shader_objects: require\n" 2272 "#extension GL_ARB_shading_language_420pack: require\n" 2273 "\n" 2274 "out gl_PerVertex {\n" 2275 " vec4 gl_Position;\n" 2276 "};\n" 2277 "void main(){\n" 2278 " gl_Position = vec4(1);\n" 2279 "}\n"; 2280 char const *fsSource = 2281 "#version 400\n" 2282 "#extension GL_ARB_separate_shader_objects: require\n" 2283 "#extension GL_ARB_shading_language_420pack: require\n" 2284 "\n" 2285 "layout(location=0) out vec4 x;\n" 2286 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n" 2287 "void main(){\n" 2288 " x = vec4(bar.y);\n" 2289 "}\n"; 2290 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 2291 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 2292 VkPipelineObj pipe(m_device); 2293 pipe.AddShader(&vs); 2294 pipe.AddShader(&fs); 2295 pipe.AddColorAttachment(); 2296 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass()); 2297 2298 BeginCommandBuffer(); 2299 2300 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), 2301 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle()); 2302 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding 2303 // of PSO 2304 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of 2305 // cmd_pipeline.c 2306 // due to the fact that cmd_alloc_dset_data() has not been called in 2307 // cmd_bind_graphics_pipeline() 2308 // TODO : Want to cause various binding incompatibility issues here to test 2309 // DrawState 2310 // First cause various verify_layout_compatibility() fails 2311 // Second disturb early and late sets and verify INFO msgs 2312 // verify_set_layout_compatibility fail cases: 2313 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets 2314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 2315 " due to: invalid VkPipelineLayout "); 2316 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), 2317 VK_PIPELINE_BIND_POINT_GRAPHICS, 2318 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, 2319 &descriptorSet[0], 0, NULL); 2320 if (!m_errorMonitor->DesiredMsgFound()) { 2321 FAIL() << "Did not receive correct error msg when attempting to bind " 2322 "descriptorSets with invalid VkPipelineLayout."; 2323 m_errorMonitor->DumpFailureMsgs(); 2324 } 2325 // 2. layoutIndex exceeds # of layouts in layout 2326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 2327 " attempting to bind set to index 1"); 2328 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), 2329 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 2330 0, 2, &descriptorSet[0], 0, NULL); 2331 if (!m_errorMonitor->DesiredMsgFound()) { 2332 FAIL() << "Did not receive correct error msg when attempting to bind " 2333 "descriptorSet to index 1 when pipelineLayout only has index " 2334 "0."; 2335 m_errorMonitor->DumpFailureMsgs(); 2336 } 2337 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL); 2338 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5 2339 // descriptors 2340 m_errorMonitor->SetDesiredFailureMsg( 2341 VK_DEBUG_REPORT_ERROR_BIT_EXT, 2342 ", but corresponding set being bound has 5 descriptors."); 2343 vkCmdBindDescriptorSets( 2344 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, 2345 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL); 2346 if (!m_errorMonitor->DesiredMsgFound()) { 2347 FAIL() << "Did not receive correct error msg when attempting to bind " 2348 "descriptorSet w/ 5 descriptors to pipelineLayout with only " 2349 "2 descriptors."; 2350 m_errorMonitor->DumpFailureMsgs(); 2351 } 2352 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL); 2353 // 4. same # of descriptors but mismatch in type 2354 m_errorMonitor->SetDesiredFailureMsg( 2355 VK_DEBUG_REPORT_ERROR_BIT_EXT, 2356 " descriptor from pipelineLayout is type 'VK_DESCRIPTOR_TYPE_SAMPLER'"); 2357 vkCmdBindDescriptorSets( 2358 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, 2359 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL); 2360 if (!m_errorMonitor->DesiredMsgFound()) { 2361 FAIL() << "Did not receive correct error msg when attempting to bind " 2362 "UNIFORM_BUFFER descriptorSet to pipelineLayout with " 2363 "overlapping SAMPLER type."; 2364 m_errorMonitor->DumpFailureMsgs(); 2365 } 2366 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL); 2367 // 5. same # of descriptors but mismatch in stageFlags 2368 m_errorMonitor->SetDesiredFailureMsg( 2369 VK_DEBUG_REPORT_ERROR_BIT_EXT, 2370 " descriptor from pipelineLayout has stageFlags "); 2371 vkCmdBindDescriptorSets( 2372 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, 2373 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL); 2374 if (!m_errorMonitor->DesiredMsgFound()) { 2375 FAIL() << "Did not receive correct error msg when attempting to bind " 2376 "UNIFORM_BUFFER descriptorSet with ALL stageFlags to " 2377 "pipelineLayout with FS-only stageFlags."; 2378 m_errorMonitor->DumpFailureMsgs(); 2379 } 2380 // Cause INFO messages due to disturbing previously bound Sets 2381 // First bind sets 0 & 1 2382 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), 2383 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2384 2, &descriptorSet[0], 0, NULL); 2385 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout 2386 m_errorMonitor->SetDesiredFailureMsg( 2387 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, 2388 " previously bound as set #0 was disturbed "); 2389 vkCmdBindDescriptorSets( 2390 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, 2391 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL); 2392 if (!m_errorMonitor->DesiredMsgFound()) { 2393 FAIL() << "Did not receive correct info msg when binding Set1 w/ " 2394 "pipelineLayout that should disturb Set0."; 2395 m_errorMonitor->DumpFailureMsgs(); 2396 } 2397 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), 2398 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2399 2, &descriptorSet[0], 0, NULL); 2400 // 2. Disturb set after last bound set 2401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, 2402 " newly bound as set #0 so set #1 and " 2403 "any subsequent sets were disturbed "); 2404 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), 2405 VK_PIPELINE_BIND_POINT_GRAPHICS, 2406 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL); 2407 if (!m_errorMonitor->DesiredMsgFound()) { 2408 FAIL() << "Did not receive correct info msg when re-binding Set0 w/ " 2409 "pipelineLayout that should disturb Set1."; 2410 m_errorMonitor->DumpFailureMsgs(); 2411 } 2412 // Cause draw-time errors due to PSO incompatibilities 2413 // 1. Error due to not binding required set (we actually use same code as 2414 // above to disturb set0) 2415 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), 2416 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2417 2, &descriptorSet[0], 0, NULL); 2418 vkCmdBindDescriptorSets( 2419 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, 2420 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL); 2421 m_errorMonitor->SetDesiredFailureMsg( 2422 VK_DEBUG_REPORT_ERROR_BIT_EXT, 2423 " uses set #0 but that set is not bound."); 2424 Draw(1, 0, 0, 0); 2425 if (!m_errorMonitor->DesiredMsgFound()) { 2426 FAIL() << "Did not receive correct error msg when attempting draw " 2427 "requiring Set0 but Set0 is not bound."; 2428 m_errorMonitor->DumpFailureMsgs(); 2429 } 2430 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL); 2431 // 2. Error due to bound set not being compatible with PSO's 2432 // VkPipelineLayout (diff stageFlags in this case) 2433 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), 2434 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2435 2, &descriptorSet[0], 0, NULL); 2436 m_errorMonitor->SetDesiredFailureMsg( 2437 VK_DEBUG_REPORT_ERROR_BIT_EXT, 2438 " bound as set #0 is not compatible with "); 2439 Draw(1, 0, 0, 0); 2440 if (!m_errorMonitor->DesiredMsgFound()) { 2441 FAIL() << "Did not receive correct error msg when attempted draw where " 2442 "bound Set0 layout is not compatible PSO Set0 layout."; 2443 m_errorMonitor->DumpFailureMsgs(); 2444 } 2445 // Remaining clean-up 2446 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL); 2447 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) { 2448 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL); 2449 } 2450 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL); 2451 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet); 2452 vkDestroyBuffer(m_device->device(), dyub, NULL); 2453 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); 2454 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 2455 } 2456 2457 TEST_F(VkLayerTest, NoBeginCommandBuffer) { 2458 2459 m_errorMonitor->SetDesiredFailureMsg( 2460 VK_DEBUG_REPORT_ERROR_BIT_EXT, 2461 "You must call vkBeginCommandBuffer() before this call to "); 2462 2463 ASSERT_NO_FATAL_FAILURE(InitState()); 2464 VkCommandBufferObj commandBuffer(m_device, m_commandPool); 2465 // Call EndCommandBuffer() w/o calling BeginCommandBuffer() 2466 vkEndCommandBuffer(commandBuffer.GetBufferHandle()); 2467 2468 if (!m_errorMonitor->DesiredMsgFound()) { 2469 FAIL() << "Did not recieve Error 'You must call vkBeginCommandBuffer() " 2470 "before this call to vkEndCommandBuffer()'"; 2471 m_errorMonitor->DumpFailureMsgs(); 2472 } 2473 } 2474 2475 TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) { 2476 VkResult err; 2477 VkCommandBuffer draw_cmd; 2478 2479 m_errorMonitor->SetDesiredFailureMsg( 2480 VK_DEBUG_REPORT_ERROR_BIT_EXT, 2481 " must specify a valid renderpass parameter."); 2482 2483 ASSERT_NO_FATAL_FAILURE(InitState()); 2484 2485 VkCommandBufferAllocateInfo cmd = {}; 2486 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; 2487 cmd.pNext = NULL; 2488 cmd.commandPool = m_commandPool; 2489 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY; 2490 cmd.commandBufferCount = 1; 2491 2492 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd); 2493 ASSERT_VK_SUCCESS(err); 2494 2495 // Force the failure by not setting the Renderpass and Framebuffer fields 2496 VkCommandBufferBeginInfo cmd_buf_info = {}; 2497 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {}; 2498 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; 2499 cmd_buf_info.pNext = NULL; 2500 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | 2501 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT; 2502 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo; 2503 2504 // The error should be caught by validation of the BeginCommandBuffer call 2505 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info); 2506 2507 if (!m_errorMonitor->DesiredMsgFound()) { 2508 FAIL() << "Did not receive Error 'vkBeginCommandBuffer(): Secondary " 2509 "Command Buffers (0x<ADDR>) must specify a valid renderpass " 2510 "parameter.'"; 2511 m_errorMonitor->DumpFailureMsgs(); 2512 } 2513 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd); 2514 } 2515 2516 TEST_F(VkLayerTest, CommandBufferResetErrors) { 2517 // Cause error due to Begin while recording CB 2518 // Then cause 2 errors for attempting to reset CB w/o having 2519 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from 2520 // which CBs were allocated. Note that this bit is off by default. 2521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 2522 "Cannot call Begin on CB"); 2523 2524 ASSERT_NO_FATAL_FAILURE(InitState()); 2525 2526 // Calls AllocateCommandBuffers 2527 VkCommandBufferObj commandBuffer(m_device, m_commandPool); 2528 2529 // Force the failure by setting the Renderpass and Framebuffer fields with 2530 // (fake) data 2531 VkCommandBufferBeginInfo cmd_buf_info = {}; 2532 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {}; 2533 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; 2534 cmd_buf_info.pNext = NULL; 2535 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; 2536 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo; 2537 2538 // Begin CB to transition to recording state 2539 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info); 2540 // Can't re-begin. This should trigger error 2541 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info); 2542 if (!m_errorMonitor->DesiredMsgFound()) { 2543 FAIL() << "Did not receive Error 'Cannot call Begin on CB (0x<ADDR>) " 2544 "in the RECORDING state...'"; 2545 m_errorMonitor->DumpFailureMsgs(); 2546 } 2547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 2548 "Attempt to reset command buffer "); 2549 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test 2550 // Reset attempt will trigger error due to incorrect CommandPool state 2551 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags); 2552 if (!m_errorMonitor->DesiredMsgFound()) { 2553 FAIL() << "Did not receive Error 'Attempt to reset command buffer " 2554 "(0x<ADDR>) created from command pool...'"; 2555 m_errorMonitor->DumpFailureMsgs(); 2556 } 2557 m_errorMonitor->SetDesiredFailureMsg( 2558 VK_DEBUG_REPORT_ERROR_BIT_EXT, 2559 " attempts to implicitly reset cmdBuffer created from "); 2560 // Transition CB to RECORDED state 2561 vkEndCommandBuffer(commandBuffer.GetBufferHandle()); 2562 // Now attempting to Begin will implicitly reset, which triggers error 2563 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info); 2564 if (!m_errorMonitor->DesiredMsgFound()) { 2565 FAIL() << "Did not receive Error 'Call to vkBeginCommandBuffer() on " 2566 "command buffer (0x<ADDR>) attempts to implicitly reset...'"; 2567 m_errorMonitor->DumpFailureMsgs(); 2568 } 2569 } 2570 2571 TEST_F(VkLayerTest, InvalidPipelineCreateState) { 2572 // Attempt to Create Gfx Pipeline w/o a VS 2573 VkResult err; 2574 2575 m_errorMonitor->SetDesiredFailureMsg( 2576 VK_DEBUG_REPORT_ERROR_BIT_EXT, 2577 "Invalid Pipeline CreateInfo State: Vtx Shader required"); 2578 2579 ASSERT_NO_FATAL_FAILURE(InitState()); 2580 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 2581 2582 VkDescriptorPoolSize ds_type_count = {}; 2583 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 2584 ds_type_count.descriptorCount = 1; 2585 2586 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 2587 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 2588 ds_pool_ci.pNext = NULL; 2589 ds_pool_ci.maxSets = 1; 2590 ds_pool_ci.poolSizeCount = 1; 2591 ds_pool_ci.pPoolSizes = &ds_type_count; 2592 2593 VkDescriptorPool ds_pool; 2594 err = 2595 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 2596 ASSERT_VK_SUCCESS(err); 2597 2598 VkDescriptorSetLayoutBinding dsl_binding = {}; 2599 dsl_binding.binding = 0; 2600 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 2601 dsl_binding.descriptorCount = 1; 2602 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 2603 dsl_binding.pImmutableSamplers = NULL; 2604 2605 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 2606 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 2607 ds_layout_ci.pNext = NULL; 2608 ds_layout_ci.bindingCount = 1; 2609 ds_layout_ci.pBindings = &dsl_binding; 2610 2611 VkDescriptorSetLayout ds_layout; 2612 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 2613 &ds_layout); 2614 ASSERT_VK_SUCCESS(err); 2615 2616 VkDescriptorSet descriptorSet; 2617 VkDescriptorSetAllocateInfo alloc_info = {}; 2618 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 2619 alloc_info.descriptorSetCount = 1; 2620 alloc_info.descriptorPool = ds_pool; 2621 alloc_info.pSetLayouts = &ds_layout; 2622 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 2623 &descriptorSet); 2624 ASSERT_VK_SUCCESS(err); 2625 2626 VkPipelineLayoutCreateInfo pipeline_layout_ci = {}; 2627 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 2628 pipeline_layout_ci.setLayoutCount = 1; 2629 pipeline_layout_ci.pSetLayouts = &ds_layout; 2630 2631 VkPipelineLayout pipeline_layout; 2632 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 2633 &pipeline_layout); 2634 ASSERT_VK_SUCCESS(err); 2635 2636 VkViewport vp = {}; // Just need dummy vp to point to 2637 VkRect2D sc = {}; // dummy scissor to point to 2638 2639 VkPipelineViewportStateCreateInfo vp_state_ci = {}; 2640 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; 2641 vp_state_ci.scissorCount = 1; 2642 vp_state_ci.pScissors = ≻ 2643 vp_state_ci.viewportCount = 1; 2644 vp_state_ci.pViewports = &vp; 2645 2646 VkPipelineRasterizationStateCreateInfo rs_state_ci = {}; 2647 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; 2648 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL; 2649 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT; 2650 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; 2651 rs_state_ci.depthClampEnable = VK_FALSE; 2652 rs_state_ci.rasterizerDiscardEnable = VK_FALSE; 2653 rs_state_ci.depthBiasEnable = VK_FALSE; 2654 2655 VkGraphicsPipelineCreateInfo gp_ci = {}; 2656 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; 2657 gp_ci.pViewportState = &vp_state_ci; 2658 gp_ci.pRasterizationState = &rs_state_ci; 2659 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT; 2660 gp_ci.layout = pipeline_layout; 2661 gp_ci.renderPass = renderPass(); 2662 2663 VkPipelineCacheCreateInfo pc_ci = {}; 2664 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; 2665 pc_ci.initialDataSize = 0; 2666 pc_ci.pInitialData = 0; 2667 2668 VkPipeline pipeline; 2669 VkPipelineCache pipelineCache; 2670 2671 err = 2672 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache); 2673 ASSERT_VK_SUCCESS(err); 2674 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, 2675 &gp_ci, NULL, &pipeline); 2676 2677 if (!m_errorMonitor->DesiredMsgFound()) { 2678 FAIL() << "Did not receive Error 'Invalid Pipeline CreateInfo State: " 2679 "Vtx Shader required'"; 2680 m_errorMonitor->DumpFailureMsgs(); 2681 } 2682 2683 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL); 2684 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); 2685 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 2686 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 2687 } 2688 /*// TODO : This test should be good, but needs Tess support in compiler to run 2689 TEST_F(VkLayerTest, InvalidPatchControlPoints) 2690 { 2691 // Attempt to Create Gfx Pipeline w/o a VS 2692 VkResult err; 2693 2694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 2695 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH 2696 primitive "); 2697 2698 ASSERT_NO_FATAL_FAILURE(InitState()); 2699 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 2700 2701 VkDescriptorPoolSize ds_type_count = {}; 2702 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 2703 ds_type_count.descriptorCount = 1; 2704 2705 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 2706 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 2707 ds_pool_ci.pNext = NULL; 2708 ds_pool_ci.poolSizeCount = 1; 2709 ds_pool_ci.pPoolSizes = &ds_type_count; 2710 2711 VkDescriptorPool ds_pool; 2712 err = vkCreateDescriptorPool(m_device->device(), 2713 VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool); 2714 ASSERT_VK_SUCCESS(err); 2715 2716 VkDescriptorSetLayoutBinding dsl_binding = {}; 2717 dsl_binding.binding = 0; 2718 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 2719 dsl_binding.descriptorCount = 1; 2720 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 2721 dsl_binding.pImmutableSamplers = NULL; 2722 2723 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 2724 ds_layout_ci.sType = 2725 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 2726 ds_layout_ci.pNext = NULL; 2727 ds_layout_ci.bindingCount = 1; 2728 ds_layout_ci.pBindings = &dsl_binding; 2729 2730 VkDescriptorSetLayout ds_layout; 2731 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 2732 &ds_layout); 2733 ASSERT_VK_SUCCESS(err); 2734 2735 VkDescriptorSet descriptorSet; 2736 err = vkAllocateDescriptorSets(m_device->device(), ds_pool, 2737 VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet); 2738 ASSERT_VK_SUCCESS(err); 2739 2740 VkPipelineLayoutCreateInfo pipeline_layout_ci = {}; 2741 pipeline_layout_ci.sType = 2742 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 2743 pipeline_layout_ci.pNext = NULL; 2744 pipeline_layout_ci.setLayoutCount = 1; 2745 pipeline_layout_ci.pSetLayouts = &ds_layout; 2746 2747 VkPipelineLayout pipeline_layout; 2748 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 2749 &pipeline_layout); 2750 ASSERT_VK_SUCCESS(err); 2751 2752 VkPipelineShaderStageCreateInfo shaderStages[3]; 2753 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo)); 2754 2755 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT, 2756 this); 2757 // Just using VS txt for Tess shaders as we don't care about functionality 2758 VkShaderObj 2759 tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 2760 this); 2761 VkShaderObj 2762 te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, 2763 this); 2764 2765 shaderStages[0].sType = 2766 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; 2767 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT; 2768 shaderStages[0].shader = vs.handle(); 2769 shaderStages[1].sType = 2770 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; 2771 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT; 2772 shaderStages[1].shader = tc.handle(); 2773 shaderStages[2].sType = 2774 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; 2775 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT; 2776 shaderStages[2].shader = te.handle(); 2777 2778 VkPipelineInputAssemblyStateCreateInfo iaCI = {}; 2779 iaCI.sType = 2780 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; 2781 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST; 2782 2783 VkPipelineTessellationStateCreateInfo tsCI = {}; 2784 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO; 2785 tsCI.patchControlPoints = 0; // This will cause an error 2786 2787 VkGraphicsPipelineCreateInfo gp_ci = {}; 2788 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; 2789 gp_ci.pNext = NULL; 2790 gp_ci.stageCount = 3; 2791 gp_ci.pStages = shaderStages; 2792 gp_ci.pVertexInputState = NULL; 2793 gp_ci.pInputAssemblyState = &iaCI; 2794 gp_ci.pTessellationState = &tsCI; 2795 gp_ci.pViewportState = NULL; 2796 gp_ci.pRasterizationState = NULL; 2797 gp_ci.pMultisampleState = NULL; 2798 gp_ci.pDepthStencilState = NULL; 2799 gp_ci.pColorBlendState = NULL; 2800 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT; 2801 gp_ci.layout = pipeline_layout; 2802 gp_ci.renderPass = renderPass(); 2803 2804 VkPipelineCacheCreateInfo pc_ci = {}; 2805 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; 2806 pc_ci.pNext = NULL; 2807 pc_ci.initialSize = 0; 2808 pc_ci.initialData = 0; 2809 pc_ci.maxSize = 0; 2810 2811 VkPipeline pipeline; 2812 VkPipelineCache pipelineCache; 2813 2814 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, 2815 &pipelineCache); 2816 ASSERT_VK_SUCCESS(err); 2817 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, 2818 &gp_ci, NULL, &pipeline); 2819 2820 if (!m_errorMonitor->DesiredMsgFound()) { 2821 FAIL() << "Did not receive Error 'Invalid Pipeline CreateInfo State: 2822 VK_PRIMITIVE_TOPOLOGY_PATCH primitive...'"; 2823 m_errorMonitor->DumpFailureMsgs(); 2824 } 2825 2826 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL); 2827 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); 2828 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 2829 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 2830 } 2831 */ 2832 // Set scissor and viewport counts to different numbers 2833 TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) { 2834 // Attempt to Create Gfx Pipeline w/o a VS 2835 VkResult err; 2836 2837 m_errorMonitor->SetDesiredFailureMsg( 2838 VK_DEBUG_REPORT_ERROR_BIT_EXT, 2839 "Gfx Pipeline viewport count (1) must match scissor count (0)."); 2840 2841 ASSERT_NO_FATAL_FAILURE(InitState()); 2842 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 2843 2844 VkDescriptorPoolSize ds_type_count = {}; 2845 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 2846 ds_type_count.descriptorCount = 1; 2847 2848 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 2849 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 2850 ds_pool_ci.maxSets = 1; 2851 ds_pool_ci.poolSizeCount = 1; 2852 ds_pool_ci.pPoolSizes = &ds_type_count; 2853 2854 VkDescriptorPool ds_pool; 2855 err = 2856 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 2857 ASSERT_VK_SUCCESS(err); 2858 2859 VkDescriptorSetLayoutBinding dsl_binding = {}; 2860 dsl_binding.binding = 0; 2861 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 2862 dsl_binding.descriptorCount = 1; 2863 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 2864 2865 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 2866 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 2867 ds_layout_ci.bindingCount = 1; 2868 ds_layout_ci.pBindings = &dsl_binding; 2869 2870 VkDescriptorSetLayout ds_layout; 2871 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 2872 &ds_layout); 2873 ASSERT_VK_SUCCESS(err); 2874 2875 VkDescriptorSet descriptorSet; 2876 VkDescriptorSetAllocateInfo alloc_info = {}; 2877 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 2878 alloc_info.descriptorSetCount = 1; 2879 alloc_info.descriptorPool = ds_pool; 2880 alloc_info.pSetLayouts = &ds_layout; 2881 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 2882 &descriptorSet); 2883 ASSERT_VK_SUCCESS(err); 2884 2885 VkPipelineLayoutCreateInfo pipeline_layout_ci = {}; 2886 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 2887 pipeline_layout_ci.setLayoutCount = 1; 2888 pipeline_layout_ci.pSetLayouts = &ds_layout; 2889 2890 VkPipelineLayout pipeline_layout; 2891 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 2892 &pipeline_layout); 2893 ASSERT_VK_SUCCESS(err); 2894 2895 VkViewport vp = {}; // Just need dummy vp to point to 2896 2897 VkPipelineViewportStateCreateInfo vp_state_ci = {}; 2898 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; 2899 vp_state_ci.scissorCount = 0; 2900 vp_state_ci.viewportCount = 1; // Count mismatch should cause error 2901 vp_state_ci.pViewports = &vp; 2902 2903 VkPipelineRasterizationStateCreateInfo rs_state_ci = {}; 2904 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; 2905 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL; 2906 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT; 2907 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; 2908 rs_state_ci.depthClampEnable = VK_FALSE; 2909 rs_state_ci.rasterizerDiscardEnable = VK_FALSE; 2910 rs_state_ci.depthBiasEnable = VK_FALSE; 2911 2912 VkPipelineShaderStageCreateInfo shaderStages[2]; 2913 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo)); 2914 2915 VkShaderObj vs(m_device, bindStateVertShaderText, 2916 VK_SHADER_STAGE_VERTEX_BIT, this); 2917 VkShaderObj fs(m_device, bindStateFragShaderText, 2918 VK_SHADER_STAGE_FRAGMENT_BIT, 2919 this); // TODO - We shouldn't need a fragment shader 2920 // but add it to be able to run on more devices 2921 shaderStages[0] = vs.GetStageCreateInfo(); 2922 shaderStages[1] = fs.GetStageCreateInfo(); 2923 2924 VkGraphicsPipelineCreateInfo gp_ci = {}; 2925 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; 2926 gp_ci.stageCount = 2; 2927 gp_ci.pStages = shaderStages; 2928 gp_ci.pViewportState = &vp_state_ci; 2929 gp_ci.pRasterizationState = &rs_state_ci; 2930 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT; 2931 gp_ci.layout = pipeline_layout; 2932 gp_ci.renderPass = renderPass(); 2933 2934 VkPipelineCacheCreateInfo pc_ci = {}; 2935 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; 2936 2937 VkPipeline pipeline; 2938 VkPipelineCache pipelineCache; 2939 2940 err = 2941 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache); 2942 ASSERT_VK_SUCCESS(err); 2943 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, 2944 &gp_ci, NULL, &pipeline); 2945 2946 if (!m_errorMonitor->DesiredMsgFound()) { 2947 FAIL() << "Did not receive Error 'Gfx Pipeline viewport count (1) must " 2948 "match scissor count (0).'"; 2949 m_errorMonitor->DumpFailureMsgs(); 2950 } 2951 2952 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL); 2953 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); 2954 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 2955 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 2956 } 2957 // Don't set viewport state in PSO. This is an error b/c we always need this 2958 // state 2959 // for the counts even if the data is going to be set dynamically. 2960 TEST_F(VkLayerTest, PSOViewportStateNotSet) { 2961 // Attempt to Create Gfx Pipeline w/o a VS 2962 VkResult err; 2963 2964 m_errorMonitor->SetDesiredFailureMsg( 2965 VK_DEBUG_REPORT_ERROR_BIT_EXT, 2966 "Gfx Pipeline pViewportState is null. Even if "); 2967 2968 ASSERT_NO_FATAL_FAILURE(InitState()); 2969 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 2970 2971 VkDescriptorPoolSize ds_type_count = {}; 2972 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 2973 ds_type_count.descriptorCount = 1; 2974 2975 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 2976 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 2977 ds_pool_ci.maxSets = 1; 2978 ds_pool_ci.poolSizeCount = 1; 2979 ds_pool_ci.pPoolSizes = &ds_type_count; 2980 2981 VkDescriptorPool ds_pool; 2982 err = 2983 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 2984 ASSERT_VK_SUCCESS(err); 2985 2986 VkDescriptorSetLayoutBinding dsl_binding = {}; 2987 dsl_binding.binding = 0; 2988 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 2989 dsl_binding.descriptorCount = 1; 2990 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 2991 2992 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 2993 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 2994 ds_layout_ci.bindingCount = 1; 2995 ds_layout_ci.pBindings = &dsl_binding; 2996 2997 VkDescriptorSetLayout ds_layout; 2998 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 2999 &ds_layout); 3000 ASSERT_VK_SUCCESS(err); 3001 3002 VkDescriptorSet descriptorSet; 3003 VkDescriptorSetAllocateInfo alloc_info = {}; 3004 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 3005 alloc_info.descriptorSetCount = 1; 3006 alloc_info.descriptorPool = ds_pool; 3007 alloc_info.pSetLayouts = &ds_layout; 3008 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 3009 &descriptorSet); 3010 ASSERT_VK_SUCCESS(err); 3011 3012 VkPipelineLayoutCreateInfo pipeline_layout_ci = {}; 3013 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 3014 pipeline_layout_ci.setLayoutCount = 1; 3015 pipeline_layout_ci.pSetLayouts = &ds_layout; 3016 3017 VkPipelineLayout pipeline_layout; 3018 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 3019 &pipeline_layout); 3020 ASSERT_VK_SUCCESS(err); 3021 3022 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR; 3023 // Set scissor as dynamic to avoid second error 3024 VkPipelineDynamicStateCreateInfo dyn_state_ci = {}; 3025 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; 3026 dyn_state_ci.dynamicStateCount = 1; 3027 dyn_state_ci.pDynamicStates = &sc_state; 3028 3029 VkPipelineShaderStageCreateInfo shaderStages[2]; 3030 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo)); 3031 3032 VkShaderObj vs(m_device, bindStateVertShaderText, 3033 VK_SHADER_STAGE_VERTEX_BIT, this); 3034 VkShaderObj fs(m_device, bindStateFragShaderText, 3035 VK_SHADER_STAGE_FRAGMENT_BIT, 3036 this); // TODO - We shouldn't need a fragment shader 3037 // but add it to be able to run on more devices 3038 shaderStages[0] = vs.GetStageCreateInfo(); 3039 shaderStages[1] = fs.GetStageCreateInfo(); 3040 3041 3042 VkPipelineRasterizationStateCreateInfo rs_state_ci = {}; 3043 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; 3044 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL; 3045 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT; 3046 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; 3047 rs_state_ci.depthClampEnable = VK_FALSE; 3048 rs_state_ci.rasterizerDiscardEnable = VK_FALSE; 3049 rs_state_ci.depthBiasEnable = VK_FALSE; 3050 3051 VkGraphicsPipelineCreateInfo gp_ci = {}; 3052 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; 3053 gp_ci.stageCount = 2; 3054 gp_ci.pStages = shaderStages; 3055 gp_ci.pRasterizationState = &rs_state_ci; 3056 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state 3057 // should cause validation error 3058 gp_ci.pDynamicState = &dyn_state_ci; 3059 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT; 3060 gp_ci.layout = pipeline_layout; 3061 gp_ci.renderPass = renderPass(); 3062 3063 VkPipelineCacheCreateInfo pc_ci = {}; 3064 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; 3065 3066 VkPipeline pipeline; 3067 VkPipelineCache pipelineCache; 3068 3069 err = 3070 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache); 3071 ASSERT_VK_SUCCESS(err); 3072 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, 3073 &gp_ci, NULL, &pipeline); 3074 3075 if (!m_errorMonitor->DesiredMsgFound()) { 3076 FAIL() << "Did not receive Error 'Gfx Pipeline pViewportState is null. " 3077 "Even if...'"; 3078 m_errorMonitor->DumpFailureMsgs(); 3079 } 3080 3081 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL); 3082 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); 3083 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 3084 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 3085 } 3086 // Create PSO w/o non-zero viewportCount but no viewport data 3087 // Then run second test where dynamic scissor count doesn't match PSO scissor 3088 // count 3089 TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) { 3090 VkResult err; 3091 3092 m_errorMonitor->SetDesiredFailureMsg( 3093 VK_DEBUG_REPORT_ERROR_BIT_EXT, 3094 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. "); 3095 3096 ASSERT_NO_FATAL_FAILURE(InitState()); 3097 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 3098 3099 VkDescriptorPoolSize ds_type_count = {}; 3100 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 3101 ds_type_count.descriptorCount = 1; 3102 3103 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 3104 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 3105 ds_pool_ci.maxSets = 1; 3106 ds_pool_ci.poolSizeCount = 1; 3107 ds_pool_ci.pPoolSizes = &ds_type_count; 3108 3109 VkDescriptorPool ds_pool; 3110 err = 3111 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 3112 ASSERT_VK_SUCCESS(err); 3113 3114 VkDescriptorSetLayoutBinding dsl_binding = {}; 3115 dsl_binding.binding = 0; 3116 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 3117 dsl_binding.descriptorCount = 1; 3118 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 3119 3120 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 3121 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 3122 ds_layout_ci.bindingCount = 1; 3123 ds_layout_ci.pBindings = &dsl_binding; 3124 3125 VkDescriptorSetLayout ds_layout; 3126 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 3127 &ds_layout); 3128 ASSERT_VK_SUCCESS(err); 3129 3130 VkDescriptorSet descriptorSet; 3131 VkDescriptorSetAllocateInfo alloc_info = {}; 3132 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 3133 alloc_info.descriptorSetCount = 1; 3134 alloc_info.descriptorPool = ds_pool; 3135 alloc_info.pSetLayouts = &ds_layout; 3136 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 3137 &descriptorSet); 3138 ASSERT_VK_SUCCESS(err); 3139 3140 VkPipelineLayoutCreateInfo pipeline_layout_ci = {}; 3141 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 3142 pipeline_layout_ci.setLayoutCount = 1; 3143 pipeline_layout_ci.pSetLayouts = &ds_layout; 3144 3145 VkPipelineLayout pipeline_layout; 3146 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 3147 &pipeline_layout); 3148 ASSERT_VK_SUCCESS(err); 3149 3150 VkPipelineViewportStateCreateInfo vp_state_ci = {}; 3151 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; 3152 vp_state_ci.viewportCount = 1; 3153 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error 3154 vp_state_ci.scissorCount = 1; 3155 vp_state_ci.pScissors = 3156 NULL; // Scissor is dynamic (below) so this won't cause error 3157 3158 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR; 3159 // Set scissor as dynamic to avoid that error 3160 VkPipelineDynamicStateCreateInfo dyn_state_ci = {}; 3161 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; 3162 dyn_state_ci.dynamicStateCount = 1; 3163 dyn_state_ci.pDynamicStates = &sc_state; 3164 3165 VkPipelineShaderStageCreateInfo shaderStages[2]; 3166 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo)); 3167 3168 VkShaderObj vs(m_device, bindStateVertShaderText, 3169 VK_SHADER_STAGE_VERTEX_BIT, this); 3170 VkShaderObj fs(m_device, bindStateFragShaderText, 3171 VK_SHADER_STAGE_FRAGMENT_BIT, 3172 this); // TODO - We shouldn't need a fragment shader 3173 // but add it to be able to run on more devices 3174 shaderStages[0] = vs.GetStageCreateInfo(); 3175 shaderStages[1] = fs.GetStageCreateInfo(); 3176 3177 VkPipelineVertexInputStateCreateInfo vi_ci = {}; 3178 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; 3179 vi_ci.pNext = nullptr; 3180 vi_ci.vertexBindingDescriptionCount = 0; 3181 vi_ci.pVertexBindingDescriptions = nullptr; 3182 vi_ci.vertexAttributeDescriptionCount = 0; 3183 vi_ci.pVertexAttributeDescriptions = nullptr; 3184 3185 VkPipelineInputAssemblyStateCreateInfo ia_ci = {}; 3186 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; 3187 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; 3188 3189 VkPipelineRasterizationStateCreateInfo rs_ci = {}; 3190 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; 3191 rs_ci.pNext = nullptr; 3192 3193 VkPipelineColorBlendStateCreateInfo cb_ci = {}; 3194 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; 3195 cb_ci.pNext = nullptr; 3196 3197 VkGraphicsPipelineCreateInfo gp_ci = {}; 3198 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; 3199 gp_ci.stageCount = 2; 3200 gp_ci.pStages = shaderStages; 3201 gp_ci.pVertexInputState = &vi_ci; 3202 gp_ci.pInputAssemblyState = &ia_ci; 3203 gp_ci.pViewportState = &vp_state_ci; 3204 gp_ci.pRasterizationState = &rs_ci; 3205 gp_ci.pColorBlendState = &cb_ci; 3206 gp_ci.pDynamicState = &dyn_state_ci; 3207 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT; 3208 gp_ci.layout = pipeline_layout; 3209 gp_ci.renderPass = renderPass(); 3210 3211 VkPipelineCacheCreateInfo pc_ci = {}; 3212 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; 3213 3214 VkPipeline pipeline; 3215 VkPipelineCache pipelineCache; 3216 3217 err = 3218 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache); 3219 ASSERT_VK_SUCCESS(err); 3220 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, 3221 &gp_ci, NULL, &pipeline); 3222 3223 if (!m_errorMonitor->DesiredMsgFound()) { 3224 FAIL() << "Did not recieve Error 'Gfx Pipeline viewportCount is 1, but " 3225 "pViewports is NULL...'"; 3226 m_errorMonitor->DumpFailureMsgs(); 3227 } 3228 3229 // Now hit second fail case where we set scissor w/ different count than PSO 3230 // First need to successfully create the PSO from above by setting 3231 // pViewports 3232 m_errorMonitor->SetDesiredFailureMsg( 3233 VK_DEBUG_REPORT_ERROR_BIT_EXT, 3234 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO " 3235 "scissorCount is 1. These counts must match."); 3236 3237 VkViewport vp = {}; // Just need dummy vp to point to 3238 vp_state_ci.pViewports = &vp; 3239 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, 3240 &gp_ci, NULL, &pipeline); 3241 ASSERT_VK_SUCCESS(err); 3242 BeginCommandBuffer(); 3243 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), 3244 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); 3245 VkRect2D scissors[2] = {}; // don't care about data 3246 // Count of 2 doesn't match PSO count of 1 3247 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors); 3248 Draw(1, 0, 0, 0); 3249 3250 if (!m_errorMonitor->DesiredMsgFound()) { 3251 FAIL() << "Did not receive Error 'Dynamic scissorCount from " 3252 "vkCmdSetScissor() is 2, but PSO scissorCount is 1...'"; 3253 m_errorMonitor->DumpFailureMsgs(); 3254 } 3255 3256 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL); 3257 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); 3258 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 3259 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 3260 } 3261 // Create PSO w/o non-zero scissorCount but no scissor data 3262 // Then run second test where dynamic viewportCount doesn't match PSO 3263 // viewportCount 3264 TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) { 3265 VkResult err; 3266 3267 m_errorMonitor->SetDesiredFailureMsg( 3268 VK_DEBUG_REPORT_ERROR_BIT_EXT, 3269 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. "); 3270 3271 ASSERT_NO_FATAL_FAILURE(InitState()); 3272 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 3273 3274 VkDescriptorPoolSize ds_type_count = {}; 3275 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 3276 ds_type_count.descriptorCount = 1; 3277 3278 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 3279 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 3280 ds_pool_ci.maxSets = 1; 3281 ds_pool_ci.poolSizeCount = 1; 3282 ds_pool_ci.pPoolSizes = &ds_type_count; 3283 3284 VkDescriptorPool ds_pool; 3285 err = 3286 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 3287 ASSERT_VK_SUCCESS(err); 3288 3289 VkDescriptorSetLayoutBinding dsl_binding = {}; 3290 dsl_binding.binding = 0; 3291 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 3292 dsl_binding.descriptorCount = 1; 3293 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 3294 3295 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 3296 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 3297 ds_layout_ci.bindingCount = 1; 3298 ds_layout_ci.pBindings = &dsl_binding; 3299 3300 VkDescriptorSetLayout ds_layout; 3301 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 3302 &ds_layout); 3303 ASSERT_VK_SUCCESS(err); 3304 3305 VkDescriptorSet descriptorSet; 3306 VkDescriptorSetAllocateInfo alloc_info = {}; 3307 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 3308 alloc_info.descriptorSetCount = 1; 3309 alloc_info.descriptorPool = ds_pool; 3310 alloc_info.pSetLayouts = &ds_layout; 3311 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 3312 &descriptorSet); 3313 ASSERT_VK_SUCCESS(err); 3314 3315 VkPipelineLayoutCreateInfo pipeline_layout_ci = {}; 3316 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 3317 pipeline_layout_ci.setLayoutCount = 1; 3318 pipeline_layout_ci.pSetLayouts = &ds_layout; 3319 3320 VkPipelineLayout pipeline_layout; 3321 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 3322 &pipeline_layout); 3323 ASSERT_VK_SUCCESS(err); 3324 3325 VkPipelineViewportStateCreateInfo vp_state_ci = {}; 3326 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; 3327 vp_state_ci.scissorCount = 1; 3328 vp_state_ci.pScissors = 3329 NULL; // Null scissor w/ count of 1 should cause error 3330 vp_state_ci.viewportCount = 1; 3331 vp_state_ci.pViewports = 3332 NULL; // vp is dynamic (below) so this won't cause error 3333 3334 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT; 3335 // Set scissor as dynamic to avoid that error 3336 VkPipelineDynamicStateCreateInfo dyn_state_ci = {}; 3337 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; 3338 dyn_state_ci.dynamicStateCount = 1; 3339 dyn_state_ci.pDynamicStates = &vp_state; 3340 3341 VkPipelineShaderStageCreateInfo shaderStages[2]; 3342 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo)); 3343 3344 VkShaderObj vs(m_device, bindStateVertShaderText, 3345 VK_SHADER_STAGE_VERTEX_BIT, this); 3346 VkShaderObj fs(m_device, bindStateFragShaderText, 3347 VK_SHADER_STAGE_FRAGMENT_BIT, 3348 this); // TODO - We shouldn't need a fragment shader 3349 // but add it to be able to run on more devices 3350 shaderStages[0] = vs.GetStageCreateInfo(); 3351 shaderStages[1] = fs.GetStageCreateInfo(); 3352 3353 VkPipelineVertexInputStateCreateInfo vi_ci = {}; 3354 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; 3355 vi_ci.pNext = nullptr; 3356 vi_ci.vertexBindingDescriptionCount = 0; 3357 vi_ci.pVertexBindingDescriptions = nullptr; 3358 vi_ci.vertexAttributeDescriptionCount = 0; 3359 vi_ci.pVertexAttributeDescriptions = nullptr; 3360 3361 VkPipelineInputAssemblyStateCreateInfo ia_ci = {}; 3362 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; 3363 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; 3364 3365 VkPipelineRasterizationStateCreateInfo rs_ci = {}; 3366 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; 3367 rs_ci.pNext = nullptr; 3368 3369 VkPipelineColorBlendStateCreateInfo cb_ci = {}; 3370 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; 3371 cb_ci.pNext = nullptr; 3372 3373 VkGraphicsPipelineCreateInfo gp_ci = {}; 3374 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; 3375 gp_ci.stageCount = 2; 3376 gp_ci.pStages = shaderStages; 3377 gp_ci.pVertexInputState = &vi_ci; 3378 gp_ci.pInputAssemblyState = &ia_ci; 3379 gp_ci.pViewportState = &vp_state_ci; 3380 gp_ci.pRasterizationState = &rs_ci; 3381 gp_ci.pColorBlendState = &cb_ci; 3382 gp_ci.pDynamicState = &dyn_state_ci; 3383 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT; 3384 gp_ci.layout = pipeline_layout; 3385 gp_ci.renderPass = renderPass(); 3386 3387 VkPipelineCacheCreateInfo pc_ci = {}; 3388 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; 3389 3390 VkPipeline pipeline; 3391 VkPipelineCache pipelineCache; 3392 3393 err = 3394 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache); 3395 ASSERT_VK_SUCCESS(err); 3396 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, 3397 &gp_ci, NULL, &pipeline); 3398 3399 if (!m_errorMonitor->DesiredMsgFound()) { 3400 FAIL() << "Did not recieve Error 'Gfx Pipeline scissorCount is 1, but " 3401 "pScissors is NULL...'"; 3402 m_errorMonitor->DumpFailureMsgs(); 3403 } 3404 3405 // Now hit second fail case where we set scissor w/ different count than PSO 3406 // First need to successfully create the PSO from above by setting 3407 // pViewports 3408 m_errorMonitor->SetDesiredFailureMsg( 3409 VK_DEBUG_REPORT_ERROR_BIT_EXT, 3410 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO " 3411 "viewportCount is 1. These counts must match."); 3412 3413 VkRect2D sc = {}; // Just need dummy vp to point to 3414 vp_state_ci.pScissors = ≻ 3415 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, 3416 &gp_ci, NULL, &pipeline); 3417 ASSERT_VK_SUCCESS(err); 3418 BeginCommandBuffer(); 3419 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), 3420 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); 3421 VkViewport viewports[2] = {}; // don't care about data 3422 // Count of 2 doesn't match PSO count of 1 3423 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports); 3424 Draw(1, 0, 0, 0); 3425 3426 if (!m_errorMonitor->DesiredMsgFound()) { 3427 FAIL() << "Did not receive Error 'Dynamic viewportCount from " 3428 "vkCmdSetViewport() is 2, but PSO viewportCount is 1...'"; 3429 m_errorMonitor->DumpFailureMsgs(); 3430 } 3431 3432 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL); 3433 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); 3434 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 3435 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 3436 } 3437 3438 TEST_F(VkLayerTest, NullRenderPass) { 3439 // Bind a NULL RenderPass 3440 m_errorMonitor->SetDesiredFailureMsg( 3441 VK_DEBUG_REPORT_ERROR_BIT_EXT, 3442 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()"); 3443 3444 ASSERT_NO_FATAL_FAILURE(InitState()); 3445 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 3446 3447 BeginCommandBuffer(); 3448 // Don't care about RenderPass handle b/c error should be flagged before 3449 // that 3450 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, 3451 VK_SUBPASS_CONTENTS_INLINE); 3452 3453 if (!m_errorMonitor->DesiredMsgFound()) { 3454 FAIL() << "Did not receive Error 'You cannot use a NULL RenderPass " 3455 "object in vkCmdBeginRenderPass()'"; 3456 m_errorMonitor->DumpFailureMsgs(); 3457 } 3458 } 3459 3460 TEST_F(VkLayerTest, RenderPassWithinRenderPass) { 3461 // Bind a BeginRenderPass within an active RenderPass 3462 m_errorMonitor->SetDesiredFailureMsg( 3463 VK_DEBUG_REPORT_ERROR_BIT_EXT, 3464 "It is invalid to issue this call inside an active render pass"); 3465 3466 ASSERT_NO_FATAL_FAILURE(InitState()); 3467 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 3468 3469 BeginCommandBuffer(); 3470 // Just create a dummy Renderpass that's non-NULL so we can get to the 3471 // proper error 3472 VkRenderPassBeginInfo rp_begin = {}; 3473 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; 3474 rp_begin.pNext = NULL; 3475 rp_begin.renderPass = renderPass(); 3476 rp_begin.framebuffer = framebuffer(); 3477 3478 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, 3479 VK_SUBPASS_CONTENTS_INLINE); 3480 3481 if (!m_errorMonitor->DesiredMsgFound()) { 3482 FAIL() << "Did not receive Error 'It is invalid to issue this call " 3483 "inside an active render pass...'"; 3484 m_errorMonitor->DumpFailureMsgs(); 3485 } 3486 } 3487 3488 TEST_F(VkLayerTest, FillBufferWithinRenderPass) { 3489 // Call CmdFillBuffer within an active renderpass 3490 m_errorMonitor->SetDesiredFailureMsg( 3491 VK_DEBUG_REPORT_ERROR_BIT_EXT, 3492 "It is invalid to issue this call inside an active render pass"); 3493 3494 ASSERT_NO_FATAL_FAILURE(InitState()); 3495 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 3496 3497 // Renderpass is started here 3498 BeginCommandBuffer(); 3499 3500 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; 3501 vk_testing::Buffer dstBuffer; 3502 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs); 3503 3504 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111); 3505 3506 if (!m_errorMonitor->DesiredMsgFound()) { 3507 FAIL() << "Did not receive Error 'It is invalid to issue this call " 3508 "inside an active render pass...'"; 3509 m_errorMonitor->DumpFailureMsgs(); 3510 } 3511 } 3512 3513 TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) { 3514 // Call CmdUpdateBuffer within an active renderpass 3515 m_errorMonitor->SetDesiredFailureMsg( 3516 VK_DEBUG_REPORT_ERROR_BIT_EXT, 3517 "It is invalid to issue this call inside an active render pass"); 3518 3519 ASSERT_NO_FATAL_FAILURE(InitState()); 3520 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 3521 3522 // Renderpass is started here 3523 BeginCommandBuffer(); 3524 3525 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; 3526 vk_testing::Buffer dstBuffer; 3527 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs); 3528 3529 VkDeviceSize dstOffset = 0; 3530 VkDeviceSize dataSize = 1024; 3531 const uint32_t *pData = NULL; 3532 3533 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), 3534 dstOffset, dataSize, pData); 3535 3536 if (!m_errorMonitor->DesiredMsgFound()) { 3537 FAIL() << "Did not receive Error 'It is invalid to issue this call " 3538 "inside an active render pass...'"; 3539 m_errorMonitor->DumpFailureMsgs(); 3540 } 3541 } 3542 3543 TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) { 3544 // Call CmdClearColorImage within an active RenderPass 3545 m_errorMonitor->SetDesiredFailureMsg( 3546 VK_DEBUG_REPORT_ERROR_BIT_EXT, 3547 "It is invalid to issue this call inside an active render pass"); 3548 3549 ASSERT_NO_FATAL_FAILURE(InitState()); 3550 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 3551 3552 // Renderpass is started here 3553 BeginCommandBuffer(); 3554 3555 VkClearColorValue clear_color; 3556 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4); 3557 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; 3558 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM; 3559 const int32_t tex_width = 32; 3560 const int32_t tex_height = 32; 3561 VkImageCreateInfo image_create_info = {}; 3562 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 3563 image_create_info.pNext = NULL; 3564 image_create_info.imageType = VK_IMAGE_TYPE_2D; 3565 image_create_info.format = tex_format; 3566 image_create_info.extent.width = tex_width; 3567 image_create_info.extent.height = tex_height; 3568 image_create_info.extent.depth = 1; 3569 image_create_info.mipLevels = 1; 3570 image_create_info.arrayLayers = 1; 3571 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 3572 image_create_info.tiling = VK_IMAGE_TILING_LINEAR; 3573 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT; 3574 3575 vk_testing::Image dstImage; 3576 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, 3577 reqs); 3578 3579 const VkImageSubresourceRange range = vk_testing::Image::subresource_range( 3580 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT); 3581 3582 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), 3583 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range); 3584 3585 if (!m_errorMonitor->DesiredMsgFound()) { 3586 FAIL() << "Did not receive Error 'It is invalid to issue this call " 3587 "inside an active render pass...'"; 3588 m_errorMonitor->DumpFailureMsgs(); 3589 } 3590 } 3591 3592 TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) { 3593 // Call CmdClearDepthStencilImage within an active RenderPass 3594 m_errorMonitor->SetDesiredFailureMsg( 3595 VK_DEBUG_REPORT_ERROR_BIT_EXT, 3596 "It is invalid to issue this call inside an active render pass"); 3597 3598 ASSERT_NO_FATAL_FAILURE(InitState()); 3599 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 3600 3601 // Renderpass is started here 3602 BeginCommandBuffer(); 3603 3604 VkClearDepthStencilValue clear_value = {0}; 3605 VkMemoryPropertyFlags reqs = 0; 3606 VkImageCreateInfo image_create_info = vk_testing::Image::create_info(); 3607 image_create_info.imageType = VK_IMAGE_TYPE_2D; 3608 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT; 3609 image_create_info.extent.width = 64; 3610 image_create_info.extent.height = 64; 3611 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL; 3612 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; 3613 3614 vk_testing::Image dstImage; 3615 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, 3616 reqs); 3617 3618 const VkImageSubresourceRange range = vk_testing::Image::subresource_range( 3619 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT); 3620 3621 vkCmdClearDepthStencilImage( 3622 m_commandBuffer->GetBufferHandle(), dstImage.handle(), 3623 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1, 3624 &range); 3625 3626 if (!m_errorMonitor->DesiredMsgFound()) { 3627 FAIL() << "Did not receive Error 'It is invalid to issue this call " 3628 "inside an active render pass...'"; 3629 m_errorMonitor->DumpFailureMsgs(); 3630 } 3631 } 3632 3633 TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) { 3634 // Call CmdClearAttachmentss outside of an active RenderPass 3635 VkResult err; 3636 3637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 3638 "vkCmdClearAttachments: This call " 3639 "must be issued inside an active " 3640 "render pass"); 3641 3642 ASSERT_NO_FATAL_FAILURE(InitState()); 3643 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 3644 3645 // Start no RenderPass 3646 err = m_commandBuffer->BeginCommandBuffer(); 3647 ASSERT_VK_SUCCESS(err); 3648 3649 VkClearAttachment color_attachment; 3650 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 3651 color_attachment.clearValue.color.float32[0] = 0; 3652 color_attachment.clearValue.color.float32[1] = 0; 3653 color_attachment.clearValue.color.float32[2] = 0; 3654 color_attachment.clearValue.color.float32[3] = 0; 3655 color_attachment.colorAttachment = 0; 3656 VkClearRect clear_rect = {{{0, 0}, {32, 32}}}; 3657 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, 3658 &color_attachment, 1, &clear_rect); 3659 3660 if (!m_errorMonitor->DesiredMsgFound()) { 3661 FAIL() << "Did not receive Error 'vkCmdClearAttachments: This call " 3662 "must be issued inside an active render pass.'"; 3663 m_errorMonitor->DumpFailureMsgs(); 3664 } 3665 } 3666 3667 TEST_F(VkLayerTest, InvalidDynamicStateObject) { 3668 // Create a valid cmd buffer 3669 // call vkCmdBindDynamicStateObject w/ false DS Obj 3670 // TODO : Simple check for bad object should be added to ObjectTracker to 3671 // catch this case 3672 // The DS check for this is after driver has been called to validate DS 3673 // internal data struct 3674 } 3675 3676 TEST_F(VkLayerTest, IdxBufferAlignmentError) { 3677 // Bind a BeginRenderPass within an active RenderPass 3678 VkResult err; 3679 3680 m_errorMonitor->SetDesiredFailureMsg( 3681 VK_DEBUG_REPORT_ERROR_BIT_EXT, 3682 "vkCmdBindIndexBuffer() offset (0x7) does not fall on "); 3683 3684 ASSERT_NO_FATAL_FAILURE(InitState()); 3685 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 3686 uint32_t qfi = 0; 3687 VkBufferCreateInfo buffCI = {}; 3688 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; 3689 buffCI.size = 1024; 3690 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT; 3691 buffCI.queueFamilyIndexCount = 1; 3692 buffCI.pQueueFamilyIndices = &qfi; 3693 3694 VkBuffer ib; 3695 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib); 3696 ASSERT_VK_SUCCESS(err); 3697 3698 BeginCommandBuffer(); 3699 ASSERT_VK_SUCCESS(err); 3700 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), 3701 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle()); 3702 // Should error before calling to driver so don't care about actual data 3703 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7, 3704 VK_INDEX_TYPE_UINT16); 3705 3706 if (!m_errorMonitor->DesiredMsgFound()) { 3707 FAIL() << "Did not receive Error 'vkCmdBindIndexBuffer() offset (0x7) " 3708 "does not fall on ...'"; 3709 m_errorMonitor->DumpFailureMsgs(); 3710 } 3711 3712 vkDestroyBuffer(m_device->device(), ib, NULL); 3713 } 3714 3715 TEST_F(VkLayerTest, InvalidQueueFamilyIndex) { 3716 // Create an out-of-range queueFamilyIndex 3717 m_errorMonitor->SetDesiredFailureMsg( 3718 VK_DEBUG_REPORT_ERROR_BIT_EXT, 3719 "vkCreateBuffer has QueueFamilyIndex greater than"); 3720 3721 ASSERT_NO_FATAL_FAILURE(InitState()); 3722 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 3723 VkBufferCreateInfo buffCI = {}; 3724 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; 3725 buffCI.size = 1024; 3726 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT; 3727 buffCI.queueFamilyIndexCount = 1; 3728 // Introduce failure by specifying invalid queue_family_index 3729 uint32_t qfi = 777; 3730 buffCI.pQueueFamilyIndices = &qfi; 3731 3732 VkBuffer ib; 3733 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib); 3734 3735 if (!m_errorMonitor->DesiredMsgFound()) { 3736 FAIL() << "Did not receive Error 'vkCreateBuffer() has " 3737 "QueueFamilyIndex greater than...'"; 3738 m_errorMonitor->DumpFailureMsgs(); 3739 } 3740 } 3741 3742 TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) { 3743 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be 3744 // secondary) 3745 3746 m_errorMonitor->SetDesiredFailureMsg( 3747 VK_DEBUG_REPORT_ERROR_BIT_EXT, 3748 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer "); 3749 3750 ASSERT_NO_FATAL_FAILURE(InitState()); 3751 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 3752 3753 BeginCommandBuffer(); 3754 // ASSERT_VK_SUCCESS(err); 3755 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle(); 3756 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB); 3757 3758 if (!m_errorMonitor->DesiredMsgFound()) { 3759 FAIL() << "Did not receive Error 'vkCmdExecuteCommands() called w/ " 3760 "Primary Cmd Buffer '"; 3761 m_errorMonitor->DumpFailureMsgs(); 3762 } 3763 } 3764 3765 TEST_F(VkLayerTest, DSTypeMismatch) { 3766 // Create DS w/ layout of one type and attempt Update w/ mis-matched type 3767 VkResult err; 3768 3769 m_errorMonitor->SetDesiredFailureMsg( 3770 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor " 3771 "type VK_DESCRIPTOR_TYPE_SAMPLER that " 3772 "does not match "); 3773 3774 ASSERT_NO_FATAL_FAILURE(InitState()); 3775 // VkDescriptorSetObj descriptorSet(m_device); 3776 VkDescriptorPoolSize ds_type_count = {}; 3777 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 3778 ds_type_count.descriptorCount = 1; 3779 3780 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 3781 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 3782 ds_pool_ci.pNext = NULL; 3783 ds_pool_ci.maxSets = 1; 3784 ds_pool_ci.poolSizeCount = 1; 3785 ds_pool_ci.pPoolSizes = &ds_type_count; 3786 3787 VkDescriptorPool ds_pool; 3788 err = 3789 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 3790 ASSERT_VK_SUCCESS(err); 3791 VkDescriptorSetLayoutBinding dsl_binding = {}; 3792 dsl_binding.binding = 0; 3793 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 3794 dsl_binding.descriptorCount = 1; 3795 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 3796 dsl_binding.pImmutableSamplers = NULL; 3797 3798 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 3799 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 3800 ds_layout_ci.pNext = NULL; 3801 ds_layout_ci.bindingCount = 1; 3802 ds_layout_ci.pBindings = &dsl_binding; 3803 3804 VkDescriptorSetLayout ds_layout; 3805 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 3806 &ds_layout); 3807 ASSERT_VK_SUCCESS(err); 3808 3809 VkDescriptorSet descriptorSet; 3810 VkDescriptorSetAllocateInfo alloc_info = {}; 3811 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 3812 alloc_info.descriptorSetCount = 1; 3813 alloc_info.descriptorPool = ds_pool; 3814 alloc_info.pSetLayouts = &ds_layout; 3815 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 3816 &descriptorSet); 3817 ASSERT_VK_SUCCESS(err); 3818 3819 VkSamplerCreateInfo sampler_ci = {}; 3820 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; 3821 sampler_ci.pNext = NULL; 3822 sampler_ci.magFilter = VK_FILTER_NEAREST; 3823 sampler_ci.minFilter = VK_FILTER_NEAREST; 3824 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; 3825 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 3826 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 3827 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 3828 sampler_ci.mipLodBias = 1.0; 3829 sampler_ci.anisotropyEnable = VK_FALSE; 3830 sampler_ci.maxAnisotropy = 1; 3831 sampler_ci.compareEnable = VK_FALSE; 3832 sampler_ci.compareOp = VK_COMPARE_OP_NEVER; 3833 sampler_ci.minLod = 1.0; 3834 sampler_ci.maxLod = 1.0; 3835 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE; 3836 sampler_ci.unnormalizedCoordinates = VK_FALSE; 3837 3838 VkSampler sampler; 3839 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler); 3840 ASSERT_VK_SUCCESS(err); 3841 3842 VkDescriptorImageInfo info = {}; 3843 info.sampler = sampler; 3844 3845 VkWriteDescriptorSet descriptor_write; 3846 memset(&descriptor_write, 0, sizeof(descriptor_write)); 3847 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; 3848 descriptor_write.dstSet = descriptorSet; 3849 descriptor_write.descriptorCount = 1; 3850 // This is a mismatched type for the layout which expects BUFFER 3851 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER; 3852 descriptor_write.pImageInfo = &info; 3853 3854 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL); 3855 3856 if (!m_errorMonitor->DesiredMsgFound()) { 3857 FAIL() << "Did not receive Error 'Write descriptor update has " 3858 "descriptor type VK_DESCRIPTOR_TYPE_SAMPLER that does not " 3859 "match...'"; 3860 m_errorMonitor->DumpFailureMsgs(); 3861 } 3862 3863 vkDestroySampler(m_device->device(), sampler, NULL); 3864 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 3865 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 3866 } 3867 3868 TEST_F(VkLayerTest, DSUpdateOutOfBounds) { 3869 // For overlapping Update, have arrayIndex exceed that of layout 3870 VkResult err; 3871 3872 m_errorMonitor->SetDesiredFailureMsg( 3873 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of " 3874 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET " 3875 "is out of bounds for matching binding"); 3876 3877 ASSERT_NO_FATAL_FAILURE(InitState()); 3878 // VkDescriptorSetObj descriptorSet(m_device); 3879 VkDescriptorPoolSize ds_type_count = {}; 3880 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 3881 ds_type_count.descriptorCount = 1; 3882 3883 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 3884 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 3885 ds_pool_ci.pNext = NULL; 3886 ds_pool_ci.maxSets = 1; 3887 ds_pool_ci.poolSizeCount = 1; 3888 ds_pool_ci.pPoolSizes = &ds_type_count; 3889 3890 VkDescriptorPool ds_pool; 3891 err = 3892 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 3893 ASSERT_VK_SUCCESS(err); 3894 3895 VkDescriptorSetLayoutBinding dsl_binding = {}; 3896 dsl_binding.binding = 0; 3897 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 3898 dsl_binding.descriptorCount = 1; 3899 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 3900 dsl_binding.pImmutableSamplers = NULL; 3901 3902 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 3903 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 3904 ds_layout_ci.pNext = NULL; 3905 ds_layout_ci.bindingCount = 1; 3906 ds_layout_ci.pBindings = &dsl_binding; 3907 3908 VkDescriptorSetLayout ds_layout; 3909 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 3910 &ds_layout); 3911 ASSERT_VK_SUCCESS(err); 3912 3913 VkDescriptorSet descriptorSet; 3914 VkDescriptorSetAllocateInfo alloc_info = {}; 3915 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 3916 alloc_info.descriptorSetCount = 1; 3917 alloc_info.descriptorPool = ds_pool; 3918 alloc_info.pSetLayouts = &ds_layout; 3919 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 3920 &descriptorSet); 3921 ASSERT_VK_SUCCESS(err); 3922 3923 VkSamplerCreateInfo sampler_ci = {}; 3924 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; 3925 sampler_ci.pNext = NULL; 3926 sampler_ci.magFilter = VK_FILTER_NEAREST; 3927 sampler_ci.minFilter = VK_FILTER_NEAREST; 3928 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; 3929 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 3930 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 3931 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 3932 sampler_ci.mipLodBias = 1.0; 3933 sampler_ci.anisotropyEnable = VK_FALSE; 3934 sampler_ci.maxAnisotropy = 1; 3935 sampler_ci.compareEnable = VK_FALSE; 3936 sampler_ci.compareOp = VK_COMPARE_OP_NEVER; 3937 sampler_ci.minLod = 1.0; 3938 sampler_ci.maxLod = 1.0; 3939 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE; 3940 sampler_ci.unnormalizedCoordinates = VK_FALSE; 3941 3942 VkSampler sampler; 3943 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler); 3944 ASSERT_VK_SUCCESS(err); 3945 3946 VkDescriptorImageInfo info = {}; 3947 info.sampler = sampler; 3948 3949 VkWriteDescriptorSet descriptor_write; 3950 memset(&descriptor_write, 0, sizeof(descriptor_write)); 3951 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; 3952 descriptor_write.dstSet = descriptorSet; 3953 descriptor_write.dstArrayElement = 3954 1; /* This index out of bounds for the update */ 3955 descriptor_write.descriptorCount = 1; 3956 // This is the wrong type, but out of bounds will be flagged first 3957 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER; 3958 descriptor_write.pImageInfo = &info; 3959 3960 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL); 3961 3962 if (!m_errorMonitor->DesiredMsgFound()) { 3963 FAIL() << "Did not receive Error 'Descriptor update type of " 3964 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET is out of bounds for " 3965 "matching binding...'"; 3966 m_errorMonitor->DumpFailureMsgs(); 3967 } 3968 3969 vkDestroySampler(m_device->device(), sampler, NULL); 3970 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 3971 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 3972 } 3973 3974 TEST_F(VkLayerTest, InvalidDSUpdateIndex) { 3975 // Create layout w/ count of 1 and attempt update to that layout w/ binding 3976 // index 2 3977 VkResult err; 3978 3979 m_errorMonitor->SetDesiredFailureMsg( 3980 VK_DEBUG_REPORT_ERROR_BIT_EXT, 3981 " does not have binding to match update binding "); 3982 3983 ASSERT_NO_FATAL_FAILURE(InitState()); 3984 // VkDescriptorSetObj descriptorSet(m_device); 3985 VkDescriptorPoolSize ds_type_count = {}; 3986 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 3987 ds_type_count.descriptorCount = 1; 3988 3989 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 3990 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 3991 ds_pool_ci.pNext = NULL; 3992 ds_pool_ci.maxSets = 1; 3993 ds_pool_ci.poolSizeCount = 1; 3994 ds_pool_ci.pPoolSizes = &ds_type_count; 3995 3996 VkDescriptorPool ds_pool; 3997 err = 3998 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 3999 ASSERT_VK_SUCCESS(err); 4000 4001 VkDescriptorSetLayoutBinding dsl_binding = {}; 4002 dsl_binding.binding = 0; 4003 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 4004 dsl_binding.descriptorCount = 1; 4005 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 4006 dsl_binding.pImmutableSamplers = NULL; 4007 4008 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 4009 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 4010 ds_layout_ci.pNext = NULL; 4011 ds_layout_ci.bindingCount = 1; 4012 ds_layout_ci.pBindings = &dsl_binding; 4013 VkDescriptorSetLayout ds_layout; 4014 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 4015 &ds_layout); 4016 ASSERT_VK_SUCCESS(err); 4017 4018 VkDescriptorSet descriptorSet; 4019 VkDescriptorSetAllocateInfo alloc_info = {}; 4020 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 4021 alloc_info.descriptorSetCount = 1; 4022 alloc_info.descriptorPool = ds_pool; 4023 alloc_info.pSetLayouts = &ds_layout; 4024 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 4025 &descriptorSet); 4026 ASSERT_VK_SUCCESS(err); 4027 4028 VkSamplerCreateInfo sampler_ci = {}; 4029 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; 4030 sampler_ci.pNext = NULL; 4031 sampler_ci.magFilter = VK_FILTER_NEAREST; 4032 sampler_ci.minFilter = VK_FILTER_NEAREST; 4033 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; 4034 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 4035 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 4036 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 4037 sampler_ci.mipLodBias = 1.0; 4038 sampler_ci.anisotropyEnable = VK_FALSE; 4039 sampler_ci.maxAnisotropy = 1; 4040 sampler_ci.compareEnable = VK_FALSE; 4041 sampler_ci.compareOp = VK_COMPARE_OP_NEVER; 4042 sampler_ci.minLod = 1.0; 4043 sampler_ci.maxLod = 1.0; 4044 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE; 4045 sampler_ci.unnormalizedCoordinates = VK_FALSE; 4046 4047 VkSampler sampler; 4048 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler); 4049 ASSERT_VK_SUCCESS(err); 4050 4051 VkDescriptorImageInfo info = {}; 4052 info.sampler = sampler; 4053 4054 VkWriteDescriptorSet descriptor_write; 4055 memset(&descriptor_write, 0, sizeof(descriptor_write)); 4056 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; 4057 descriptor_write.dstSet = descriptorSet; 4058 descriptor_write.dstBinding = 2; 4059 descriptor_write.descriptorCount = 1; 4060 // This is the wrong type, but out of bounds will be flagged first 4061 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER; 4062 descriptor_write.pImageInfo = &info; 4063 4064 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL); 4065 4066 if (!m_errorMonitor->DesiredMsgFound()) { 4067 FAIL() << "Did not receive Error 'Descriptor Set <blah> does not have " 4068 "binding to match update binding '"; 4069 m_errorMonitor->DumpFailureMsgs(); 4070 } 4071 4072 vkDestroySampler(m_device->device(), sampler, NULL); 4073 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 4074 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 4075 } 4076 4077 TEST_F(VkLayerTest, InvalidDSUpdateStruct) { 4078 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_* 4079 // types 4080 VkResult err; 4081 4082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 4083 "Unexpected UPDATE struct of type "); 4084 4085 ASSERT_NO_FATAL_FAILURE(InitState()); 4086 4087 VkDescriptorPoolSize ds_type_count = {}; 4088 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 4089 ds_type_count.descriptorCount = 1; 4090 4091 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 4092 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 4093 ds_pool_ci.pNext = NULL; 4094 ds_pool_ci.maxSets = 1; 4095 ds_pool_ci.poolSizeCount = 1; 4096 ds_pool_ci.pPoolSizes = &ds_type_count; 4097 4098 VkDescriptorPool ds_pool; 4099 err = 4100 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 4101 ASSERT_VK_SUCCESS(err); 4102 VkDescriptorSetLayoutBinding dsl_binding = {}; 4103 dsl_binding.binding = 0; 4104 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 4105 dsl_binding.descriptorCount = 1; 4106 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 4107 dsl_binding.pImmutableSamplers = NULL; 4108 4109 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 4110 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 4111 ds_layout_ci.pNext = NULL; 4112 ds_layout_ci.bindingCount = 1; 4113 ds_layout_ci.pBindings = &dsl_binding; 4114 4115 VkDescriptorSetLayout ds_layout; 4116 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 4117 &ds_layout); 4118 ASSERT_VK_SUCCESS(err); 4119 4120 VkDescriptorSet descriptorSet; 4121 VkDescriptorSetAllocateInfo alloc_info = {}; 4122 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 4123 alloc_info.descriptorSetCount = 1; 4124 alloc_info.descriptorPool = ds_pool; 4125 alloc_info.pSetLayouts = &ds_layout; 4126 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 4127 &descriptorSet); 4128 ASSERT_VK_SUCCESS(err); 4129 4130 VkSamplerCreateInfo sampler_ci = {}; 4131 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; 4132 sampler_ci.pNext = NULL; 4133 sampler_ci.magFilter = VK_FILTER_NEAREST; 4134 sampler_ci.minFilter = VK_FILTER_NEAREST; 4135 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; 4136 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 4137 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 4138 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 4139 sampler_ci.mipLodBias = 1.0; 4140 sampler_ci.anisotropyEnable = VK_FALSE; 4141 sampler_ci.maxAnisotropy = 1; 4142 sampler_ci.compareEnable = VK_FALSE; 4143 sampler_ci.compareOp = VK_COMPARE_OP_NEVER; 4144 sampler_ci.minLod = 1.0; 4145 sampler_ci.maxLod = 1.0; 4146 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE; 4147 sampler_ci.unnormalizedCoordinates = VK_FALSE; 4148 VkSampler sampler; 4149 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler); 4150 ASSERT_VK_SUCCESS(err); 4151 4152 VkDescriptorImageInfo info = {}; 4153 info.sampler = sampler; 4154 4155 VkWriteDescriptorSet descriptor_write; 4156 memset(&descriptor_write, 0, sizeof(descriptor_write)); 4157 descriptor_write.sType = 4158 (VkStructureType)0x99999999; /* Intentionally broken struct type */ 4159 descriptor_write.dstSet = descriptorSet; 4160 descriptor_write.descriptorCount = 1; 4161 // This is the wrong type, but out of bounds will be flagged first 4162 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER; 4163 descriptor_write.pImageInfo = &info; 4164 4165 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL); 4166 4167 if (!m_errorMonitor->DesiredMsgFound()) { 4168 FAIL() << "Did not receive Error 'Unexpected UPDATE struct of type '"; 4169 m_errorMonitor->DumpFailureMsgs(); 4170 } 4171 4172 vkDestroySampler(m_device->device(), sampler, NULL); 4173 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 4174 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 4175 } 4176 4177 TEST_F(VkLayerTest, SampleDescriptorUpdateError) { 4178 // Create a single Sampler descriptor and send it an invalid Sampler 4179 VkResult err; 4180 4181 m_errorMonitor->SetDesiredFailureMsg( 4182 VK_DEBUG_REPORT_ERROR_BIT_EXT, 4183 "Attempt to update descriptor with invalid sampler 0xbaadbeef"); 4184 4185 ASSERT_NO_FATAL_FAILURE(InitState()); 4186 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied 4187 // code 4188 VkDescriptorPoolSize ds_type_count = {}; 4189 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER; 4190 ds_type_count.descriptorCount = 1; 4191 4192 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 4193 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 4194 ds_pool_ci.pNext = NULL; 4195 ds_pool_ci.maxSets = 1; 4196 ds_pool_ci.poolSizeCount = 1; 4197 ds_pool_ci.pPoolSizes = &ds_type_count; 4198 4199 VkDescriptorPool ds_pool; 4200 err = 4201 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 4202 ASSERT_VK_SUCCESS(err); 4203 4204 VkDescriptorSetLayoutBinding dsl_binding = {}; 4205 dsl_binding.binding = 0; 4206 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER; 4207 dsl_binding.descriptorCount = 1; 4208 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 4209 dsl_binding.pImmutableSamplers = NULL; 4210 4211 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 4212 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 4213 ds_layout_ci.pNext = NULL; 4214 ds_layout_ci.bindingCount = 1; 4215 ds_layout_ci.pBindings = &dsl_binding; 4216 VkDescriptorSetLayout ds_layout; 4217 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 4218 &ds_layout); 4219 ASSERT_VK_SUCCESS(err); 4220 4221 VkDescriptorSet descriptorSet; 4222 VkDescriptorSetAllocateInfo alloc_info = {}; 4223 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 4224 alloc_info.descriptorSetCount = 1; 4225 alloc_info.descriptorPool = ds_pool; 4226 alloc_info.pSetLayouts = &ds_layout; 4227 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 4228 &descriptorSet); 4229 ASSERT_VK_SUCCESS(err); 4230 4231 VkSampler sampler = 4232 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle 4233 4234 VkDescriptorImageInfo descriptor_info; 4235 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo)); 4236 descriptor_info.sampler = sampler; 4237 4238 VkWriteDescriptorSet descriptor_write; 4239 memset(&descriptor_write, 0, sizeof(descriptor_write)); 4240 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; 4241 descriptor_write.dstSet = descriptorSet; 4242 descriptor_write.dstBinding = 0; 4243 descriptor_write.descriptorCount = 1; 4244 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER; 4245 descriptor_write.pImageInfo = &descriptor_info; 4246 4247 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL); 4248 4249 if (!m_errorMonitor->DesiredMsgFound()) { 4250 FAIL() << "Did not receive Error 'Attempt to update descriptor with " 4251 "invalid sampler...'"; 4252 m_errorMonitor->DumpFailureMsgs(); 4253 } 4254 4255 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 4256 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 4257 } 4258 4259 TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) { 4260 // Create a single combined Image/Sampler descriptor and send it an invalid 4261 // imageView 4262 VkResult err; 4263 4264 m_errorMonitor->SetDesiredFailureMsg( 4265 VK_DEBUG_REPORT_ERROR_BIT_EXT, 4266 "Attempt to update descriptor with invalid imageView 0xbaadbeef"); 4267 4268 ASSERT_NO_FATAL_FAILURE(InitState()); 4269 VkDescriptorPoolSize ds_type_count = {}; 4270 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; 4271 ds_type_count.descriptorCount = 1; 4272 4273 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 4274 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 4275 ds_pool_ci.pNext = NULL; 4276 ds_pool_ci.maxSets = 1; 4277 ds_pool_ci.poolSizeCount = 1; 4278 ds_pool_ci.pPoolSizes = &ds_type_count; 4279 4280 VkDescriptorPool ds_pool; 4281 err = 4282 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 4283 ASSERT_VK_SUCCESS(err); 4284 4285 VkDescriptorSetLayoutBinding dsl_binding = {}; 4286 dsl_binding.binding = 0; 4287 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; 4288 dsl_binding.descriptorCount = 1; 4289 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 4290 dsl_binding.pImmutableSamplers = NULL; 4291 4292 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 4293 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 4294 ds_layout_ci.pNext = NULL; 4295 ds_layout_ci.bindingCount = 1; 4296 ds_layout_ci.pBindings = &dsl_binding; 4297 VkDescriptorSetLayout ds_layout; 4298 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 4299 &ds_layout); 4300 ASSERT_VK_SUCCESS(err); 4301 4302 VkDescriptorSet descriptorSet; 4303 VkDescriptorSetAllocateInfo alloc_info = {}; 4304 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 4305 alloc_info.descriptorSetCount = 1; 4306 alloc_info.descriptorPool = ds_pool; 4307 alloc_info.pSetLayouts = &ds_layout; 4308 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 4309 &descriptorSet); 4310 ASSERT_VK_SUCCESS(err); 4311 4312 VkSamplerCreateInfo sampler_ci = {}; 4313 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; 4314 sampler_ci.pNext = NULL; 4315 sampler_ci.magFilter = VK_FILTER_NEAREST; 4316 sampler_ci.minFilter = VK_FILTER_NEAREST; 4317 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; 4318 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 4319 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 4320 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 4321 sampler_ci.mipLodBias = 1.0; 4322 sampler_ci.anisotropyEnable = VK_FALSE; 4323 sampler_ci.maxAnisotropy = 1; 4324 sampler_ci.compareEnable = VK_FALSE; 4325 sampler_ci.compareOp = VK_COMPARE_OP_NEVER; 4326 sampler_ci.minLod = 1.0; 4327 sampler_ci.maxLod = 1.0; 4328 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE; 4329 sampler_ci.unnormalizedCoordinates = VK_FALSE; 4330 4331 VkSampler sampler; 4332 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler); 4333 ASSERT_VK_SUCCESS(err); 4334 4335 VkImageView view = 4336 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object 4337 4338 VkDescriptorImageInfo descriptor_info; 4339 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo)); 4340 descriptor_info.sampler = sampler; 4341 descriptor_info.imageView = view; 4342 4343 VkWriteDescriptorSet descriptor_write; 4344 memset(&descriptor_write, 0, sizeof(descriptor_write)); 4345 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; 4346 descriptor_write.dstSet = descriptorSet; 4347 descriptor_write.dstBinding = 0; 4348 descriptor_write.descriptorCount = 1; 4349 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; 4350 descriptor_write.pImageInfo = &descriptor_info; 4351 4352 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL); 4353 4354 if (!m_errorMonitor->DesiredMsgFound()) { 4355 FAIL() << "Did not receive Error 'Attempt to update descriptor with " 4356 "invalid imageView...'"; 4357 m_errorMonitor->DumpFailureMsgs(); 4358 } 4359 4360 vkDestroySampler(m_device->device(), sampler, NULL); 4361 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 4362 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 4363 } 4364 4365 TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) { 4366 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update 4367 // into the other 4368 VkResult err; 4369 4370 m_errorMonitor->SetDesiredFailureMsg( 4371 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Copy descriptor update index 0, update " 4372 "count #1, has src update descriptor " 4373 "type VK_DESCRIPTOR_TYPE_SAMPLER "); 4374 4375 ASSERT_NO_FATAL_FAILURE(InitState()); 4376 // VkDescriptorSetObj descriptorSet(m_device); 4377 VkDescriptorPoolSize ds_type_count[2] = {}; 4378 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 4379 ds_type_count[0].descriptorCount = 1; 4380 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER; 4381 ds_type_count[1].descriptorCount = 1; 4382 4383 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 4384 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 4385 ds_pool_ci.pNext = NULL; 4386 ds_pool_ci.maxSets = 1; 4387 ds_pool_ci.poolSizeCount = 2; 4388 ds_pool_ci.pPoolSizes = ds_type_count; 4389 4390 VkDescriptorPool ds_pool; 4391 err = 4392 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 4393 ASSERT_VK_SUCCESS(err); 4394 VkDescriptorSetLayoutBinding dsl_binding[2] = {}; 4395 dsl_binding[0].binding = 0; 4396 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 4397 dsl_binding[0].descriptorCount = 1; 4398 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL; 4399 dsl_binding[0].pImmutableSamplers = NULL; 4400 dsl_binding[1].binding = 1; 4401 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER; 4402 dsl_binding[1].descriptorCount = 1; 4403 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL; 4404 dsl_binding[1].pImmutableSamplers = NULL; 4405 4406 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 4407 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 4408 ds_layout_ci.pNext = NULL; 4409 ds_layout_ci.bindingCount = 2; 4410 ds_layout_ci.pBindings = dsl_binding; 4411 4412 VkDescriptorSetLayout ds_layout; 4413 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 4414 &ds_layout); 4415 ASSERT_VK_SUCCESS(err); 4416 4417 VkDescriptorSet descriptorSet; 4418 VkDescriptorSetAllocateInfo alloc_info = {}; 4419 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 4420 alloc_info.descriptorSetCount = 1; 4421 alloc_info.descriptorPool = ds_pool; 4422 alloc_info.pSetLayouts = &ds_layout; 4423 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 4424 &descriptorSet); 4425 ASSERT_VK_SUCCESS(err); 4426 4427 VkSamplerCreateInfo sampler_ci = {}; 4428 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; 4429 sampler_ci.pNext = NULL; 4430 sampler_ci.magFilter = VK_FILTER_NEAREST; 4431 sampler_ci.minFilter = VK_FILTER_NEAREST; 4432 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; 4433 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 4434 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 4435 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; 4436 sampler_ci.mipLodBias = 1.0; 4437 sampler_ci.anisotropyEnable = VK_FALSE; 4438 sampler_ci.maxAnisotropy = 1; 4439 sampler_ci.compareEnable = VK_FALSE; 4440 sampler_ci.compareOp = VK_COMPARE_OP_NEVER; 4441 sampler_ci.minLod = 1.0; 4442 sampler_ci.maxLod = 1.0; 4443 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE; 4444 sampler_ci.unnormalizedCoordinates = VK_FALSE; 4445 4446 VkSampler sampler; 4447 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler); 4448 ASSERT_VK_SUCCESS(err); 4449 4450 VkDescriptorImageInfo info = {}; 4451 info.sampler = sampler; 4452 4453 VkWriteDescriptorSet descriptor_write; 4454 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet)); 4455 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; 4456 descriptor_write.dstSet = descriptorSet; 4457 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above 4458 descriptor_write.descriptorCount = 1; 4459 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER; 4460 descriptor_write.pImageInfo = &info; 4461 // This write update should succeed 4462 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL); 4463 // Now perform a copy update that fails due to type mismatch 4464 VkCopyDescriptorSet copy_ds_update; 4465 memset(©_ds_update, 0, sizeof(VkCopyDescriptorSet)); 4466 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET; 4467 copy_ds_update.srcSet = descriptorSet; 4468 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding 4469 copy_ds_update.dstSet = descriptorSet; 4470 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding 4471 copy_ds_update.descriptorCount = 1; // copy 1 descriptor 4472 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, ©_ds_update); 4473 4474 if (!m_errorMonitor->DesiredMsgFound()) { 4475 FAIL() << "Did not receive Error 'Copy descriptor update index 0, " 4476 "update count #1, has src update descriptor " 4477 "type_DESCRIPTOR_TYPE_SAMPLER'"; 4478 m_errorMonitor->DumpFailureMsgs(); 4479 } 4480 // Now perform a copy update that fails due to binding out of bounds 4481 m_errorMonitor->SetDesiredFailureMsg( 4482 VK_DEBUG_REPORT_ERROR_BIT_EXT, 4483 "Copy descriptor update 0 has srcBinding 3 which is out of bounds "); 4484 memset(©_ds_update, 0, sizeof(VkCopyDescriptorSet)); 4485 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET; 4486 copy_ds_update.srcSet = descriptorSet; 4487 copy_ds_update.srcBinding = 4488 3; // ERROR : Invalid binding for matching layout 4489 copy_ds_update.dstSet = descriptorSet; 4490 copy_ds_update.dstBinding = 0; 4491 copy_ds_update.descriptorCount = 1; // copy 1 descriptor 4492 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, ©_ds_update); 4493 4494 if (!m_errorMonitor->DesiredMsgFound()) { 4495 FAIL() << "Did not receive Error 'Copy descriptor update 0 has " 4496 "srcBinding 3 which is out of bounds...'"; 4497 m_errorMonitor->DumpFailureMsgs(); 4498 } 4499 4500 // Now perform a copy update that fails due to binding out of bounds 4501 m_errorMonitor->SetDesiredFailureMsg( 4502 VK_DEBUG_REPORT_ERROR_BIT_EXT, 4503 "Copy descriptor src update is out of bounds for matching binding 1 "); 4504 4505 memset(©_ds_update, 0, sizeof(VkCopyDescriptorSet)); 4506 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET; 4507 copy_ds_update.srcSet = descriptorSet; 4508 copy_ds_update.srcBinding = 1; 4509 copy_ds_update.dstSet = descriptorSet; 4510 copy_ds_update.dstBinding = 0; 4511 copy_ds_update.descriptorCount = 4512 5; // ERROR copy 5 descriptors (out of bounds for layout) 4513 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, ©_ds_update); 4514 4515 if (!m_errorMonitor->DesiredMsgFound()) { 4516 FAIL() << "Did not receive Error 'Copy descriptor src update is out of " 4517 "bounds for matching binding 1...'"; 4518 m_errorMonitor->DumpFailureMsgs(); 4519 } 4520 4521 vkDestroySampler(m_device->device(), sampler, NULL); 4522 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 4523 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 4524 } 4525 4526 TEST_F(VkLayerTest, NumSamplesMismatch) { 4527 // Create CommandBuffer where MSAA samples doesn't match RenderPass 4528 // sampleCount 4529 VkResult err; 4530 4531 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 4532 "Num samples mismatch! "); 4533 4534 ASSERT_NO_FATAL_FAILURE(InitState()); 4535 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 4536 VkDescriptorPoolSize ds_type_count = {}; 4537 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 4538 ds_type_count.descriptorCount = 1; 4539 4540 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 4541 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 4542 ds_pool_ci.pNext = NULL; 4543 ds_pool_ci.maxSets = 1; 4544 ds_pool_ci.poolSizeCount = 1; 4545 ds_pool_ci.pPoolSizes = &ds_type_count; 4546 4547 VkDescriptorPool ds_pool; 4548 err = 4549 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 4550 ASSERT_VK_SUCCESS(err); 4551 4552 VkDescriptorSetLayoutBinding dsl_binding = {}; 4553 dsl_binding.binding = 0; 4554 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 4555 dsl_binding.descriptorCount = 1; 4556 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 4557 dsl_binding.pImmutableSamplers = NULL; 4558 4559 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 4560 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 4561 ds_layout_ci.pNext = NULL; 4562 ds_layout_ci.bindingCount = 1; 4563 ds_layout_ci.pBindings = &dsl_binding; 4564 4565 VkDescriptorSetLayout ds_layout; 4566 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 4567 &ds_layout); 4568 ASSERT_VK_SUCCESS(err); 4569 4570 VkDescriptorSet descriptorSet; 4571 VkDescriptorSetAllocateInfo alloc_info = {}; 4572 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 4573 alloc_info.descriptorSetCount = 1; 4574 alloc_info.descriptorPool = ds_pool; 4575 alloc_info.pSetLayouts = &ds_layout; 4576 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 4577 &descriptorSet); 4578 ASSERT_VK_SUCCESS(err); 4579 4580 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {}; 4581 pipe_ms_state_ci.sType = 4582 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; 4583 pipe_ms_state_ci.pNext = NULL; 4584 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT; 4585 pipe_ms_state_ci.sampleShadingEnable = 0; 4586 pipe_ms_state_ci.minSampleShading = 1.0; 4587 pipe_ms_state_ci.pSampleMask = NULL; 4588 4589 VkPipelineLayoutCreateInfo pipeline_layout_ci = {}; 4590 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 4591 pipeline_layout_ci.pNext = NULL; 4592 pipeline_layout_ci.setLayoutCount = 1; 4593 pipeline_layout_ci.pSetLayouts = &ds_layout; 4594 4595 VkPipelineLayout pipeline_layout; 4596 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 4597 &pipeline_layout); 4598 ASSERT_VK_SUCCESS(err); 4599 4600 VkShaderObj vs(m_device, bindStateVertShaderText, 4601 VK_SHADER_STAGE_VERTEX_BIT, this); 4602 VkShaderObj fs(m_device, bindStateFragShaderText, 4603 VK_SHADER_STAGE_FRAGMENT_BIT, 4604 this); // TODO - We shouldn't need a fragment shader 4605 // but add it to be able to run on more devices 4606 VkPipelineObj pipe(m_device); 4607 pipe.AddShader(&vs); 4608 pipe.AddShader(&fs); 4609 pipe.SetMSAA(&pipe_ms_state_ci); 4610 pipe.CreateVKPipeline(pipeline_layout, renderPass()); 4611 4612 BeginCommandBuffer(); 4613 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), 4614 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle()); 4615 4616 if (!m_errorMonitor->DesiredMsgFound()) { 4617 FAIL() << "Did not recieve Error 'Num samples mismatch!...'"; 4618 m_errorMonitor->DumpFailureMsgs(); 4619 } 4620 4621 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); 4622 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 4623 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 4624 } 4625 4626 TEST_F(VkLayerTest, ClearCmdNoDraw) { 4627 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior 4628 // to issuing a Draw 4629 VkResult err; 4630 4631 // TODO: verify that this matches layer 4632 m_errorMonitor->SetDesiredFailureMsg( 4633 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, 4634 "vkCmdClearAttachments() issued on CB object "); 4635 4636 ASSERT_NO_FATAL_FAILURE(InitState()); 4637 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 4638 4639 VkDescriptorPoolSize ds_type_count = {}; 4640 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 4641 ds_type_count.descriptorCount = 1; 4642 4643 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 4644 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 4645 ds_pool_ci.pNext = NULL; 4646 ds_pool_ci.maxSets = 1; 4647 ds_pool_ci.poolSizeCount = 1; 4648 ds_pool_ci.pPoolSizes = &ds_type_count; 4649 4650 VkDescriptorPool ds_pool; 4651 err = 4652 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 4653 ASSERT_VK_SUCCESS(err); 4654 4655 VkDescriptorSetLayoutBinding dsl_binding = {}; 4656 dsl_binding.binding = 0; 4657 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 4658 dsl_binding.descriptorCount = 1; 4659 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 4660 dsl_binding.pImmutableSamplers = NULL; 4661 4662 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 4663 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 4664 ds_layout_ci.pNext = NULL; 4665 ds_layout_ci.bindingCount = 1; 4666 ds_layout_ci.pBindings = &dsl_binding; 4667 4668 VkDescriptorSetLayout ds_layout; 4669 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 4670 &ds_layout); 4671 ASSERT_VK_SUCCESS(err); 4672 4673 VkDescriptorSet descriptorSet; 4674 VkDescriptorSetAllocateInfo alloc_info = {}; 4675 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 4676 alloc_info.descriptorSetCount = 1; 4677 alloc_info.descriptorPool = ds_pool; 4678 alloc_info.pSetLayouts = &ds_layout; 4679 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 4680 &descriptorSet); 4681 ASSERT_VK_SUCCESS(err); 4682 4683 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {}; 4684 pipe_ms_state_ci.sType = 4685 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; 4686 pipe_ms_state_ci.pNext = NULL; 4687 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT; 4688 pipe_ms_state_ci.sampleShadingEnable = 0; 4689 pipe_ms_state_ci.minSampleShading = 1.0; 4690 pipe_ms_state_ci.pSampleMask = NULL; 4691 4692 VkPipelineLayoutCreateInfo pipeline_layout_ci = {}; 4693 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 4694 pipeline_layout_ci.pNext = NULL; 4695 pipeline_layout_ci.setLayoutCount = 1; 4696 pipeline_layout_ci.pSetLayouts = &ds_layout; 4697 4698 VkPipelineLayout pipeline_layout; 4699 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 4700 &pipeline_layout); 4701 ASSERT_VK_SUCCESS(err); 4702 4703 VkShaderObj vs(m_device, bindStateVertShaderText, 4704 VK_SHADER_STAGE_VERTEX_BIT, this); 4705 // TODO - We shouldn't need a fragment shader but add it to be able to run 4706 // on more devices 4707 VkShaderObj fs(m_device, bindStateFragShaderText, 4708 VK_SHADER_STAGE_FRAGMENT_BIT, this); 4709 4710 VkPipelineObj pipe(m_device); 4711 pipe.AddShader(&vs); 4712 pipe.AddShader(&fs); 4713 pipe.SetMSAA(&pipe_ms_state_ci); 4714 pipe.CreateVKPipeline(pipeline_layout, renderPass()); 4715 4716 BeginCommandBuffer(); 4717 4718 // Main thing we care about for this test is that the VkImage obj we're 4719 // clearing matches Color Attachment of FB 4720 // Also pass down other dummy params to keep driver and paramchecker happy 4721 VkClearAttachment color_attachment; 4722 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 4723 color_attachment.clearValue.color.float32[0] = 1.0; 4724 color_attachment.clearValue.color.float32[1] = 1.0; 4725 color_attachment.clearValue.color.float32[2] = 1.0; 4726 color_attachment.clearValue.color.float32[3] = 1.0; 4727 color_attachment.colorAttachment = 0; 4728 VkClearRect clear_rect = { 4729 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}}; 4730 4731 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, 4732 &color_attachment, 1, &clear_rect); 4733 4734 if (!m_errorMonitor->DesiredMsgFound()) { 4735 FAIL() << "Did not receive Error 'vkCommandClearAttachments() issued " 4736 "on CB object...'"; 4737 m_errorMonitor->DumpFailureMsgs(); 4738 } 4739 4740 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); 4741 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 4742 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 4743 } 4744 4745 TEST_F(VkLayerTest, VtxBufferBadIndex) { 4746 VkResult err; 4747 4748 m_errorMonitor->SetDesiredFailureMsg( 4749 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, 4750 "but no vertex buffers are attached to this Pipeline State Object"); 4751 4752 ASSERT_NO_FATAL_FAILURE(InitState()); 4753 ASSERT_NO_FATAL_FAILURE(InitViewport()); 4754 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 4755 4756 VkDescriptorPoolSize ds_type_count = {}; 4757 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 4758 ds_type_count.descriptorCount = 1; 4759 4760 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 4761 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 4762 ds_pool_ci.pNext = NULL; 4763 ds_pool_ci.maxSets = 1; 4764 ds_pool_ci.poolSizeCount = 1; 4765 ds_pool_ci.pPoolSizes = &ds_type_count; 4766 4767 VkDescriptorPool ds_pool; 4768 err = 4769 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 4770 ASSERT_VK_SUCCESS(err); 4771 4772 VkDescriptorSetLayoutBinding dsl_binding = {}; 4773 dsl_binding.binding = 0; 4774 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 4775 dsl_binding.descriptorCount = 1; 4776 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 4777 dsl_binding.pImmutableSamplers = NULL; 4778 4779 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 4780 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 4781 ds_layout_ci.pNext = NULL; 4782 ds_layout_ci.bindingCount = 1; 4783 ds_layout_ci.pBindings = &dsl_binding; 4784 4785 VkDescriptorSetLayout ds_layout; 4786 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 4787 &ds_layout); 4788 ASSERT_VK_SUCCESS(err); 4789 4790 VkDescriptorSet descriptorSet; 4791 VkDescriptorSetAllocateInfo alloc_info = {}; 4792 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 4793 alloc_info.descriptorSetCount = 1; 4794 alloc_info.descriptorPool = ds_pool; 4795 alloc_info.pSetLayouts = &ds_layout; 4796 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 4797 &descriptorSet); 4798 ASSERT_VK_SUCCESS(err); 4799 4800 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {}; 4801 pipe_ms_state_ci.sType = 4802 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; 4803 pipe_ms_state_ci.pNext = NULL; 4804 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; 4805 pipe_ms_state_ci.sampleShadingEnable = 0; 4806 pipe_ms_state_ci.minSampleShading = 1.0; 4807 pipe_ms_state_ci.pSampleMask = NULL; 4808 4809 VkPipelineLayoutCreateInfo pipeline_layout_ci = {}; 4810 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 4811 pipeline_layout_ci.pNext = NULL; 4812 pipeline_layout_ci.setLayoutCount = 1; 4813 pipeline_layout_ci.pSetLayouts = &ds_layout; 4814 VkPipelineLayout pipeline_layout; 4815 4816 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, 4817 &pipeline_layout); 4818 ASSERT_VK_SUCCESS(err); 4819 4820 VkShaderObj vs(m_device, bindStateVertShaderText, 4821 VK_SHADER_STAGE_VERTEX_BIT, this); 4822 VkShaderObj fs(m_device, bindStateFragShaderText, 4823 VK_SHADER_STAGE_FRAGMENT_BIT, 4824 this); // TODO - We shouldn't need a fragment shader 4825 // but add it to be able to run on more devices 4826 VkPipelineObj pipe(m_device); 4827 pipe.AddShader(&vs); 4828 pipe.AddShader(&fs); 4829 pipe.SetMSAA(&pipe_ms_state_ci); 4830 pipe.SetViewport(m_viewports); 4831 pipe.SetScissor(m_scissors); 4832 pipe.CreateVKPipeline(pipeline_layout, renderPass()); 4833 4834 BeginCommandBuffer(); 4835 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), 4836 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle()); 4837 // Don't care about actual data, just need to get to draw to flag error 4838 static const float vbo_data[3] = {1.f, 0.f, 1.f}; 4839 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), 4840 (const void *)&vbo_data); 4841 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO 4842 Draw(1, 0, 0, 0); 4843 4844 if (!m_errorMonitor->DesiredMsgFound()) { 4845 FAIL() << "Did not receive Error 'Vtx Buffer Index 0 was bound, but no " 4846 "vtx buffers are attached to PSO.'"; 4847 m_errorMonitor->DumpFailureMsgs(); 4848 } 4849 4850 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); 4851 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 4852 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 4853 } 4854 #endif // DRAW_STATE_TESTS 4855 4856 #if THREADING_TESTS 4857 #if GTEST_IS_THREADSAFE 4858 struct thread_data_struct { 4859 VkCommandBuffer commandBuffer; 4860 VkEvent event; 4861 bool bailout; 4862 }; 4863 4864 extern "C" void *AddToCommandBuffer(void *arg) { 4865 struct thread_data_struct *data = (struct thread_data_struct *)arg; 4866 4867 for (int i = 0; i < 10000; i++) { 4868 vkCmdSetEvent(data->commandBuffer, data->event, 4869 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); 4870 if (data->bailout) { 4871 break; 4872 } 4873 } 4874 return NULL; 4875 } 4876 4877 TEST_F(VkLayerTest, ThreadCommandBufferCollision) { 4878 test_platform_thread thread; 4879 4880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 4881 "THREADING ERROR"); 4882 4883 ASSERT_NO_FATAL_FAILURE(InitState()); 4884 ASSERT_NO_FATAL_FAILURE(InitViewport()); 4885 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 4886 4887 // Calls AllocateCommandBuffers 4888 VkCommandBufferObj commandBuffer(m_device, m_commandPool); 4889 4890 // Avoid creating RenderPass 4891 commandBuffer.BeginCommandBuffer(); 4892 4893 VkEventCreateInfo event_info; 4894 VkEvent event; 4895 VkResult err; 4896 4897 memset(&event_info, 0, sizeof(event_info)); 4898 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO; 4899 4900 err = vkCreateEvent(device(), &event_info, NULL, &event); 4901 ASSERT_VK_SUCCESS(err); 4902 4903 err = vkResetEvent(device(), event); 4904 ASSERT_VK_SUCCESS(err); 4905 4906 struct thread_data_struct data; 4907 data.commandBuffer = commandBuffer.GetBufferHandle(); 4908 data.event = event; 4909 data.bailout = false; 4910 m_errorMonitor->SetBailout(&data.bailout); 4911 // Add many entries to command buffer from another thread. 4912 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data); 4913 // Add many entries to command buffer from this thread at the same time. 4914 AddToCommandBuffer(&data); 4915 4916 test_platform_thread_join(thread, NULL); 4917 commandBuffer.EndCommandBuffer(); 4918 4919 m_errorMonitor->SetBailout(NULL); 4920 4921 if (!m_errorMonitor->DesiredMsgFound()) { 4922 FAIL() << "Did not receive Error 'THREADING ERROR' from using one " 4923 "VkCommandBufferObj in two threads"; 4924 m_errorMonitor->DumpFailureMsgs(); 4925 } 4926 4927 vkDestroyEvent(device(), event, NULL); 4928 } 4929 #endif // GTEST_IS_THREADSAFE 4930 #endif // THREADING_TESTS 4931 4932 #if SHADER_CHECKER_TESTS 4933 TEST_F(VkLayerTest, InvalidSPIRVCodeSize) { 4934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 4935 "Shader is not SPIR-V"); 4936 4937 ASSERT_NO_FATAL_FAILURE(InitState()); 4938 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 4939 4940 VkShaderModule module; 4941 VkShaderModuleCreateInfo moduleCreateInfo; 4942 struct icd_spv_header spv; 4943 4944 spv.magic = ICD_SPV_MAGIC; 4945 spv.version = ICD_SPV_VERSION; 4946 spv.gen_magic = 0; 4947 4948 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; 4949 moduleCreateInfo.pNext = NULL; 4950 moduleCreateInfo.pCode = (const uint32_t *)&spv; 4951 moduleCreateInfo.codeSize = 4; 4952 moduleCreateInfo.flags = 0; 4953 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module); 4954 4955 if (!m_errorMonitor->DesiredMsgFound()) { 4956 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'"; 4957 m_errorMonitor->DumpFailureMsgs(); 4958 } 4959 } 4960 4961 TEST_F(VkLayerTest, InvalidSPIRVMagic) { 4962 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 4963 "Shader is not SPIR-V"); 4964 4965 ASSERT_NO_FATAL_FAILURE(InitState()); 4966 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 4967 4968 VkShaderModule module; 4969 VkShaderModuleCreateInfo moduleCreateInfo; 4970 struct icd_spv_header spv; 4971 4972 spv.magic = ~ICD_SPV_MAGIC; 4973 spv.version = ICD_SPV_VERSION; 4974 spv.gen_magic = 0; 4975 4976 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; 4977 moduleCreateInfo.pNext = NULL; 4978 moduleCreateInfo.pCode = (const uint32_t *)&spv; 4979 moduleCreateInfo.codeSize = sizeof(spv) + 10; 4980 moduleCreateInfo.flags = 0; 4981 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module); 4982 4983 if (!m_errorMonitor->DesiredMsgFound()) { 4984 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'"; 4985 m_errorMonitor->DumpFailureMsgs(); 4986 } 4987 } 4988 4989 TEST_F(VkLayerTest, InvalidSPIRVVersion) { 4990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 4991 "Shader is not SPIR-V"); 4992 4993 ASSERT_NO_FATAL_FAILURE(InitState()); 4994 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 4995 4996 VkShaderModule module; 4997 VkShaderModuleCreateInfo moduleCreateInfo; 4998 struct icd_spv_header spv; 4999 5000 spv.magic = ICD_SPV_MAGIC; 5001 spv.version = ~ICD_SPV_VERSION; 5002 spv.gen_magic = 0; 5003 5004 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; 5005 moduleCreateInfo.pNext = NULL; 5006 5007 moduleCreateInfo.pCode = (const uint32_t *)&spv; 5008 moduleCreateInfo.codeSize = sizeof(spv) + 10; 5009 moduleCreateInfo.flags = 0; 5010 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module); 5011 5012 if (!m_errorMonitor->DesiredMsgFound()) { 5013 FAIL() << "Did not recieive Error 'Shader is not SPIR-V'"; 5014 m_errorMonitor->DumpFailureMsgs(); 5015 } 5016 } 5017 5018 TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) { 5019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, 5020 "not consumed by fragment shader"); 5021 5022 ASSERT_NO_FATAL_FAILURE(InitState()); 5023 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5024 5025 char const *vsSource = 5026 "#version 400\n" 5027 "#extension GL_ARB_separate_shader_objects: require\n" 5028 "#extension GL_ARB_shading_language_420pack: require\n" 5029 "\n" 5030 "layout(location=0) out float x;\n" 5031 "out gl_PerVertex {\n" 5032 " vec4 gl_Position;\n" 5033 "};\n" 5034 "void main(){\n" 5035 " gl_Position = vec4(1);\n" 5036 " x = 0;\n" 5037 "}\n"; 5038 char const *fsSource = 5039 "#version 400\n" 5040 "#extension GL_ARB_separate_shader_objects: require\n" 5041 "#extension GL_ARB_shading_language_420pack: require\n" 5042 "\n" 5043 "layout(location=0) out vec4 color;\n" 5044 "void main(){\n" 5045 " color = vec4(1);\n" 5046 "}\n"; 5047 5048 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5049 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5050 5051 VkPipelineObj pipe(m_device); 5052 pipe.AddColorAttachment(); 5053 pipe.AddShader(&vs); 5054 pipe.AddShader(&fs); 5055 5056 VkDescriptorSetObj descriptorSet(m_device); 5057 descriptorSet.AppendDummy(); 5058 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5059 5060 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5061 5062 if (!m_errorMonitor->DesiredMsgFound()) { 5063 FAIL() << "Did not receive Warning 'not consumed by fragment shader'"; 5064 m_errorMonitor->DumpFailureMsgs(); 5065 } 5066 } 5067 5068 TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) { 5069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 5070 "not written by vertex shader"); 5071 5072 ASSERT_NO_FATAL_FAILURE(InitState()); 5073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5074 5075 char const *vsSource = 5076 "#version 400\n" 5077 "#extension GL_ARB_separate_shader_objects: require\n" 5078 "#extension GL_ARB_shading_language_420pack: require\n" 5079 "\n" 5080 "out gl_PerVertex {\n" 5081 " vec4 gl_Position;\n" 5082 "};\n" 5083 "void main(){\n" 5084 " gl_Position = vec4(1);\n" 5085 "}\n"; 5086 char const *fsSource = 5087 "#version 400\n" 5088 "#extension GL_ARB_separate_shader_objects: require\n" 5089 "#extension GL_ARB_shading_language_420pack: require\n" 5090 "\n" 5091 "layout(location=0) in float x;\n" 5092 "layout(location=0) out vec4 color;\n" 5093 "void main(){\n" 5094 " color = vec4(x);\n" 5095 "}\n"; 5096 5097 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5098 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5099 5100 VkPipelineObj pipe(m_device); 5101 pipe.AddColorAttachment(); 5102 pipe.AddShader(&vs); 5103 pipe.AddShader(&fs); 5104 5105 VkDescriptorSetObj descriptorSet(m_device); 5106 descriptorSet.AppendDummy(); 5107 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5108 5109 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5110 5111 if (!m_errorMonitor->DesiredMsgFound()) { 5112 FAIL() << "Did not receive Error 'not written by vertex shader'"; 5113 m_errorMonitor->DumpFailureMsgs(); 5114 } 5115 } 5116 5117 TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) { 5118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 5119 "not written by vertex shader"); 5120 5121 ASSERT_NO_FATAL_FAILURE(InitState()); 5122 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5123 5124 char const *vsSource = 5125 "#version 400\n" 5126 "#extension GL_ARB_separate_shader_objects: require\n" 5127 "#extension GL_ARB_shading_language_420pack: require\n" 5128 "\n" 5129 "out gl_PerVertex {\n" 5130 " vec4 gl_Position;\n" 5131 "};\n" 5132 "void main(){\n" 5133 " gl_Position = vec4(1);\n" 5134 "}\n"; 5135 char const *fsSource = 5136 "#version 450\n" 5137 "#extension GL_ARB_separate_shader_objects: require\n" 5138 "#extension GL_ARB_shading_language_420pack: require\n" 5139 "\n" 5140 "in block { layout(location=0) float x; } ins;\n" 5141 "layout(location=0) out vec4 color;\n" 5142 "void main(){\n" 5143 " color = vec4(ins.x);\n" 5144 "}\n"; 5145 5146 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5147 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5148 5149 VkPipelineObj pipe(m_device); 5150 pipe.AddColorAttachment(); 5151 pipe.AddShader(&vs); 5152 pipe.AddShader(&fs); 5153 5154 VkDescriptorSetObj descriptorSet(m_device); 5155 descriptorSet.AppendDummy(); 5156 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5157 5158 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5159 5160 if (!m_errorMonitor->DesiredMsgFound()) { 5161 FAIL() << "Did not receive Error 'not written by vertex shader'"; 5162 m_errorMonitor->DumpFailureMsgs(); 5163 } 5164 } 5165 5166 TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) { 5167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 5168 "Type mismatch on location 0.0: 'ptr to " 5169 "output arr[2] of float32' vs 'ptr to " 5170 "input arr[3] of float32'"); 5171 5172 ASSERT_NO_FATAL_FAILURE(InitState()); 5173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5174 5175 char const *vsSource = 5176 "#version 400\n" 5177 "#extension GL_ARB_separate_shader_objects: require\n" 5178 "#extension GL_ARB_shading_language_420pack: require\n" 5179 "\n" 5180 "layout(location=0) out float x[2];\n" 5181 "out gl_PerVertex {\n" 5182 " vec4 gl_Position;\n" 5183 "};\n" 5184 "void main(){\n" 5185 " x[0] = 0; x[1] = 0;\n" 5186 " gl_Position = vec4(1);\n" 5187 "}\n"; 5188 char const *fsSource = 5189 "#version 400\n" 5190 "#extension GL_ARB_separate_shader_objects: require\n" 5191 "#extension GL_ARB_shading_language_420pack: require\n" 5192 "\n" 5193 "layout(location=0) in float x[3];\n" 5194 "layout(location=0) out vec4 color;\n" 5195 "void main(){\n" 5196 " color = vec4(x[0] + x[1] + x[2]);\n" 5197 "}\n"; 5198 5199 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5200 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5201 5202 VkPipelineObj pipe(m_device); 5203 pipe.AddColorAttachment(); 5204 pipe.AddShader(&vs); 5205 pipe.AddShader(&fs); 5206 5207 VkDescriptorSetObj descriptorSet(m_device); 5208 descriptorSet.AppendDummy(); 5209 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5210 5211 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5212 5213 if (!m_errorMonitor->DesiredMsgFound()) { 5214 m_errorMonitor->DumpFailureMsgs(); 5215 FAIL() << "Did not receive Error 'Type mismatch on location 0.0: 'ptr to " 5216 "output arr[2] of float32' vs 'ptr to input arr[3] of " 5217 "float32''"; 5218 } 5219 } 5220 5221 TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) { 5222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 5223 "Type mismatch on location 0"); 5224 5225 ASSERT_NO_FATAL_FAILURE(InitState()); 5226 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5227 5228 char const *vsSource = 5229 "#version 400\n" 5230 "#extension GL_ARB_separate_shader_objects: require\n" 5231 "#extension GL_ARB_shading_language_420pack: require\n" 5232 "\n" 5233 "layout(location=0) out int x;\n" 5234 "out gl_PerVertex {\n" 5235 " vec4 gl_Position;\n" 5236 "};\n" 5237 "void main(){\n" 5238 " x = 0;\n" 5239 " gl_Position = vec4(1);\n" 5240 "}\n"; 5241 char const *fsSource = 5242 "#version 400\n" 5243 "#extension GL_ARB_separate_shader_objects: require\n" 5244 "#extension GL_ARB_shading_language_420pack: require\n" 5245 "\n" 5246 "layout(location=0) in float x;\n" /* VS writes int */ 5247 "layout(location=0) out vec4 color;\n" 5248 "void main(){\n" 5249 " color = vec4(x);\n" 5250 "}\n"; 5251 5252 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5253 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5254 5255 VkPipelineObj pipe(m_device); 5256 pipe.AddColorAttachment(); 5257 pipe.AddShader(&vs); 5258 pipe.AddShader(&fs); 5259 5260 VkDescriptorSetObj descriptorSet(m_device); 5261 descriptorSet.AppendDummy(); 5262 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5263 5264 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5265 5266 if (!m_errorMonitor->DesiredMsgFound()) { 5267 FAIL() << "Did not receive Error 'Type mismatch on location 0'"; 5268 m_errorMonitor->DumpFailureMsgs(); 5269 } 5270 } 5271 5272 TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) { 5273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 5274 "Type mismatch on location 0"); 5275 5276 ASSERT_NO_FATAL_FAILURE(InitState()); 5277 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5278 5279 char const *vsSource = 5280 "#version 450\n" 5281 "#extension GL_ARB_separate_shader_objects: require\n" 5282 "#extension GL_ARB_shading_language_420pack: require\n" 5283 "\n" 5284 "out block { layout(location=0) int x; } outs;\n" 5285 "out gl_PerVertex {\n" 5286 " vec4 gl_Position;\n" 5287 "};\n" 5288 "void main(){\n" 5289 " outs.x = 0;\n" 5290 " gl_Position = vec4(1);\n" 5291 "}\n"; 5292 char const *fsSource = 5293 "#version 450\n" 5294 "#extension GL_ARB_separate_shader_objects: require\n" 5295 "#extension GL_ARB_shading_language_420pack: require\n" 5296 "\n" 5297 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */ 5298 "layout(location=0) out vec4 color;\n" 5299 "void main(){\n" 5300 " color = vec4(ins.x);\n" 5301 "}\n"; 5302 5303 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5304 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5305 5306 VkPipelineObj pipe(m_device); 5307 pipe.AddColorAttachment(); 5308 pipe.AddShader(&vs); 5309 pipe.AddShader(&fs); 5310 5311 VkDescriptorSetObj descriptorSet(m_device); 5312 descriptorSet.AppendDummy(); 5313 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5314 5315 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5316 5317 if (!m_errorMonitor->DesiredMsgFound()) { 5318 m_errorMonitor->DumpFailureMsgs(); 5319 FAIL() << "Did not receive Error 'Type mismatch on location 0'"; 5320 } 5321 } 5322 5323 TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) { 5324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 5325 "location 0.0 which is not written by vertex shader"); 5326 5327 ASSERT_NO_FATAL_FAILURE(InitState()); 5328 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5329 5330 char const *vsSource = 5331 "#version 450\n" 5332 "#extension GL_ARB_separate_shader_objects: require\n" 5333 "#extension GL_ARB_shading_language_420pack: require\n" 5334 "\n" 5335 "out block { layout(location=1) float x; } outs;\n" 5336 "out gl_PerVertex {\n" 5337 " vec4 gl_Position;\n" 5338 "};\n" 5339 "void main(){\n" 5340 " outs.x = 0;\n" 5341 " gl_Position = vec4(1);\n" 5342 "}\n"; 5343 char const *fsSource = 5344 "#version 450\n" 5345 "#extension GL_ARB_separate_shader_objects: require\n" 5346 "#extension GL_ARB_shading_language_420pack: require\n" 5347 "\n" 5348 "in block { layout(location=0) float x; } ins;\n" 5349 "layout(location=0) out vec4 color;\n" 5350 "void main(){\n" 5351 " color = vec4(ins.x);\n" 5352 "}\n"; 5353 5354 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5355 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5356 5357 VkPipelineObj pipe(m_device); 5358 pipe.AddColorAttachment(); 5359 pipe.AddShader(&vs); 5360 pipe.AddShader(&fs); 5361 5362 VkDescriptorSetObj descriptorSet(m_device); 5363 descriptorSet.AppendDummy(); 5364 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5365 5366 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5367 5368 if (!m_errorMonitor->DesiredMsgFound()) { 5369 m_errorMonitor->DumpFailureMsgs(); 5370 FAIL() << "Did not receive Error 'location 0.0 which is not written by vertex shader'"; 5371 } 5372 } 5373 5374 TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) { 5375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 5376 "location 0.1 which is not written by vertex shader"); 5377 5378 ASSERT_NO_FATAL_FAILURE(InitState()); 5379 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5380 5381 char const *vsSource = 5382 "#version 450\n" 5383 "#extension GL_ARB_separate_shader_objects: require\n" 5384 "#extension GL_ARB_shading_language_420pack: require\n" 5385 "\n" 5386 "out block { layout(location=0, component=0) float x; } outs;\n" 5387 "out gl_PerVertex {\n" 5388 " vec4 gl_Position;\n" 5389 "};\n" 5390 "void main(){\n" 5391 " outs.x = 0;\n" 5392 " gl_Position = vec4(1);\n" 5393 "}\n"; 5394 char const *fsSource = 5395 "#version 450\n" 5396 "#extension GL_ARB_separate_shader_objects: require\n" 5397 "#extension GL_ARB_shading_language_420pack: require\n" 5398 "\n" 5399 "in block { layout(location=0, component=1) float x; } ins;\n" 5400 "layout(location=0) out vec4 color;\n" 5401 "void main(){\n" 5402 " color = vec4(ins.x);\n" 5403 "}\n"; 5404 5405 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5406 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5407 5408 VkPipelineObj pipe(m_device); 5409 pipe.AddColorAttachment(); 5410 pipe.AddShader(&vs); 5411 pipe.AddShader(&fs); 5412 5413 VkDescriptorSetObj descriptorSet(m_device); 5414 descriptorSet.AppendDummy(); 5415 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5416 5417 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5418 5419 if (!m_errorMonitor->DesiredMsgFound()) { 5420 m_errorMonitor->DumpFailureMsgs(); 5421 FAIL() << "Did not receive Error 'location 0.1 which is not written by vertex shader'"; 5422 } 5423 } 5424 5425 TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) { 5426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, 5427 "location 0 not consumed by VS"); 5428 5429 ASSERT_NO_FATAL_FAILURE(InitState()); 5430 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5431 5432 VkVertexInputBindingDescription input_binding; 5433 memset(&input_binding, 0, sizeof(input_binding)); 5434 5435 VkVertexInputAttributeDescription input_attrib; 5436 memset(&input_attrib, 0, sizeof(input_attrib)); 5437 input_attrib.format = VK_FORMAT_R32_SFLOAT; 5438 5439 char const *vsSource = 5440 "#version 400\n" 5441 "#extension GL_ARB_separate_shader_objects: require\n" 5442 "#extension GL_ARB_shading_language_420pack: require\n" 5443 "\n" 5444 "out gl_PerVertex {\n" 5445 " vec4 gl_Position;\n" 5446 "};\n" 5447 "void main(){\n" 5448 " gl_Position = vec4(1);\n" 5449 "}\n"; 5450 char const *fsSource = 5451 "#version 400\n" 5452 "#extension GL_ARB_separate_shader_objects: require\n" 5453 "#extension GL_ARB_shading_language_420pack: require\n" 5454 "\n" 5455 "layout(location=0) out vec4 color;\n" 5456 "void main(){\n" 5457 " color = vec4(1);\n" 5458 "}\n"; 5459 5460 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5461 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5462 5463 VkPipelineObj pipe(m_device); 5464 pipe.AddColorAttachment(); 5465 pipe.AddShader(&vs); 5466 pipe.AddShader(&fs); 5467 5468 pipe.AddVertexInputBindings(&input_binding, 1); 5469 pipe.AddVertexInputAttribs(&input_attrib, 1); 5470 5471 VkDescriptorSetObj descriptorSet(m_device); 5472 descriptorSet.AppendDummy(); 5473 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5474 5475 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5476 5477 if (!m_errorMonitor->DesiredMsgFound()) { 5478 FAIL() << "Did not receive Warning 'location 0 not consumed by VS'"; 5479 m_errorMonitor->DumpFailureMsgs(); 5480 } 5481 } 5482 5483 TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) { 5484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, 5485 "location 0 not consumed by VS"); 5486 5487 ASSERT_NO_FATAL_FAILURE(InitState()); 5488 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5489 5490 VkVertexInputBindingDescription input_binding; 5491 memset(&input_binding, 0, sizeof(input_binding)); 5492 5493 VkVertexInputAttributeDescription input_attrib; 5494 memset(&input_attrib, 0, sizeof(input_attrib)); 5495 input_attrib.format = VK_FORMAT_R32_SFLOAT; 5496 5497 char const *vsSource = 5498 "#version 400\n" 5499 "#extension GL_ARB_separate_shader_objects: require\n" 5500 "#extension GL_ARB_shading_language_420pack: require\n" 5501 "\n" 5502 "layout(location=1) in float x;\n" 5503 "out gl_PerVertex {\n" 5504 " vec4 gl_Position;\n" 5505 "};\n" 5506 "void main(){\n" 5507 " gl_Position = vec4(x);\n" 5508 "}\n"; 5509 char const *fsSource = 5510 "#version 400\n" 5511 "#extension GL_ARB_separate_shader_objects: require\n" 5512 "#extension GL_ARB_shading_language_420pack: require\n" 5513 "\n" 5514 "layout(location=0) out vec4 color;\n" 5515 "void main(){\n" 5516 " color = vec4(1);\n" 5517 "}\n"; 5518 5519 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5520 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5521 5522 VkPipelineObj pipe(m_device); 5523 pipe.AddColorAttachment(); 5524 pipe.AddShader(&vs); 5525 pipe.AddShader(&fs); 5526 5527 pipe.AddVertexInputBindings(&input_binding, 1); 5528 pipe.AddVertexInputAttribs(&input_attrib, 1); 5529 5530 VkDescriptorSetObj descriptorSet(m_device); 5531 descriptorSet.AppendDummy(); 5532 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5533 5534 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5535 5536 if (!m_errorMonitor->DesiredMsgFound()) { 5537 m_errorMonitor->DumpFailureMsgs(); 5538 FAIL() << "Did not receive Warning 'location 0 not consumed by VS'"; 5539 } 5540 } 5541 5542 TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) { 5543 m_errorMonitor->SetDesiredFailureMsg( 5544 VK_DEBUG_REPORT_ERROR_BIT_EXT, 5545 "VS consumes input at location 0 but not provided"); 5546 5547 ASSERT_NO_FATAL_FAILURE(InitState()); 5548 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5549 5550 char const *vsSource = 5551 "#version 400\n" 5552 "#extension GL_ARB_separate_shader_objects: require\n" 5553 "#extension GL_ARB_shading_language_420pack: require\n" 5554 "\n" 5555 "layout(location=0) in vec4 x;\n" /* not provided */ 5556 "out gl_PerVertex {\n" 5557 " vec4 gl_Position;\n" 5558 "};\n" 5559 "void main(){\n" 5560 " gl_Position = x;\n" 5561 "}\n"; 5562 char const *fsSource = 5563 "#version 400\n" 5564 "#extension GL_ARB_separate_shader_objects: require\n" 5565 "#extension GL_ARB_shading_language_420pack: require\n" 5566 "\n" 5567 "layout(location=0) out vec4 color;\n" 5568 "void main(){\n" 5569 " color = vec4(1);\n" 5570 "}\n"; 5571 5572 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5573 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5574 5575 VkPipelineObj pipe(m_device); 5576 pipe.AddColorAttachment(); 5577 pipe.AddShader(&vs); 5578 pipe.AddShader(&fs); 5579 5580 VkDescriptorSetObj descriptorSet(m_device); 5581 descriptorSet.AppendDummy(); 5582 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5583 5584 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5585 5586 if (!m_errorMonitor->DesiredMsgFound()) { 5587 FAIL() << "Did not receive Error 'VS consumes input at location 0 but " 5588 "not provided'"; 5589 m_errorMonitor->DumpFailureMsgs(); 5590 } 5591 } 5592 5593 TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) { 5594 m_errorMonitor->SetDesiredFailureMsg( 5595 VK_DEBUG_REPORT_ERROR_BIT_EXT, 5596 "location 0 does not match VS input type"); 5597 5598 ASSERT_NO_FATAL_FAILURE(InitState()); 5599 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5600 5601 VkVertexInputBindingDescription input_binding; 5602 memset(&input_binding, 0, sizeof(input_binding)); 5603 5604 VkVertexInputAttributeDescription input_attrib; 5605 memset(&input_attrib, 0, sizeof(input_attrib)); 5606 input_attrib.format = VK_FORMAT_R32_SFLOAT; 5607 5608 char const *vsSource = 5609 "#version 400\n" 5610 "#extension GL_ARB_separate_shader_objects: require\n" 5611 "#extension GL_ARB_shading_language_420pack: require\n" 5612 "\n" 5613 "layout(location=0) in int x;\n" /* attrib provided float */ 5614 "out gl_PerVertex {\n" 5615 " vec4 gl_Position;\n" 5616 "};\n" 5617 "void main(){\n" 5618 " gl_Position = vec4(x);\n" 5619 "}\n"; 5620 char const *fsSource = 5621 "#version 400\n" 5622 "#extension GL_ARB_separate_shader_objects: require\n" 5623 "#extension GL_ARB_shading_language_420pack: require\n" 5624 "\n" 5625 "layout(location=0) out vec4 color;\n" 5626 "void main(){\n" 5627 " color = vec4(1);\n" 5628 "}\n"; 5629 5630 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5631 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5632 5633 VkPipelineObj pipe(m_device); 5634 pipe.AddColorAttachment(); 5635 pipe.AddShader(&vs); 5636 pipe.AddShader(&fs); 5637 5638 pipe.AddVertexInputBindings(&input_binding, 1); 5639 pipe.AddVertexInputAttribs(&input_attrib, 1); 5640 5641 VkDescriptorSetObj descriptorSet(m_device); 5642 descriptorSet.AppendDummy(); 5643 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5644 5645 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5646 5647 if (!m_errorMonitor->DesiredMsgFound()) { 5648 FAIL() << "Did not receive Error 'location 0 does not match VS input " 5649 "type'"; 5650 m_errorMonitor->DumpFailureMsgs(); 5651 } 5652 } 5653 5654 TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) { 5655 m_errorMonitor->SetDesiredFailureMsg(~0u, ""); 5656 5657 ASSERT_NO_FATAL_FAILURE(InitState()); 5658 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5659 5660 VkVertexInputBindingDescription input_binding; 5661 memset(&input_binding, 0, sizeof(input_binding)); 5662 5663 VkVertexInputAttributeDescription input_attribs[2]; 5664 memset(input_attribs, 0, sizeof(input_attribs)); 5665 5666 for (int i = 0; i < 2; i++) { 5667 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT; 5668 input_attribs[i].location = i; 5669 } 5670 5671 char const *vsSource = 5672 "#version 400\n" 5673 "#extension GL_ARB_separate_shader_objects: require\n" 5674 "#extension GL_ARB_shading_language_420pack: require\n" 5675 "\n" 5676 "layout(location=0) in mat2x4 x;\n" 5677 "out gl_PerVertex {\n" 5678 " vec4 gl_Position;\n" 5679 "};\n" 5680 "void main(){\n" 5681 " gl_Position = x[0] + x[1];\n" 5682 "}\n"; 5683 char const *fsSource = 5684 "#version 400\n" 5685 "#extension GL_ARB_separate_shader_objects: require\n" 5686 "#extension GL_ARB_shading_language_420pack: require\n" 5687 "\n" 5688 "layout(location=0) out vec4 color;\n" 5689 "void main(){\n" 5690 " color = vec4(1);\n" 5691 "}\n"; 5692 5693 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5694 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5695 5696 VkPipelineObj pipe(m_device); 5697 pipe.AddColorAttachment(); 5698 pipe.AddShader(&vs); 5699 pipe.AddShader(&fs); 5700 5701 pipe.AddVertexInputBindings(&input_binding, 1); 5702 pipe.AddVertexInputAttribs(input_attribs, 2); 5703 5704 VkDescriptorSetObj descriptorSet(m_device); 5705 descriptorSet.AppendDummy(); 5706 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5707 5708 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5709 5710 /* expect success */ 5711 if (m_errorMonitor->DesiredMsgFound()) { 5712 FAIL() << "Expected to succeed but: " 5713 << m_errorMonitor->GetFailureMsg(); 5714 m_errorMonitor->DumpFailureMsgs(); 5715 } 5716 } 5717 5718 TEST_F(VkLayerTest, CreatePipelineAttribArrayType) 5719 { 5720 m_errorMonitor->SetDesiredFailureMsg(~0u, ""); 5721 5722 ASSERT_NO_FATAL_FAILURE(InitState()); 5723 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5724 5725 VkVertexInputBindingDescription input_binding; 5726 memset(&input_binding, 0, sizeof(input_binding)); 5727 5728 VkVertexInputAttributeDescription input_attribs[2]; 5729 memset(input_attribs, 0, sizeof(input_attribs)); 5730 5731 for (int i = 0; i < 2; i++) { 5732 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT; 5733 input_attribs[i].location = i; 5734 } 5735 5736 char const *vsSource = 5737 "#version 400\n" 5738 "#extension GL_ARB_separate_shader_objects: require\n" 5739 "#extension GL_ARB_shading_language_420pack: require\n" 5740 "\n" 5741 "layout(location=0) in vec4 x[2];\n" 5742 "out gl_PerVertex {\n" 5743 " vec4 gl_Position;\n" 5744 "};\n" 5745 "void main(){\n" 5746 " gl_Position = x[0] + x[1];\n" 5747 "}\n"; 5748 char const *fsSource = 5749 "#version 400\n" 5750 "#extension GL_ARB_separate_shader_objects: require\n" 5751 "#extension GL_ARB_shading_language_420pack: require\n" 5752 "\n" 5753 "layout(location=0) out vec4 color;\n" 5754 "void main(){\n" 5755 " color = vec4(1);\n" 5756 "}\n"; 5757 5758 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5759 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5760 5761 VkPipelineObj pipe(m_device); 5762 pipe.AddColorAttachment(); 5763 pipe.AddShader(&vs); 5764 pipe.AddShader(&fs); 5765 5766 pipe.AddVertexInputBindings(&input_binding, 1); 5767 pipe.AddVertexInputAttribs(input_attribs, 2); 5768 5769 VkDescriptorSetObj descriptorSet(m_device); 5770 descriptorSet.AppendDummy(); 5771 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5772 5773 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5774 5775 if (m_errorMonitor->DesiredMsgFound()) { 5776 FAIL() << "Expected to succeed but: " << 5777 m_errorMonitor->GetFailureMsg(); 5778 m_errorMonitor->DumpFailureMsgs(); 5779 } 5780 } 5781 5782 TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) { 5783 m_errorMonitor->SetDesiredFailureMsg( 5784 VK_DEBUG_REPORT_ERROR_BIT_EXT, 5785 "Duplicate vertex input binding descriptions for binding 0"); 5786 5787 ASSERT_NO_FATAL_FAILURE(InitState()); 5788 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5789 5790 /* Two binding descriptions for binding 0 */ 5791 VkVertexInputBindingDescription input_bindings[2]; 5792 memset(input_bindings, 0, sizeof(input_bindings)); 5793 5794 VkVertexInputAttributeDescription input_attrib; 5795 memset(&input_attrib, 0, sizeof(input_attrib)); 5796 input_attrib.format = VK_FORMAT_R32_SFLOAT; 5797 5798 char const *vsSource = 5799 "#version 400\n" 5800 "#extension GL_ARB_separate_shader_objects: require\n" 5801 "#extension GL_ARB_shading_language_420pack: require\n" 5802 "\n" 5803 "layout(location=0) in float x;\n" /* attrib provided float */ 5804 "out gl_PerVertex {\n" 5805 " vec4 gl_Position;\n" 5806 "};\n" 5807 "void main(){\n" 5808 " gl_Position = vec4(x);\n" 5809 "}\n"; 5810 char const *fsSource = 5811 "#version 400\n" 5812 "#extension GL_ARB_separate_shader_objects: require\n" 5813 "#extension GL_ARB_shading_language_420pack: require\n" 5814 "\n" 5815 "layout(location=0) out vec4 color;\n" 5816 "void main(){\n" 5817 " color = vec4(1);\n" 5818 "}\n"; 5819 5820 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5821 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5822 5823 VkPipelineObj pipe(m_device); 5824 pipe.AddColorAttachment(); 5825 pipe.AddShader(&vs); 5826 pipe.AddShader(&fs); 5827 5828 pipe.AddVertexInputBindings(input_bindings, 2); 5829 pipe.AddVertexInputAttribs(&input_attrib, 1); 5830 5831 VkDescriptorSetObj descriptorSet(m_device); 5832 descriptorSet.AppendDummy(); 5833 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5834 5835 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5836 5837 if (!m_errorMonitor->DesiredMsgFound()) { 5838 FAIL() << "Did not receive Error 'Duplicate vertex input binding " 5839 "descriptions for binding 0'"; 5840 m_errorMonitor->DumpFailureMsgs(); 5841 } 5842 } 5843 5844 TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) { 5845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 5846 "Attachment 0 not written by FS"); 5847 5848 ASSERT_NO_FATAL_FAILURE(InitState()); 5849 5850 char const *vsSource = 5851 "#version 400\n" 5852 "#extension GL_ARB_separate_shader_objects: require\n" 5853 "#extension GL_ARB_shading_language_420pack: require\n" 5854 "\n" 5855 "out gl_PerVertex {\n" 5856 " vec4 gl_Position;\n" 5857 "};\n" 5858 "void main(){\n" 5859 " gl_Position = vec4(1);\n" 5860 "}\n"; 5861 char const *fsSource = 5862 "#version 400\n" 5863 "#extension GL_ARB_separate_shader_objects: require\n" 5864 "#extension GL_ARB_shading_language_420pack: require\n" 5865 "\n" 5866 "void main(){\n" 5867 "}\n"; 5868 5869 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5870 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5871 5872 VkPipelineObj pipe(m_device); 5873 pipe.AddShader(&vs); 5874 pipe.AddShader(&fs); 5875 5876 /* set up CB 0, not written */ 5877 pipe.AddColorAttachment(); 5878 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5879 5880 VkDescriptorSetObj descriptorSet(m_device); 5881 descriptorSet.AppendDummy(); 5882 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5883 5884 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5885 5886 if (!m_errorMonitor->DesiredMsgFound()) { 5887 FAIL() << "Did not receive Error 'Attachment 0 not written by FS'"; 5888 m_errorMonitor->DumpFailureMsgs(); 5889 } 5890 } 5891 5892 TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) { 5893 // TODO: verify that this matches layer 5894 m_errorMonitor->SetDesiredFailureMsg( 5895 VK_DEBUG_REPORT_WARNING_BIT_EXT, 5896 "FS writes to output location 1 with no matching attachment"); 5897 5898 ASSERT_NO_FATAL_FAILURE(InitState()); 5899 5900 char const *vsSource = 5901 "#version 400\n" 5902 "#extension GL_ARB_separate_shader_objects: require\n" 5903 "#extension GL_ARB_shading_language_420pack: require\n" 5904 "\n" 5905 "out gl_PerVertex {\n" 5906 " vec4 gl_Position;\n" 5907 "};\n" 5908 "void main(){\n" 5909 " gl_Position = vec4(1);\n" 5910 "}\n"; 5911 char const *fsSource = 5912 "#version 400\n" 5913 "#extension GL_ARB_separate_shader_objects: require\n" 5914 "#extension GL_ARB_shading_language_420pack: require\n" 5915 "\n" 5916 "layout(location=0) out vec4 x;\n" 5917 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */ 5918 "void main(){\n" 5919 " x = vec4(1);\n" 5920 " y = vec4(1);\n" 5921 "}\n"; 5922 5923 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5924 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5925 5926 VkPipelineObj pipe(m_device); 5927 pipe.AddShader(&vs); 5928 pipe.AddShader(&fs); 5929 5930 /* set up CB 0, not written */ 5931 pipe.AddColorAttachment(); 5932 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5933 /* FS writes CB 1, but we don't configure it */ 5934 5935 VkDescriptorSetObj descriptorSet(m_device); 5936 descriptorSet.AppendDummy(); 5937 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5938 5939 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5940 5941 if (!m_errorMonitor->DesiredMsgFound()) { 5942 FAIL() << "Did not receive Error 'FS writes to output location 1 with " 5943 "no matching attachment'"; 5944 m_errorMonitor->DumpFailureMsgs(); 5945 } 5946 } 5947 5948 TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) { 5949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 5950 "does not match FS output type"); 5951 5952 ASSERT_NO_FATAL_FAILURE(InitState()); 5953 5954 char const *vsSource = 5955 "#version 400\n" 5956 "#extension GL_ARB_separate_shader_objects: require\n" 5957 "#extension GL_ARB_shading_language_420pack: require\n" 5958 "\n" 5959 "out gl_PerVertex {\n" 5960 " vec4 gl_Position;\n" 5961 "};\n" 5962 "void main(){\n" 5963 " gl_Position = vec4(1);\n" 5964 "}\n"; 5965 char const *fsSource = 5966 "#version 400\n" 5967 "#extension GL_ARB_separate_shader_objects: require\n" 5968 "#extension GL_ARB_shading_language_420pack: require\n" 5969 "\n" 5970 "layout(location=0) out ivec4 x;\n" /* not UNORM */ 5971 "void main(){\n" 5972 " x = ivec4(1);\n" 5973 "}\n"; 5974 5975 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 5976 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 5977 5978 VkPipelineObj pipe(m_device); 5979 pipe.AddShader(&vs); 5980 pipe.AddShader(&fs); 5981 5982 /* set up CB 0; type is UNORM by default */ 5983 pipe.AddColorAttachment(); 5984 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 5985 5986 VkDescriptorSetObj descriptorSet(m_device); 5987 descriptorSet.AppendDummy(); 5988 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 5989 5990 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 5991 5992 if (!m_errorMonitor->DesiredMsgFound()) { 5993 FAIL() << "Did not receive Error 'does not match FS output type'"; 5994 m_errorMonitor->DumpFailureMsgs(); 5995 } 5996 } 5997 5998 TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) { 5999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 6000 "not declared in pipeline layout"); 6001 6002 ASSERT_NO_FATAL_FAILURE(InitState()); 6003 6004 char const *vsSource = 6005 "#version 400\n" 6006 "#extension GL_ARB_separate_shader_objects: require\n" 6007 "#extension GL_ARB_shading_language_420pack: require\n" 6008 "\n" 6009 "out gl_PerVertex {\n" 6010 " vec4 gl_Position;\n" 6011 "};\n" 6012 "void main(){\n" 6013 " gl_Position = vec4(1);\n" 6014 "}\n"; 6015 char const *fsSource = 6016 "#version 400\n" 6017 "#extension GL_ARB_separate_shader_objects: require\n" 6018 "#extension GL_ARB_shading_language_420pack: require\n" 6019 "\n" 6020 "layout(location=0) out vec4 x;\n" 6021 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n" 6022 "void main(){\n" 6023 " x = vec4(bar.y);\n" 6024 "}\n"; 6025 6026 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 6027 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 6028 6029 VkPipelineObj pipe(m_device); 6030 pipe.AddShader(&vs); 6031 pipe.AddShader(&fs); 6032 6033 /* set up CB 0; type is UNORM by default */ 6034 pipe.AddColorAttachment(); 6035 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 6036 6037 VkDescriptorSetObj descriptorSet(m_device); 6038 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 6039 6040 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 6041 6042 /* should have generated an error -- pipeline layout does not 6043 * provide a uniform buffer in 0.0 6044 */ 6045 if (!m_errorMonitor->DesiredMsgFound()) { 6046 FAIL() << "Did not receive Error 'not declared in pipeline layout'"; 6047 m_errorMonitor->DumpFailureMsgs(); 6048 } 6049 } 6050 6051 TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) { 6052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 6053 "not declared in layout"); 6054 6055 ASSERT_NO_FATAL_FAILURE(InitState()); 6056 6057 char const *vsSource = 6058 "#version 450\n" 6059 "#extension GL_ARB_separate_shader_objects: require\n" 6060 "#extension GL_ARB_shading_language_420pack: require\n" 6061 "\n" 6062 "layout(push_constant, std430) uniform foo { float x; } consts;\n" 6063 "out gl_PerVertex {\n" 6064 " vec4 gl_Position;\n" 6065 "};\n" 6066 "void main(){\n" 6067 " gl_Position = vec4(consts.x);\n" 6068 "}\n"; 6069 char const *fsSource = 6070 "#version 450\n" 6071 "#extension GL_ARB_separate_shader_objects: require\n" 6072 "#extension GL_ARB_shading_language_420pack: require\n" 6073 "\n" 6074 "layout(location=0) out vec4 x;\n" 6075 "void main(){\n" 6076 " x = vec4(1);\n" 6077 "}\n"; 6078 6079 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this); 6080 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this); 6081 6082 VkPipelineObj pipe(m_device); 6083 pipe.AddShader(&vs); 6084 pipe.AddShader(&fs); 6085 6086 /* set up CB 0; type is UNORM by default */ 6087 pipe.AddColorAttachment(); 6088 ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); 6089 6090 VkDescriptorSetObj descriptorSet(m_device); 6091 descriptorSet.CreateVKDescriptorSet(m_commandBuffer); 6092 6093 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass()); 6094 6095 /* should have generated an error -- no push constant ranges provided! */ 6096 if (!m_errorMonitor->DesiredMsgFound()) { 6097 FAIL() << "Did not receive Error 'not declared in pipeline layout'"; 6098 m_errorMonitor->DumpFailureMsgs(); 6099 } 6100 } 6101 6102 #endif // SHADER_CHECKER_TESTS 6103 6104 #if DEVICE_LIMITS_TESTS 6105 TEST_F(VkLayerTest, CreateImageLimitsViolationWidth) { 6106 m_errorMonitor->SetDesiredFailureMsg( 6107 VK_DEBUG_REPORT_ERROR_BIT_EXT, 6108 "CreateImage extents exceed allowable limits for format"); 6109 6110 ASSERT_NO_FATAL_FAILURE(InitState()); 6111 6112 // Create an image 6113 VkImage image; 6114 6115 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM; 6116 const int32_t tex_width = 32; 6117 const int32_t tex_height = 32; 6118 6119 VkImageCreateInfo image_create_info = {}; 6120 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 6121 image_create_info.pNext = NULL; 6122 image_create_info.imageType = VK_IMAGE_TYPE_2D; 6123 image_create_info.format = tex_format; 6124 image_create_info.extent.width = tex_width; 6125 image_create_info.extent.height = tex_height; 6126 image_create_info.extent.depth = 1; 6127 image_create_info.mipLevels = 1; 6128 image_create_info.arrayLayers = 1; 6129 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 6130 image_create_info.tiling = VK_IMAGE_TILING_LINEAR; 6131 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT; 6132 image_create_info.flags = 0; 6133 6134 // Introduce error by sending down a bogus width extent 6135 image_create_info.extent.width = 65536; 6136 vkCreateImage(m_device->device(), &image_create_info, NULL, &image); 6137 6138 if (!m_errorMonitor->DesiredMsgFound()) { 6139 FAIL() << "Did not receive Error 'CreateImage extents exceed allowable " 6140 "limits for format'"; 6141 m_errorMonitor->DumpFailureMsgs(); 6142 } 6143 } 6144 6145 TEST_F(VkLayerTest, UpdateBufferAlignment) { 6146 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8}; 6147 6148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 6149 "dstOffset, is not a multiple of 4"); 6150 6151 ASSERT_NO_FATAL_FAILURE(InitState()); 6152 6153 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; 6154 vk_testing::Buffer buffer; 6155 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs); 6156 6157 BeginCommandBuffer(); 6158 // Introduce failure by using offset that is not multiple of 4 6159 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData); 6160 if (!m_errorMonitor->DesiredMsgFound()) { 6161 FAIL() << "Did not receive Error 'vkCommandUpdateBuffer parameter, " 6162 "VkDeviceSize dstOffset, is not a multiple of 4'"; 6163 m_errorMonitor->DumpFailureMsgs(); 6164 } 6165 6166 // Introduce failure by using size that is not multiple of 4 6167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 6168 "dataSize, is not a multiple of 4"); 6169 6170 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData); 6171 6172 if (!m_errorMonitor->DesiredMsgFound()) { 6173 FAIL() << "Did not receive Error 'vkCommandUpdateBuffer parameter, " 6174 "VkDeviceSize dataSize, is not a multiple of 4'"; 6175 m_errorMonitor->DumpFailureMsgs(); 6176 } 6177 EndCommandBuffer(); 6178 } 6179 6180 TEST_F(VkLayerTest, FillBufferAlignment) { 6181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 6182 "dstOffset, is not a multiple of 4"); 6183 6184 ASSERT_NO_FATAL_FAILURE(InitState()); 6185 6186 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; 6187 vk_testing::Buffer buffer; 6188 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs); 6189 6190 BeginCommandBuffer(); 6191 // Introduce failure by using offset that is not multiple of 4 6192 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111); 6193 if (!m_errorMonitor->DesiredMsgFound()) { 6194 FAIL() << "Did not receive Error 'vkCommandFillBuffer parameter, " 6195 "VkDeviceSize dstOffset, is not a multiple of 4'"; 6196 m_errorMonitor->DumpFailureMsgs(); 6197 } 6198 6199 // Introduce failure by using size that is not multiple of 4 6200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 6201 "size, is not a multiple of 4"); 6202 6203 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111); 6204 6205 if (!m_errorMonitor->DesiredMsgFound()) { 6206 FAIL() << "Did not receive Error 'vkCommandFillBuffer parameter, " 6207 "VkDeviceSize size, is not a multiple of 4'"; 6208 m_errorMonitor->DumpFailureMsgs(); 6209 } 6210 EndCommandBuffer(); 6211 } 6212 6213 #endif // DEVICE_LIMITS_TESTS 6214 6215 #if IMAGE_TESTS 6216 TEST_F(VkLayerTest, InvalidImageView) { 6217 VkResult err; 6218 6219 m_errorMonitor->SetDesiredFailureMsg( 6220 VK_DEBUG_REPORT_ERROR_BIT_EXT, 6221 "vkCreateImageView called with baseMipLevel 10 "); 6222 6223 ASSERT_NO_FATAL_FAILURE(InitState()); 6224 6225 // Create an image and try to create a view with bad baseMipLevel 6226 VkImage image; 6227 6228 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM; 6229 const int32_t tex_width = 32; 6230 const int32_t tex_height = 32; 6231 6232 VkImageCreateInfo image_create_info = {}; 6233 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 6234 image_create_info.pNext = NULL; 6235 image_create_info.imageType = VK_IMAGE_TYPE_2D; 6236 image_create_info.format = tex_format; 6237 image_create_info.extent.width = tex_width; 6238 image_create_info.extent.height = tex_height; 6239 image_create_info.extent.depth = 1; 6240 image_create_info.mipLevels = 1; 6241 image_create_info.arrayLayers = 1; 6242 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 6243 image_create_info.tiling = VK_IMAGE_TILING_LINEAR; 6244 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT; 6245 image_create_info.flags = 0; 6246 6247 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image); 6248 ASSERT_VK_SUCCESS(err); 6249 6250 VkImageViewCreateInfo image_view_create_info = {}; 6251 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 6252 image_view_create_info.image = image; 6253 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D; 6254 image_view_create_info.format = tex_format; 6255 image_view_create_info.subresourceRange.layerCount = 1; 6256 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error 6257 image_view_create_info.subresourceRange.levelCount = 1; 6258 image_view_create_info.subresourceRange.aspectMask = 6259 VK_IMAGE_ASPECT_COLOR_BIT; 6260 6261 VkImageView view; 6262 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, 6263 &view); 6264 6265 if (!m_errorMonitor->DesiredMsgFound()) { 6266 FAIL() << "Did not receive Error 'vkCreateImageView called with " 6267 "baseMipLevel 10...'"; 6268 m_errorMonitor->DumpFailureMsgs(); 6269 } 6270 } 6271 6272 TEST_F(VkLayerTest, InvalidImageViewAspect) { 6273 VkResult err; 6274 6275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, 6276 "vkCreateImageView: Color image " 6277 "formats must have ONLY the " 6278 "VK_IMAGE_ASPECT_COLOR_BIT set"); 6279 6280 ASSERT_NO_FATAL_FAILURE(InitState()); 6281 6282 // Create an image and try to create a view with an invalid aspectMask 6283 VkImage image; 6284 6285 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM; 6286 const int32_t tex_width = 32; 6287 const int32_t tex_height = 32; 6288 6289 VkImageCreateInfo image_create_info = {}; 6290 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 6291 image_create_info.pNext = NULL; 6292 image_create_info.imageType = VK_IMAGE_TYPE_2D; 6293 image_create_info.format = tex_format; 6294 image_create_info.extent.width = tex_width; 6295 image_create_info.extent.height = tex_height; 6296 image_create_info.extent.depth = 1; 6297 image_create_info.mipLevels = 1; 6298 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 6299 image_create_info.tiling = VK_IMAGE_TILING_LINEAR; 6300 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT; 6301 image_create_info.flags = 0; 6302 6303 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image); 6304 ASSERT_VK_SUCCESS(err); 6305 6306 VkImageViewCreateInfo image_view_create_info = {}; 6307 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 6308 image_view_create_info.image = image; 6309 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D; 6310 image_view_create_info.format = tex_format; 6311 image_view_create_info.subresourceRange.baseMipLevel = 0; 6312 image_view_create_info.subresourceRange.levelCount = 1; 6313 // Cause an error by setting an invalid image aspect 6314 image_view_create_info.subresourceRange.aspectMask = 6315 VK_IMAGE_ASPECT_METADATA_BIT; 6316 6317 VkImageView view; 6318 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, 6319 &view); 6320 6321 if (!m_errorMonitor->DesiredMsgFound()) { 6322 FAIL() << "Did not receive Error 'VkCreateImageView: Color image " 6323 "formats must have ...'"; 6324 m_errorMonitor->DumpFailureMsgs(); 6325 } 6326 } 6327 6328 TEST_F(VkLayerTest, CopyImageTypeMismatch) { 6329 VkResult err; 6330 bool pass; 6331 6332 m_errorMonitor->SetDesiredFailureMsg( 6333 VK_DEBUG_REPORT_ERROR_BIT_EXT, 6334 "vkCmdCopyImage called with unmatched source and dest image types"); 6335 6336 ASSERT_NO_FATAL_FAILURE(InitState()); 6337 6338 // Create two images of different types and try to copy between them 6339 VkImage srcImage; 6340 VkImage dstImage; 6341 VkDeviceMemory srcMem; 6342 VkDeviceMemory destMem; 6343 VkMemoryRequirements memReqs; 6344 6345 VkImageCreateInfo image_create_info = {}; 6346 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 6347 image_create_info.pNext = NULL; 6348 image_create_info.imageType = VK_IMAGE_TYPE_2D; 6349 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM; 6350 image_create_info.extent.width = 32; 6351 image_create_info.extent.height = 32; 6352 image_create_info.extent.depth = 1; 6353 image_create_info.mipLevels = 1; 6354 image_create_info.arrayLayers = 1; 6355 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 6356 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL; 6357 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT; 6358 image_create_info.flags = 0; 6359 6360 err = 6361 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage); 6362 ASSERT_VK_SUCCESS(err); 6363 6364 image_create_info.imageType = VK_IMAGE_TYPE_1D; 6365 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT; 6366 6367 err = 6368 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage); 6369 ASSERT_VK_SUCCESS(err); 6370 6371 // Allocate memory 6372 VkMemoryAllocateInfo memAlloc = {}; 6373 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 6374 memAlloc.pNext = NULL; 6375 memAlloc.allocationSize = 0; 6376 memAlloc.memoryTypeIndex = 0; 6377 6378 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs); 6379 memAlloc.allocationSize = memReqs.size; 6380 pass = 6381 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0); 6382 ASSERT_TRUE(pass); 6383 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem); 6384 ASSERT_VK_SUCCESS(err); 6385 6386 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs); 6387 memAlloc.allocationSize = memReqs.size; 6388 pass = 6389 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0); 6390 ASSERT_VK_SUCCESS(err); 6391 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem); 6392 ASSERT_VK_SUCCESS(err); 6393 6394 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0); 6395 ASSERT_VK_SUCCESS(err); 6396 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0); 6397 ASSERT_VK_SUCCESS(err); 6398 6399 BeginCommandBuffer(); 6400 VkImageCopy copyRegion; 6401 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 6402 copyRegion.srcSubresource.mipLevel = 0; 6403 copyRegion.srcSubresource.baseArrayLayer = 0; 6404 copyRegion.srcSubresource.layerCount = 0; 6405 copyRegion.srcOffset.x = 0; 6406 copyRegion.srcOffset.y = 0; 6407 copyRegion.srcOffset.z = 0; 6408 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 6409 copyRegion.dstSubresource.mipLevel = 0; 6410 copyRegion.dstSubresource.baseArrayLayer = 0; 6411 copyRegion.dstSubresource.layerCount = 0; 6412 copyRegion.dstOffset.x = 0; 6413 copyRegion.dstOffset.y = 0; 6414 copyRegion.dstOffset.z = 0; 6415 copyRegion.extent.width = 1; 6416 copyRegion.extent.height = 1; 6417 copyRegion.extent.depth = 1; 6418 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, 6419 VK_IMAGE_LAYOUT_GENERAL, 1, ©Region); 6420 EndCommandBuffer(); 6421 6422 if (!m_errorMonitor->DesiredMsgFound()) { 6423 FAIL() << "Did not receive Error 'vkCmdCopyImage called with unmatched " 6424 "source and dest image types'"; 6425 m_errorMonitor->DumpFailureMsgs(); 6426 } 6427 6428 vkDestroyImage(m_device->device(), srcImage, NULL); 6429 vkDestroyImage(m_device->device(), dstImage, NULL); 6430 vkFreeMemory(m_device->device(), srcMem, NULL); 6431 vkFreeMemory(m_device->device(), destMem, NULL); 6432 } 6433 6434 TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) { 6435 // TODO : Create two images with different format sizes and vkCmdCopyImage 6436 // between them 6437 } 6438 6439 TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) { 6440 VkResult err; 6441 bool pass; 6442 6443 m_errorMonitor->SetDesiredFailureMsg( 6444 VK_DEBUG_REPORT_ERROR_BIT_EXT, 6445 "vkCmdCopyImage called with unmatched source and dest image types"); 6446 6447 ASSERT_NO_FATAL_FAILURE(InitState()); 6448 6449 // Create two images of different types and try to copy between them 6450 VkImage srcImage; 6451 VkImage dstImage; 6452 VkDeviceMemory srcMem; 6453 VkDeviceMemory destMem; 6454 VkMemoryRequirements memReqs; 6455 6456 VkImageCreateInfo image_create_info = {}; 6457 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 6458 image_create_info.pNext = NULL; 6459 image_create_info.imageType = VK_IMAGE_TYPE_2D; 6460 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM; 6461 image_create_info.extent.width = 32; 6462 image_create_info.extent.height = 32; 6463 image_create_info.extent.depth = 1; 6464 image_create_info.mipLevels = 1; 6465 image_create_info.arrayLayers = 1; 6466 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 6467 image_create_info.tiling = VK_IMAGE_TILING_LINEAR; 6468 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT; 6469 image_create_info.flags = 0; 6470 6471 err = 6472 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage); 6473 ASSERT_VK_SUCCESS(err); 6474 6475 image_create_info.imageType = VK_IMAGE_TYPE_1D; 6476 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL; 6477 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT; 6478 6479 err = 6480 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage); 6481 ASSERT_VK_SUCCESS(err); 6482 6483 // Allocate memory 6484 VkMemoryAllocateInfo memAlloc = {}; 6485 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 6486 memAlloc.pNext = NULL; 6487 memAlloc.allocationSize = 0; 6488 memAlloc.memoryTypeIndex = 0; 6489 6490 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs); 6491 memAlloc.allocationSize = memReqs.size; 6492 pass = 6493 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0); 6494 ASSERT_TRUE(pass); 6495 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem); 6496 ASSERT_VK_SUCCESS(err); 6497 6498 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs); 6499 memAlloc.allocationSize = memReqs.size; 6500 pass = 6501 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0); 6502 ASSERT_TRUE(pass); 6503 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem); 6504 ASSERT_VK_SUCCESS(err); 6505 6506 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0); 6507 ASSERT_VK_SUCCESS(err); 6508 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0); 6509 ASSERT_VK_SUCCESS(err); 6510 6511 BeginCommandBuffer(); 6512 VkImageCopy copyRegion; 6513 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 6514 copyRegion.srcSubresource.mipLevel = 0; 6515 copyRegion.srcSubresource.baseArrayLayer = 0; 6516 copyRegion.srcSubresource.layerCount = 0; 6517 copyRegion.srcOffset.x = 0; 6518 copyRegion.srcOffset.y = 0; 6519 copyRegion.srcOffset.z = 0; 6520 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 6521 copyRegion.dstSubresource.mipLevel = 0; 6522 copyRegion.dstSubresource.baseArrayLayer = 0; 6523 copyRegion.dstSubresource.layerCount = 0; 6524 copyRegion.dstOffset.x = 0; 6525 copyRegion.dstOffset.y = 0; 6526 copyRegion.dstOffset.z = 0; 6527 copyRegion.extent.width = 1; 6528 copyRegion.extent.height = 1; 6529 copyRegion.extent.depth = 1; 6530 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, 6531 VK_IMAGE_LAYOUT_GENERAL, 1, ©Region); 6532 EndCommandBuffer(); 6533 6534 if (!m_errorMonitor->DesiredMsgFound()) { 6535 FAIL() << "Did not receive Error 'vkCmdCopyImage called with unmatched " 6536 "source and dest image types'"; 6537 m_errorMonitor->DumpFailureMsgs(); 6538 } 6539 6540 vkDestroyImage(m_device->device(), srcImage, NULL); 6541 vkDestroyImage(m_device->device(), dstImage, NULL); 6542 vkFreeMemory(m_device->device(), srcMem, NULL); 6543 vkFreeMemory(m_device->device(), destMem, NULL); 6544 } 6545 6546 TEST_F(VkLayerTest, ResolveImageLowSampleCount) { 6547 VkResult err; 6548 bool pass; 6549 6550 m_errorMonitor->SetDesiredFailureMsg( 6551 VK_DEBUG_REPORT_ERROR_BIT_EXT, 6552 "vkCmdResolveImage called with source sample count less than 2."); 6553 6554 ASSERT_NO_FATAL_FAILURE(InitState()); 6555 6556 // Create two images of sample count 1 and try to Resolve between them 6557 VkImage srcImage; 6558 VkImage dstImage; 6559 VkDeviceMemory srcMem; 6560 VkDeviceMemory destMem; 6561 VkMemoryRequirements memReqs; 6562 6563 VkImageCreateInfo image_create_info = {}; 6564 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 6565 image_create_info.pNext = NULL; 6566 image_create_info.imageType = VK_IMAGE_TYPE_2D; 6567 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM; 6568 image_create_info.extent.width = 32; 6569 image_create_info.extent.height = 1; 6570 image_create_info.extent.depth = 1; 6571 image_create_info.mipLevels = 1; 6572 image_create_info.arrayLayers = 1; 6573 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 6574 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL; 6575 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT; 6576 image_create_info.flags = 0; 6577 6578 err = 6579 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage); 6580 ASSERT_VK_SUCCESS(err); 6581 6582 image_create_info.imageType = VK_IMAGE_TYPE_1D; 6583 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT; 6584 6585 err = 6586 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage); 6587 ASSERT_VK_SUCCESS(err); 6588 6589 // Allocate memory 6590 VkMemoryAllocateInfo memAlloc = {}; 6591 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 6592 memAlloc.pNext = NULL; 6593 memAlloc.allocationSize = 0; 6594 memAlloc.memoryTypeIndex = 0; 6595 6596 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs); 6597 memAlloc.allocationSize = memReqs.size; 6598 pass = 6599 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0); 6600 ASSERT_TRUE(pass); 6601 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem); 6602 ASSERT_VK_SUCCESS(err); 6603 6604 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs); 6605 memAlloc.allocationSize = memReqs.size; 6606 pass = 6607 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0); 6608 ASSERT_TRUE(pass); 6609 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem); 6610 ASSERT_VK_SUCCESS(err); 6611 6612 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0); 6613 ASSERT_VK_SUCCESS(err); 6614 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0); 6615 ASSERT_VK_SUCCESS(err); 6616 6617 BeginCommandBuffer(); 6618 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest? 6619 // VK_IMAGE_LAYOUT_UNDEFINED = 0, 6620 // VK_IMAGE_LAYOUT_GENERAL = 1, 6621 VkImageResolve resolveRegion; 6622 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 6623 resolveRegion.srcSubresource.mipLevel = 0; 6624 resolveRegion.srcSubresource.baseArrayLayer = 0; 6625 resolveRegion.srcSubresource.layerCount = 0; 6626 resolveRegion.srcOffset.x = 0; 6627 resolveRegion.srcOffset.y = 0; 6628 resolveRegion.srcOffset.z = 0; 6629 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 6630 resolveRegion.dstSubresource.mipLevel = 0; 6631 resolveRegion.dstSubresource.baseArrayLayer = 0; 6632 resolveRegion.dstSubresource.layerCount = 0; 6633 resolveRegion.dstOffset.x = 0; 6634 resolveRegion.dstOffset.y = 0; 6635 resolveRegion.dstOffset.z = 0; 6636 resolveRegion.extent.width = 1; 6637 resolveRegion.extent.height = 1; 6638 resolveRegion.extent.depth = 1; 6639 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, 6640 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion); 6641 EndCommandBuffer(); 6642 6643 if (!m_errorMonitor->DesiredMsgFound()) { 6644 FAIL() << "Did not receive Error 'vkCmdResolveImage called with source " 6645 "sample count less than 2.'"; 6646 m_errorMonitor->DumpFailureMsgs(); 6647 } 6648 6649 vkDestroyImage(m_device->device(), srcImage, NULL); 6650 vkDestroyImage(m_device->device(), dstImage, NULL); 6651 vkFreeMemory(m_device->device(), srcMem, NULL); 6652 vkFreeMemory(m_device->device(), destMem, NULL); 6653 } 6654 6655 TEST_F(VkLayerTest, ResolveImageHighSampleCount) { 6656 VkResult err; 6657 bool pass; 6658 6659 m_errorMonitor->SetDesiredFailureMsg( 6660 VK_DEBUG_REPORT_ERROR_BIT_EXT, 6661 "vkCmdResolveImage called with dest sample count greater than 1."); 6662 6663 ASSERT_NO_FATAL_FAILURE(InitState()); 6664 6665 // Create two images of sample count 2 and try to Resolve between them 6666 VkImage srcImage; 6667 VkImage dstImage; 6668 VkDeviceMemory srcMem; 6669 VkDeviceMemory destMem; 6670 VkMemoryRequirements memReqs; 6671 6672 VkImageCreateInfo image_create_info = {}; 6673 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 6674 image_create_info.pNext = NULL; 6675 image_create_info.imageType = VK_IMAGE_TYPE_2D; 6676 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM; 6677 image_create_info.extent.width = 32; 6678 image_create_info.extent.height = 1; 6679 image_create_info.extent.depth = 1; 6680 image_create_info.mipLevels = 1; 6681 image_create_info.arrayLayers = 1; 6682 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT; 6683 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL; 6684 // Note: Some implementations expect color attachment usage for any 6685 // multisample surface 6686 image_create_info.usage = 6687 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 6688 image_create_info.flags = 0; 6689 6690 err = 6691 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage); 6692 ASSERT_VK_SUCCESS(err); 6693 6694 image_create_info.imageType = VK_IMAGE_TYPE_1D; 6695 // Note: Some implementations expect color attachment usage for any 6696 // multisample surface 6697 image_create_info.usage = 6698 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 6699 6700 err = 6701 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage); 6702 ASSERT_VK_SUCCESS(err); 6703 6704 // Allocate memory 6705 VkMemoryAllocateInfo memAlloc = {}; 6706 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 6707 memAlloc.pNext = NULL; 6708 memAlloc.allocationSize = 0; 6709 memAlloc.memoryTypeIndex = 0; 6710 6711 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs); 6712 memAlloc.allocationSize = memReqs.size; 6713 pass = 6714 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0); 6715 ASSERT_TRUE(pass); 6716 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem); 6717 ASSERT_VK_SUCCESS(err); 6718 6719 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs); 6720 memAlloc.allocationSize = memReqs.size; 6721 pass = 6722 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0); 6723 ASSERT_TRUE(pass); 6724 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem); 6725 ASSERT_VK_SUCCESS(err); 6726 6727 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0); 6728 ASSERT_VK_SUCCESS(err); 6729 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0); 6730 ASSERT_VK_SUCCESS(err); 6731 6732 BeginCommandBuffer(); 6733 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest? 6734 // VK_IMAGE_LAYOUT_UNDEFINED = 0, 6735 // VK_IMAGE_LAYOUT_GENERAL = 1, 6736 VkImageResolve resolveRegion; 6737 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 6738 resolveRegion.srcSubresource.mipLevel = 0; 6739 resolveRegion.srcSubresource.baseArrayLayer = 0; 6740 resolveRegion.srcSubresource.layerCount = 0; 6741 resolveRegion.srcOffset.x = 0; 6742 resolveRegion.srcOffset.y = 0; 6743 resolveRegion.srcOffset.z = 0; 6744 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 6745 resolveRegion.dstSubresource.mipLevel = 0; 6746 resolveRegion.dstSubresource.baseArrayLayer = 0; 6747 resolveRegion.dstSubresource.layerCount = 0; 6748 resolveRegion.dstOffset.x = 0; 6749 resolveRegion.dstOffset.y = 0; 6750 resolveRegion.dstOffset.z = 0; 6751 resolveRegion.extent.width = 1; 6752 resolveRegion.extent.height = 1; 6753 resolveRegion.extent.depth = 1; 6754 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, 6755 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion); 6756 EndCommandBuffer(); 6757 6758 if (!m_errorMonitor->DesiredMsgFound()) { 6759 FAIL() << "Did not receive Error 'vkCmdResolveImage called with dest " 6760 "sample count greater than 1.'"; 6761 m_errorMonitor->DumpFailureMsgs(); 6762 } 6763 6764 vkDestroyImage(m_device->device(), srcImage, NULL); 6765 vkDestroyImage(m_device->device(), dstImage, NULL); 6766 vkFreeMemory(m_device->device(), srcMem, NULL); 6767 vkFreeMemory(m_device->device(), destMem, NULL); 6768 } 6769 6770 TEST_F(VkLayerTest, ResolveImageFormatMismatch) { 6771 VkResult err; 6772 bool pass; 6773 6774 m_errorMonitor->SetDesiredFailureMsg( 6775 VK_DEBUG_REPORT_ERROR_BIT_EXT, 6776 "vkCmdResolveImage called with unmatched source and dest formats."); 6777 6778 ASSERT_NO_FATAL_FAILURE(InitState()); 6779 6780 // Create two images of different types and try to copy between them 6781 VkImage srcImage; 6782 VkImage dstImage; 6783 VkDeviceMemory srcMem; 6784 VkDeviceMemory destMem; 6785 VkMemoryRequirements memReqs; 6786 6787 VkImageCreateInfo image_create_info = {}; 6788 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 6789 image_create_info.pNext = NULL; 6790 image_create_info.imageType = VK_IMAGE_TYPE_2D; 6791 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM; 6792 image_create_info.extent.width = 32; 6793 image_create_info.extent.height = 1; 6794 image_create_info.extent.depth = 1; 6795 image_create_info.mipLevels = 1; 6796 image_create_info.arrayLayers = 1; 6797 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT; 6798 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL; 6799 // Note: Some implementations expect color attachment usage for any 6800 // multisample surface 6801 image_create_info.usage = 6802 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 6803 image_create_info.flags = 0; 6804 6805 err = 6806 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage); 6807 ASSERT_VK_SUCCESS(err); 6808 6809 // Set format to something other than source image 6810 image_create_info.format = VK_FORMAT_R32_SFLOAT; 6811 // Note: Some implementations expect color attachment usage for any 6812 // multisample surface 6813 image_create_info.usage = 6814 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 6815 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 6816 6817 err = 6818 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage); 6819 ASSERT_VK_SUCCESS(err); 6820 6821 // Allocate memory 6822 VkMemoryAllocateInfo memAlloc = {}; 6823 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 6824 memAlloc.pNext = NULL; 6825 memAlloc.allocationSize = 0; 6826 memAlloc.memoryTypeIndex = 0; 6827 6828 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs); 6829 memAlloc.allocationSize = memReqs.size; 6830 pass = 6831 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0); 6832 ASSERT_TRUE(pass); 6833 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem); 6834 ASSERT_VK_SUCCESS(err); 6835 6836 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs); 6837 memAlloc.allocationSize = memReqs.size; 6838 pass = 6839 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0); 6840 ASSERT_TRUE(pass); 6841 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem); 6842 ASSERT_VK_SUCCESS(err); 6843 6844 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0); 6845 ASSERT_VK_SUCCESS(err); 6846 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0); 6847 ASSERT_VK_SUCCESS(err); 6848 6849 BeginCommandBuffer(); 6850 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest? 6851 // VK_IMAGE_LAYOUT_UNDEFINED = 0, 6852 // VK_IMAGE_LAYOUT_GENERAL = 1, 6853 VkImageResolve resolveRegion; 6854 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 6855 resolveRegion.srcSubresource.mipLevel = 0; 6856 resolveRegion.srcSubresource.baseArrayLayer = 0; 6857 resolveRegion.srcSubresource.layerCount = 0; 6858 resolveRegion.srcOffset.x = 0; 6859 resolveRegion.srcOffset.y = 0; 6860 resolveRegion.srcOffset.z = 0; 6861 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 6862 resolveRegion.dstSubresource.mipLevel = 0; 6863 resolveRegion.dstSubresource.baseArrayLayer = 0; 6864 resolveRegion.dstSubresource.layerCount = 0; 6865 resolveRegion.dstOffset.x = 0; 6866 resolveRegion.dstOffset.y = 0; 6867 resolveRegion.dstOffset.z = 0; 6868 resolveRegion.extent.width = 1; 6869 resolveRegion.extent.height = 1; 6870 resolveRegion.extent.depth = 1; 6871 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, 6872 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion); 6873 EndCommandBuffer(); 6874 6875 if (!m_errorMonitor->DesiredMsgFound()) { 6876 FAIL() << "Did not receive Error 'vkCmdResolveImage called with " 6877 "unmatched source and dest formats.'"; 6878 m_errorMonitor->DumpFailureMsgs(); 6879 } 6880 6881 vkDestroyImage(m_device->device(), srcImage, NULL); 6882 vkDestroyImage(m_device->device(), dstImage, NULL); 6883 vkFreeMemory(m_device->device(), srcMem, NULL); 6884 vkFreeMemory(m_device->device(), destMem, NULL); 6885 } 6886 6887 TEST_F(VkLayerTest, ResolveImageTypeMismatch) { 6888 VkResult err; 6889 bool pass; 6890 6891 m_errorMonitor->SetDesiredFailureMsg( 6892 VK_DEBUG_REPORT_ERROR_BIT_EXT, 6893 "vkCmdResolveImage called with unmatched source and dest image types."); 6894 6895 ASSERT_NO_FATAL_FAILURE(InitState()); 6896 6897 // Create two images of different types and try to copy between them 6898 VkImage srcImage; 6899 VkImage dstImage; 6900 VkDeviceMemory srcMem; 6901 VkDeviceMemory destMem; 6902 VkMemoryRequirements memReqs; 6903 6904 VkImageCreateInfo image_create_info = {}; 6905 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 6906 image_create_info.pNext = NULL; 6907 image_create_info.imageType = VK_IMAGE_TYPE_2D; 6908 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM; 6909 image_create_info.extent.width = 32; 6910 image_create_info.extent.height = 1; 6911 image_create_info.extent.depth = 1; 6912 image_create_info.mipLevels = 1; 6913 image_create_info.arrayLayers = 1; 6914 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT; 6915 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL; 6916 // Note: Some implementations expect color attachment usage for any 6917 // multisample surface 6918 image_create_info.usage = 6919 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 6920 image_create_info.flags = 0; 6921 6922 err = 6923 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage); 6924 ASSERT_VK_SUCCESS(err); 6925 6926 image_create_info.imageType = VK_IMAGE_TYPE_1D; 6927 // Note: Some implementations expect color attachment usage for any 6928 // multisample surface 6929 image_create_info.usage = 6930 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 6931 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 6932 6933 err = 6934 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage); 6935 ASSERT_VK_SUCCESS(err); 6936 6937 // Allocate memory 6938 VkMemoryAllocateInfo memAlloc = {}; 6939 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 6940 memAlloc.pNext = NULL; 6941 memAlloc.allocationSize = 0; 6942 memAlloc.memoryTypeIndex = 0; 6943 6944 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs); 6945 memAlloc.allocationSize = memReqs.size; 6946 pass = 6947 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0); 6948 ASSERT_TRUE(pass); 6949 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem); 6950 ASSERT_VK_SUCCESS(err); 6951 6952 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs); 6953 memAlloc.allocationSize = memReqs.size; 6954 pass = 6955 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0); 6956 ASSERT_TRUE(pass); 6957 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem); 6958 ASSERT_VK_SUCCESS(err); 6959 6960 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0); 6961 ASSERT_VK_SUCCESS(err); 6962 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0); 6963 ASSERT_VK_SUCCESS(err); 6964 6965 BeginCommandBuffer(); 6966 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest? 6967 // VK_IMAGE_LAYOUT_UNDEFINED = 0, 6968 // VK_IMAGE_LAYOUT_GENERAL = 1, 6969 VkImageResolve resolveRegion; 6970 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 6971 resolveRegion.srcSubresource.mipLevel = 0; 6972 resolveRegion.srcSubresource.baseArrayLayer = 0; 6973 resolveRegion.srcSubresource.layerCount = 0; 6974 resolveRegion.srcOffset.x = 0; 6975 resolveRegion.srcOffset.y = 0; 6976 resolveRegion.srcOffset.z = 0; 6977 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 6978 resolveRegion.dstSubresource.mipLevel = 0; 6979 resolveRegion.dstSubresource.baseArrayLayer = 0; 6980 resolveRegion.dstSubresource.layerCount = 0; 6981 resolveRegion.dstOffset.x = 0; 6982 resolveRegion.dstOffset.y = 0; 6983 resolveRegion.dstOffset.z = 0; 6984 resolveRegion.extent.width = 1; 6985 resolveRegion.extent.height = 1; 6986 resolveRegion.extent.depth = 1; 6987 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, 6988 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion); 6989 EndCommandBuffer(); 6990 6991 if (!m_errorMonitor->DesiredMsgFound()) { 6992 FAIL() << "Did not receive Error 'vkCmdResolveImage called with " 6993 "unmatched source and dest image types.'"; 6994 m_errorMonitor->DumpFailureMsgs(); 6995 } 6996 6997 vkDestroyImage(m_device->device(), srcImage, NULL); 6998 vkDestroyImage(m_device->device(), dstImage, NULL); 6999 vkFreeMemory(m_device->device(), srcMem, NULL); 7000 vkFreeMemory(m_device->device(), destMem, NULL); 7001 } 7002 7003 TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) { 7004 // Create a single Image descriptor and cause it to first hit an error due 7005 // to using a DS format, then cause it to hit error due to COLOR_BIT not 7006 // set in aspect 7007 // The image format check comes 2nd in validation so we trigger it first, 7008 // then when we cause aspect fail next, bad format check will be preempted 7009 VkResult err; 7010 7011 m_errorMonitor->SetDesiredFailureMsg( 7012 VK_DEBUG_REPORT_ERROR_BIT_EXT, 7013 "Combination depth/stencil image formats can have only the "); 7014 7015 ASSERT_NO_FATAL_FAILURE(InitState()); 7016 7017 VkDescriptorPoolSize ds_type_count = {}; 7018 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; 7019 ds_type_count.descriptorCount = 1; 7020 7021 VkDescriptorPoolCreateInfo ds_pool_ci = {}; 7022 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; 7023 ds_pool_ci.pNext = NULL; 7024 ds_pool_ci.maxSets = 1; 7025 ds_pool_ci.poolSizeCount = 1; 7026 ds_pool_ci.pPoolSizes = &ds_type_count; 7027 7028 VkDescriptorPool ds_pool; 7029 err = 7030 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); 7031 ASSERT_VK_SUCCESS(err); 7032 7033 VkDescriptorSetLayoutBinding dsl_binding = {}; 7034 dsl_binding.binding = 0; 7035 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; 7036 dsl_binding.descriptorCount = 1; 7037 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL; 7038 dsl_binding.pImmutableSamplers = NULL; 7039 7040 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {}; 7041 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; 7042 ds_layout_ci.pNext = NULL; 7043 ds_layout_ci.bindingCount = 1; 7044 ds_layout_ci.pBindings = &dsl_binding; 7045 VkDescriptorSetLayout ds_layout; 7046 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, 7047 &ds_layout); 7048 ASSERT_VK_SUCCESS(err); 7049 7050 VkDescriptorSet descriptorSet; 7051 VkDescriptorSetAllocateInfo alloc_info = {}; 7052 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 7053 alloc_info.descriptorSetCount = 1; 7054 alloc_info.descriptorPool = ds_pool; 7055 alloc_info.pSetLayouts = &ds_layout; 7056 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, 7057 &descriptorSet); 7058 ASSERT_VK_SUCCESS(err); 7059 7060 VkImage image_bad; 7061 VkImage image_good; 7062 // One bad format and one good format for Color attachment 7063 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT; 7064 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM; 7065 const int32_t tex_width = 32; 7066 const int32_t tex_height = 32; 7067 7068 VkImageCreateInfo image_create_info = {}; 7069 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 7070 image_create_info.pNext = NULL; 7071 image_create_info.imageType = VK_IMAGE_TYPE_2D; 7072 image_create_info.format = tex_format_bad; 7073 image_create_info.extent.width = tex_width; 7074 image_create_info.extent.height = tex_height; 7075 image_create_info.extent.depth = 1; 7076 image_create_info.mipLevels = 1; 7077 image_create_info.arrayLayers = 1; 7078 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT; 7079 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL; 7080 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | 7081 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; 7082 image_create_info.flags = 0; 7083 7084 err = 7085 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad); 7086 ASSERT_VK_SUCCESS(err); 7087 image_create_info.format = tex_format_good; 7088 image_create_info.usage = 7089 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 7090 err = vkCreateImage(m_device->device(), &image_create_info, NULL, 7091 &image_good); 7092 ASSERT_VK_SUCCESS(err); 7093 7094 VkImageViewCreateInfo image_view_create_info = {}; 7095 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 7096 image_view_create_info.image = image_bad; 7097 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D; 7098 image_view_create_info.format = tex_format_bad; 7099 image_view_create_info.subresourceRange.baseArrayLayer = 0; 7100 image_view_create_info.subresourceRange.baseMipLevel = 0; 7101 image_view_create_info.subresourceRange.layerCount = 1; 7102 image_view_create_info.subresourceRange.levelCount = 1; 7103 image_view_create_info.subresourceRange.aspectMask = 7104 VK_IMAGE_ASPECT_COLOR_BIT; 7105 7106 VkImageView view; 7107 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, 7108 &view); 7109 7110 if (!m_errorMonitor->DesiredMsgFound()) { 7111 FAIL() << "Did not receive Error 'Combination depth-stencil image " 7112 "formats can have only the....'"; 7113 m_errorMonitor->DumpFailureMsgs(); 7114 } 7115 7116 vkDestroyImage(m_device->device(), image_bad, NULL); 7117 vkDestroyImage(m_device->device(), image_good, NULL); 7118 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL); 7119 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL); 7120 } 7121 #endif // IMAGE_TESTS 7122 7123 int main(int argc, char **argv) { 7124 int result; 7125 7126 ::testing::InitGoogleTest(&argc, argv); 7127 VkTestFramework::InitArgs(&argc, argv); 7128 7129 ::testing::AddGlobalTestEnvironment(new TestEnvironment); 7130 7131 result = RUN_ALL_TESTS(); 7132 7133 VkTestFramework::Finish(); 7134 return result; 7135 } 7136