blob: 655a4555849c4113163aad90965e10853c00bbb2 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Tobin Ehlis0788f522015-05-26 16:11:58 -060036#define MEM_TRACKER_TESTS 1
37#define OBJ_TRACKER_TESTS 1
38#define DRAW_STATE_TESTS 1
39#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120040#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060041#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060042#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060043
Mark Lobodzinski3780e142015-05-14 15:08:13 -050044//--------------------------------------------------------------------------------------
45// Mesh and VertexFormat Data
46//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070047struct Vertex {
48 float posX, posY, posZ, posW; // Position data
49 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050050};
51
Karl Schultz6addd812016-02-02 17:17:23 -070052#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050053
54typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070055 BsoFailNone = 0x00000000,
56 BsoFailLineWidth = 0x00000001,
57 BsoFailDepthBias = 0x00000002,
58 BsoFailViewport = 0x00000004,
59 BsoFailScissor = 0x00000008,
60 BsoFailBlend = 0x00000010,
61 BsoFailDepthBounds = 0x00000020,
62 BsoFailStencilReadMask = 0x00000040,
63 BsoFailStencilWriteMask = 0x00000080,
64 BsoFailStencilReference = 0x00000100,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050065} BsoFailSelect;
66
67struct vktriangle_vs_uniform {
68 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070069 float mvp[4][4];
70 float position[3][4];
71 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050072};
73
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050074static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120075 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070076 "vec2 vertices[3];\n"
77 "out gl_PerVertex {\n"
78 " vec4 gl_Position;\n"
79 "};\n"
80 "void main() {\n"
81 " vertices[0] = vec2(-1.0, -1.0);\n"
82 " vertices[1] = vec2( 1.0, -1.0);\n"
83 " vertices[2] = vec2( 0.0, 1.0);\n"
84 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
85 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050086
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050087static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120088 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070089 "\n"
90 "layout(location = 0) out vec4 uFragColor;\n"
91 "void main(){\n"
92 " uFragColor = vec4(0,1,0,1);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Karl Schultz6addd812016-02-02 17:17:23 -070095static VKAPI_ATTR VkBool32 VKAPI_CALL
96myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
97 uint64_t srcObject, size_t location, int32_t msgCode,
98 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -060099
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600100// ********************************************************
101// ErrorMonitor Usage:
102//
103// Call SetDesiredFailureMsg with a string to be compared against all
104// encountered log messages. Passing NULL will match all log messages.
105// logMsg will return true for skipCall only if msg is matched or NULL.
106//
107// Call DesiredMsgFound to determine if the desired failure message
108// was encountered.
109
Tony Barbour300a6082015-04-07 13:44:53 -0600110class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700111 public:
112 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600113 test_platform_thread_create_mutex(&m_mutex);
114 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700115 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700116 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600117 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600118 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600119
Karl Schultz6addd812016-02-02 17:17:23 -0700120 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200121 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600122 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600123 m_failureMsg.clear();
124 m_otherMsgs.clear();
125 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700126 m_msgFound = VK_FALSE;
127 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600128 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600129 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600130
Karl Schultz6addd812016-02-02 17:17:23 -0700131 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600132 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600133 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600134 if (m_bailout != NULL) {
135 *m_bailout = true;
136 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600137 string errorString(msgString);
138 if (msgFlags & m_msgFlags) {
139 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200140 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
141 m_otherMsgs.push_back(m_failureMsg);
142 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600143 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700144 m_msgFound = VK_TRUE;
145 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600146 } else {
147 m_otherMsgs.push_back(errorString);
148 }
149 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600150 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600151 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600152 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600153
Karl Schultz6addd812016-02-02 17:17:23 -0700154 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155
Karl Schultz6addd812016-02-02 17:17:23 -0700156 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600163 vector<string> otherMsgs = GetOtherFailureMsgs();
164 cout << "Other error messages logged for this test were:" << endl;
165 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
166 cout << " " << *iter << endl;
167 }
168 }
169
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200170 /* helpers */
171
172 void ExpectSuccess() {
173 // match anything
174 SetDesiredFailureMsg(~0u, "");
175 }
176
177 void VerifyFound() {
178 // Not seeing the desired message is a failure. /Before/ throwing, dump
179 // any other messages.
180 if (!DesiredMsgFound()) {
181 DumpFailureMsgs();
182 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
183 }
184 }
185
186 void VerifyNotFound() {
187 // ExpectSuccess() configured us to match anything. Any error is a
188 // failure.
189 if (DesiredMsgFound()) {
190 DumpFailureMsgs();
191 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
192 }
193 }
194
Karl Schultz6addd812016-02-02 17:17:23 -0700195 private:
196 VkFlags m_msgFlags;
197 string m_desiredMsg;
198 string m_failureMsg;
199 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600200 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700201 bool *m_bailout;
202 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600203};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500204
Karl Schultz6addd812016-02-02 17:17:23 -0700205static VKAPI_ATTR VkBool32 VKAPI_CALL
206myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
207 uint64_t srcObject, size_t location, int32_t msgCode,
208 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
209 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700210 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700211 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600212 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600213 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600214 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600215 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600216}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500217
Karl Schultz6addd812016-02-02 17:17:23 -0700218class VkLayerTest : public VkRenderFramework {
219 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800220 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
221 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700222 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
223 BsoFailSelect failMask);
224 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
225 VkPipelineObj &pipelineobj,
226 VkDescriptorSetObj &descriptorSet,
227 BsoFailSelect failMask);
228 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
229 VkDescriptorSetObj &descriptorSet,
230 BsoFailSelect failMask) {
231 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
232 failMask);
233 }
Tony Barbour300a6082015-04-07 13:44:53 -0600234
Tony Barbourfe3351b2015-07-28 10:17:20 -0600235 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700236 VkResult BeginCommandBuffer() {
237 return BeginCommandBuffer(*m_commandBuffer);
238 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800239 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700240 void Draw(uint32_t vertexCount, uint32_t instanceCount,
241 uint32_t firstVertex, uint32_t firstInstance) {
242 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
243 firstInstance);
244 }
245 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
246 uint32_t firstIndex, int32_t vertexOffset,
247 uint32_t firstInstance) {
248 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
249 vertexOffset, firstInstance);
250 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800251 void QueueCommandBuffer() { m_commandBuffer->QueueCommandBuffer(); }
Karl Schultz6addd812016-02-02 17:17:23 -0700252 void QueueCommandBuffer(const VkFence &fence) {
253 m_commandBuffer->QueueCommandBuffer(fence);
254 }
255 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
256 VkDeviceSize offset, uint32_t binding) {
257 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
258 }
259 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
260 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
261 }
262
263 protected:
264 ErrorMonitor *m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600265
266 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600267 std::vector<const char *> instance_layer_names;
268 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600269 std::vector<const char *> instance_extension_names;
270 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600271
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700272 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600273 /*
274 * Since CreateDbgMsgCallback is an instance level extension call
275 * any extension / layer that utilizes that feature also needs
276 * to be enabled at create instance time.
277 */
Karl Schultz6addd812016-02-02 17:17:23 -0700278 // Use Threading layer first to protect others from
279 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700280 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600281 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800282 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700283 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800284 instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
285 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700286 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600287
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700288 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600289 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800290 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700291 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800292 device_layer_names.push_back("VK_LAYER_LUNARG_device_limits");
293 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700294 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600295
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600296 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600297 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800298 this->app_info.pApplicationName = "layer_tests";
299 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600300 this->app_info.pEngineName = "unittest";
301 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600302 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600303
Tony Barbour15524c32015-04-29 17:34:29 -0600304 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600305 InitFramework(instance_layer_names, device_layer_names,
306 instance_extension_names, device_extension_names,
307 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600308 }
309
310 virtual void TearDown() {
311 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600312 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600313 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600314 }
315};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500316
Karl Schultz6addd812016-02-02 17:17:23 -0700317VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600318 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600319
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800320 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600321
322 /*
323 * For render test all drawing happens in a single render pass
324 * on a single command buffer.
325 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200326 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800327 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600328 }
329
330 return result;
331}
332
Karl Schultz6addd812016-02-02 17:17:23 -0700333VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600334 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600335
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200336 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800337 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200338 }
Tony Barbour300a6082015-04-07 13:44:53 -0600339
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800340 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600341
342 return result;
343}
344
Karl Schultz6addd812016-02-02 17:17:23 -0700345void VkLayerTest::VKTriangleTest(const char *vertShaderText,
346 const char *fragShaderText,
347 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500348 // Create identity matrix
349 int i;
350 struct vktriangle_vs_uniform data;
351
352 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700353 glm::mat4 View = glm::mat4(1.0f);
354 glm::mat4 Model = glm::mat4(1.0f);
355 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500356 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700357 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500358
359 memcpy(&data.mvp, &MVP[0][0], matrixSize);
360
Karl Schultz6addd812016-02-02 17:17:23 -0700361 static const Vertex tri_data[] = {
362 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
363 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
364 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500365 };
366
Karl Schultz6addd812016-02-02 17:17:23 -0700367 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500368 data.position[i][0] = tri_data[i].posX;
369 data.position[i][1] = tri_data[i].posY;
370 data.position[i][2] = tri_data[i].posZ;
371 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700372 data.color[i][0] = tri_data[i].r;
373 data.color[i][1] = tri_data[i].g;
374 data.color[i][2] = tri_data[i].b;
375 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500376 }
377
378 ASSERT_NO_FATAL_FAILURE(InitState());
379 ASSERT_NO_FATAL_FAILURE(InitViewport());
380
Karl Schultz6addd812016-02-02 17:17:23 -0700381 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
382 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500383
Karl Schultz6addd812016-02-02 17:17:23 -0700384 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
385 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
386 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500387
388 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800389 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500390 pipelineobj.AddShader(&vs);
391 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600392 if (failMask & BsoFailLineWidth) {
393 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600394 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
395 ia_state.sType =
396 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
397 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
398 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600399 }
400 if (failMask & BsoFailDepthBias) {
401 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600402 VkPipelineRasterizationStateCreateInfo rs_state = {};
403 rs_state.sType =
404 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
405 rs_state.depthBiasEnable = VK_TRUE;
406 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600407 }
Karl Schultz6addd812016-02-02 17:17:23 -0700408 // Viewport and scissors must stay in synch or other errors will occur than
409 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600410 if (failMask & BsoFailViewport) {
411 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600412 m_viewports.clear();
413 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600414 }
415 if (failMask & BsoFailScissor) {
416 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600417 m_scissors.clear();
418 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600419 }
420 if (failMask & BsoFailBlend) {
421 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600422 VkPipelineColorBlendAttachmentState att_state = {};
423 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
424 att_state.blendEnable = VK_TRUE;
425 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600426 }
427 if (failMask & BsoFailDepthBounds) {
428 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
429 }
430 if (failMask & BsoFailStencilReadMask) {
431 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
432 }
433 if (failMask & BsoFailStencilWriteMask) {
434 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
435 }
436 if (failMask & BsoFailStencilReference) {
437 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
438 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500439
440 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700441 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
442 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500443
444 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600445 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500446
Tony Barbourfe3351b2015-07-28 10:17:20 -0600447 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500448
449 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600450 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451
452 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600453 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500454
Tony Barbourfe3351b2015-07-28 10:17:20 -0600455 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456}
457
Karl Schultz6addd812016-02-02 17:17:23 -0700458void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
459 VkPipelineObj &pipelineobj,
460 VkDescriptorSetObj &descriptorSet,
461 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500462 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700463 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
464 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500465 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700466 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
467 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500468 }
469
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800470 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700471 // Make sure depthWriteEnable is set so that Depth fail test will work
472 // correctly
473 // Make sure stencilTestEnable is set so that Stencil fail test will work
474 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600475 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800476 stencil.failOp = VK_STENCIL_OP_KEEP;
477 stencil.passOp = VK_STENCIL_OP_KEEP;
478 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
479 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600480
481 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
482 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600483 ds_ci.pNext = NULL;
484 ds_ci.depthTestEnable = VK_FALSE;
485 ds_ci.depthWriteEnable = VK_TRUE;
486 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
487 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600488 if (failMask & BsoFailDepthBounds) {
489 ds_ci.depthBoundsTestEnable = VK_TRUE;
490 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600491 ds_ci.stencilTestEnable = VK_TRUE;
492 ds_ci.front = stencil;
493 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600494
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600495 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600496 pipelineobj.SetViewport(m_viewports);
497 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800498 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700499 VkResult err = pipelineobj.CreateVKPipeline(
500 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600501 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800502 commandBuffer->BindPipeline(pipelineobj);
503 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500504}
505
506// ********************************************************************************************************************
507// ********************************************************************************************************************
508// ********************************************************************************************************************
509// ********************************************************************************************************************
Tobin Ehlis0788f522015-05-26 16:11:58 -0600510#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700511#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800512TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500513{
514 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500515 VkFenceCreateInfo fenceInfo = {};
516 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
517 fenceInfo.pNext = NULL;
518 fenceInfo.flags = 0;
519
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600521
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500522 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -0600523
524 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
525 vk_testing::Buffer buffer;
526 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500527
Tony Barbourfe3351b2015-07-28 10:17:20 -0600528 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800529 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600530 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500531
532 testFence.init(*m_device, fenceInfo);
533
534 // Bypass framework since it does the waits automatically
535 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600536 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800537 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
538 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800539 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600540 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700541 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800542 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800543 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800544 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600545 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600546
547 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500548 ASSERT_VK_SUCCESS( err );
549
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500550 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800551 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500552
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200553 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500554}
555
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800556TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500557{
558 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500559 VkFenceCreateInfo fenceInfo = {};
560 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
561 fenceInfo.pNext = NULL;
562 fenceInfo.flags = 0;
563
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600565
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500566 ASSERT_NO_FATAL_FAILURE(InitState());
567 ASSERT_NO_FATAL_FAILURE(InitViewport());
568 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
569
Tony Barbourfe3351b2015-07-28 10:17:20 -0600570 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800571 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600572 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500573
574 testFence.init(*m_device, fenceInfo);
575
576 // Bypass framework since it does the waits automatically
577 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600578 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800579 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
580 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800581 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600582 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700583 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800584 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800585 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800586 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600587 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600588
589 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500590 ASSERT_VK_SUCCESS( err );
591
Jon Ashburnf19916e2016-01-11 13:12:43 -0700592 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800593 VkCommandBufferBeginInfo info = {};
594 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
595 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600596 info.renderPass = VK_NULL_HANDLE;
597 info.subpass = 0;
598 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +0800599 info.occlusionQueryEnable = VK_FALSE;
600 info.queryFlags = 0;
601 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600602
603 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800604 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500605
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200606 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -0500607}
Tobin Ehlis8fab6562015-12-01 09:57:09 -0700608#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200609
Karl Schultz6addd812016-02-02 17:17:23 -0700610TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
611 VkResult err;
612 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500613
Karl Schultz6addd812016-02-02 17:17:23 -0700614 m_errorMonitor->SetDesiredFailureMsg(
615 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600616 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
617
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500618 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500619
620 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700621 VkImage image;
622 VkDeviceMemory mem;
623 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500624
Karl Schultz6addd812016-02-02 17:17:23 -0700625 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
626 const int32_t tex_width = 32;
627 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500628
Tony Barboureb254902015-07-15 12:50:33 -0600629 VkImageCreateInfo image_create_info = {};
630 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700631 image_create_info.pNext = NULL;
632 image_create_info.imageType = VK_IMAGE_TYPE_2D;
633 image_create_info.format = tex_format;
634 image_create_info.extent.width = tex_width;
635 image_create_info.extent.height = tex_height;
636 image_create_info.extent.depth = 1;
637 image_create_info.mipLevels = 1;
638 image_create_info.arrayLayers = 1;
639 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
640 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
641 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
642 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600643
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800644 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800645 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -0700646 mem_alloc.pNext = NULL;
647 mem_alloc.allocationSize = 0;
648 // Introduce failure, do NOT set memProps to
649 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
650 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500651
Chia-I Wuf7458c52015-10-26 21:10:41 +0800652 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500653 ASSERT_VK_SUCCESS(err);
654
Karl Schultz6addd812016-02-02 17:17:23 -0700655 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500656
Mark Lobodzinski23065352015-05-29 09:32:35 -0500657 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500658
Karl Schultz6addd812016-02-02 17:17:23 -0700659 pass =
660 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
661 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
662 if (!pass) { // If we can't find any unmappable memory this test doesn't
663 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +0800664 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -0600665 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -0600666 }
Mike Stroyan713b2d72015-08-04 10:49:29 -0600667
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500668 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800669 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500670 ASSERT_VK_SUCCESS(err);
671
672 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -0600673 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500674 ASSERT_VK_SUCCESS(err);
675
676 // Map memory as if to initialize the image
677 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -0700678 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
679 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500680
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200681 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600682
Chia-I Wuf7458c52015-10-26 21:10:41 +0800683 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500684}
685
Karl Schultz6addd812016-02-02 17:17:23 -0700686TEST_F(VkLayerTest, RebindMemory) {
687 VkResult err;
688 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500689
Karl Schultz6addd812016-02-02 17:17:23 -0700690 m_errorMonitor->SetDesiredFailureMsg(
691 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600692 "which has already been bound to mem object");
693
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500694 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500695
696 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700697 VkImage image;
698 VkDeviceMemory mem1;
699 VkDeviceMemory mem2;
700 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500701
Karl Schultz6addd812016-02-02 17:17:23 -0700702 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
703 const int32_t tex_width = 32;
704 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500705
Tony Barboureb254902015-07-15 12:50:33 -0600706 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700707 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
708 image_create_info.pNext = NULL;
709 image_create_info.imageType = VK_IMAGE_TYPE_2D;
710 image_create_info.format = tex_format;
711 image_create_info.extent.width = tex_width;
712 image_create_info.extent.height = tex_height;
713 image_create_info.extent.depth = 1;
714 image_create_info.mipLevels = 1;
715 image_create_info.arrayLayers = 1;
716 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
717 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
718 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
719 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500720
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800721 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700722 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
723 mem_alloc.pNext = NULL;
724 mem_alloc.allocationSize = 0;
725 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -0600726
Karl Schultz6addd812016-02-02 17:17:23 -0700727 // Introduce failure, do NOT set memProps to
728 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -0600729 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800730 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500731 ASSERT_VK_SUCCESS(err);
732
Karl Schultz6addd812016-02-02 17:17:23 -0700733 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500734
735 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -0700736 pass =
737 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600738 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500739
740 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800741 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500742 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800743 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500744 ASSERT_VK_SUCCESS(err);
745
746 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -0600747 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500748 ASSERT_VK_SUCCESS(err);
749
Karl Schultz6addd812016-02-02 17:17:23 -0700750 // Introduce validation failure, try to bind a different memory object to
751 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -0600752 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500753
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200754 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600755
Chia-I Wuf7458c52015-10-26 21:10:41 +0800756 vkDestroyImage(m_device->device(), image, NULL);
757 vkFreeMemory(m_device->device(), mem1, NULL);
758 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500759}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500760
Karl Schultz6addd812016-02-02 17:17:23 -0700761TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600762 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600763
Karl Schultz6addd812016-02-02 17:17:23 -0700764 m_errorMonitor->SetDesiredFailureMsg(
765 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
766 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600767
768 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600769 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
770 fenceInfo.pNext = NULL;
771 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -0600772
Tony Barbour300a6082015-04-07 13:44:53 -0600773 ASSERT_NO_FATAL_FAILURE(InitState());
774 ASSERT_NO_FATAL_FAILURE(InitViewport());
775 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
776
Tony Barbourfe3351b2015-07-28 10:17:20 -0600777 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700778 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
779 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600780 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600781
782 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600783
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600784 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +0800785 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
786 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800787 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600788 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -0700789 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800790 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800791 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +0800792 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -0600793 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -0600794
795 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -0700796 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600797
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200798 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600799}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600800// This is a positive test. We used to expect error in this case but spec now
801// allows it
Karl Schultz6addd812016-02-02 17:17:23 -0700802TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600803 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600804 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600805 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -0600806 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
807 fenceInfo.pNext = NULL;
808
Tony Barbour0b4d9562015-04-09 10:48:04 -0600809 ASSERT_NO_FATAL_FAILURE(InitState());
810 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +0800811 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600812 VkResult result = vkResetFences(m_device->device(), 1, fences);
813 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -0600814
Tobin Ehlisaff7ae92016-04-18 15:45:20 -0600815 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -0600816}
Tobin Ehlis41376e12015-07-03 08:45:14 -0600817
Chia-I Wu08accc62015-07-07 11:50:03 +0800818/* TODO: Update for changes due to bug-14075 tiling across render passes */
819#if 0
Tobin Ehlis41376e12015-07-03 08:45:14 -0600820TEST_F(VkLayerTest, InvalidUsageBits)
821{
822 // Initiate Draw w/o a PSO bound
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600823
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600825 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -0600826
827 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800828 VkCommandBufferObj commandBuffer(m_device);
Tony Barbourfe3351b2015-07-28 10:17:20 -0600829 BeginCommandBuffer();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600830
831 const VkExtent3D e3d = {
832 .width = 128,
833 .height = 128,
834 .depth = 1,
835 };
836 const VkImageCreateInfo ici = {
837 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
838 .pNext = NULL,
839 .imageType = VK_IMAGE_TYPE_2D,
840 .format = VK_FORMAT_D32_SFLOAT_S8_UINT,
841 .extent = e3d,
842 .mipLevels = 1,
843 .arraySize = 1,
Chia-I Wu5c17c962015-10-31 00:31:16 +0800844 .samples = VK_SAMPLE_COUNT_1_BIT,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600845 .tiling = VK_IMAGE_TILING_LINEAR,
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600846 .usage = 0, // Not setting VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
Tobin Ehlis41376e12015-07-03 08:45:14 -0600847 .flags = 0,
848 };
849
850 VkImage dsi;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800851 vkCreateImage(m_device->device(), &ici, NULL, &dsi);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600852 VkDepthStencilView dsv;
853 const VkDepthStencilViewCreateInfo dsvci = {
854 .sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
855 .pNext = NULL,
856 .image = dsi,
857 .mipLevel = 0,
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600858 .baseArrayLayer = 0,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600859 .arraySize = 1,
860 .flags = 0,
861 };
Chia-I Wuf7458c52015-10-26 21:10:41 +0800862 vkCreateDepthStencilView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600863
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200864 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -0600865}
Mark Lobodzinski209b5292015-09-17 09:44:05 -0600866#endif // 0
867#endif // MEM_TRACKER_TESTS
868
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600869#if OBJ_TRACKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -0700870TEST_F(VkLayerTest, PipelineNotBound) {
871 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600872
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700874 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600875
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600876 ASSERT_NO_FATAL_FAILURE(InitState());
877 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600878
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800879 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700880 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
881 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600882
883 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700884 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
885 ds_pool_ci.pNext = NULL;
886 ds_pool_ci.maxSets = 1;
887 ds_pool_ci.poolSizeCount = 1;
888 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600889
890 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -0700891 err =
892 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600893 ASSERT_VK_SUCCESS(err);
894
895 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700896 dsl_binding.binding = 0;
897 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
898 dsl_binding.descriptorCount = 1;
899 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
900 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600901
902 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700903 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
904 ds_layout_ci.pNext = NULL;
905 ds_layout_ci.bindingCount = 1;
906 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600907
908 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700909 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
910 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600911 ASSERT_VK_SUCCESS(err);
912
913 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800914 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800915 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -0700916 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -0600917 alloc_info.descriptorPool = ds_pool;
918 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700919 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
920 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600921 ASSERT_VK_SUCCESS(err);
922
923 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700924 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
925 pipeline_layout_ci.pNext = NULL;
926 pipeline_layout_ci.setLayoutCount = 1;
927 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600928
929 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -0700930 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
931 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600932 ASSERT_VK_SUCCESS(err);
933
Mark Youngad779052016-01-06 14:26:04 -0700934 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600935
936 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700937 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
938 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -0600939
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200940 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -0600941
Chia-I Wuf7458c52015-10-26 21:10:41 +0800942 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
943 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
944 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -0600945}
946
Karl Schultz6addd812016-02-02 17:17:23 -0700947TEST_F(VkLayerTest, BindInvalidMemory) {
948 VkResult err;
949 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -0600950
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -0700952 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600953
Tobin Ehlisec598302015-09-15 15:02:17 -0600954 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -0600955
956 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -0700957 VkImage image;
958 VkDeviceMemory mem;
959 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -0600960
Karl Schultz6addd812016-02-02 17:17:23 -0700961 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
962 const int32_t tex_width = 32;
963 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -0600964
965 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700966 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
967 image_create_info.pNext = NULL;
968 image_create_info.imageType = VK_IMAGE_TYPE_2D;
969 image_create_info.format = tex_format;
970 image_create_info.extent.width = tex_width;
971 image_create_info.extent.height = tex_height;
972 image_create_info.extent.depth = 1;
973 image_create_info.mipLevels = 1;
974 image_create_info.arrayLayers = 1;
975 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
976 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
977 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
978 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -0600979
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800980 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -0700981 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
982 mem_alloc.pNext = NULL;
983 mem_alloc.allocationSize = 0;
984 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -0600985
Chia-I Wuf7458c52015-10-26 21:10:41 +0800986 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -0600987 ASSERT_VK_SUCCESS(err);
988
Karl Schultz6addd812016-02-02 17:17:23 -0700989 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -0600990
991 mem_alloc.allocationSize = mem_reqs.size;
992
Karl Schultz6addd812016-02-02 17:17:23 -0700993 pass =
994 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -0600995 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -0600996
997 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800998 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -0600999 ASSERT_VK_SUCCESS(err);
1000
1001 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001002 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001003
1004 // Try to bind free memory that has been freed
1005 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1006 // This may very well return an error.
1007 (void)err;
1008
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001009 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001010
Chia-I Wuf7458c52015-10-26 21:10:41 +08001011 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001012}
1013
Karl Schultz6addd812016-02-02 17:17:23 -07001014TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
1015 VkResult err;
1016 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06001017
Karl Schultz6addd812016-02-02 17:17:23 -07001018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1019 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001020
Tobin Ehlisec598302015-09-15 15:02:17 -06001021 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06001022
Karl Schultz6addd812016-02-02 17:17:23 -07001023 // Create an image object, allocate memory, destroy the object and then try
1024 // to bind it
1025 VkImage image;
1026 VkDeviceMemory mem;
1027 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06001028
Karl Schultz6addd812016-02-02 17:17:23 -07001029 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1030 const int32_t tex_width = 32;
1031 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06001032
1033 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001034 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1035 image_create_info.pNext = NULL;
1036 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1037 image_create_info.format = tex_format;
1038 image_create_info.extent.width = tex_width;
1039 image_create_info.extent.height = tex_height;
1040 image_create_info.extent.depth = 1;
1041 image_create_info.mipLevels = 1;
1042 image_create_info.arrayLayers = 1;
1043 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1044 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1045 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1046 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001047
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001048 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001049 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1050 mem_alloc.pNext = NULL;
1051 mem_alloc.allocationSize = 0;
1052 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06001053
Chia-I Wuf7458c52015-10-26 21:10:41 +08001054 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06001055 ASSERT_VK_SUCCESS(err);
1056
Karl Schultz6addd812016-02-02 17:17:23 -07001057 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06001058
1059 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07001060 pass =
1061 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001062 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06001063
1064 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001065 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06001066 ASSERT_VK_SUCCESS(err);
1067
1068 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08001069 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06001070 ASSERT_VK_SUCCESS(err);
1071
1072 // Now Try to bind memory to this destroyed object
1073 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1074 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07001075 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06001076
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001077 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001078
Chia-I Wuf7458c52015-10-26 21:10:41 +08001079 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06001080}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06001081
Mark Lobodzinski209b5292015-09-17 09:44:05 -06001082#endif // OBJ_TRACKER_TESTS
1083
Tobin Ehlis0788f522015-05-26 16:11:58 -06001084#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06001085
1086// This is a positive test. No errors should be generated.
1087TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
1088
1089 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1090 "submitted on separate queues followed by a QueueWaitIdle.");
1091
1092 m_errorMonitor->ExpectSuccess();
1093
1094 VkSemaphore semaphore;
1095 VkSemaphoreCreateInfo semaphore_create_info{};
1096 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1097 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1098 &semaphore);
1099
1100 VkCommandPool command_pool;
1101 VkCommandPoolCreateInfo pool_create_info{};
1102 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1103 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1104 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1105 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1106 &command_pool);
1107
1108 VkCommandBuffer command_buffer[2];
1109 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1110 command_buffer_allocate_info.sType =
1111 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1112 command_buffer_allocate_info.commandPool = command_pool;
1113 command_buffer_allocate_info.commandBufferCount = 2;
1114 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1115 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1116 command_buffer);
1117
1118 VkQueue queue = VK_NULL_HANDLE;
1119 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1120 1, &queue);
1121
1122 {
1123 VkCommandBufferBeginInfo begin_info{};
1124 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1125 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1126
1127 vkCmdPipelineBarrier(command_buffer[0],
1128 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1129 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1130 0, nullptr, 0, nullptr);
1131
1132 VkViewport viewport{};
1133 viewport.maxDepth = 1.0f;
1134 viewport.minDepth = 0.0f;
1135 viewport.width = 512;
1136 viewport.height = 512;
1137 viewport.x = 0;
1138 viewport.y = 0;
1139 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1140 vkEndCommandBuffer(command_buffer[0]);
1141 }
1142 {
1143 VkCommandBufferBeginInfo begin_info{};
1144 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1145 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1146
1147 VkViewport viewport{};
1148 viewport.maxDepth = 1.0f;
1149 viewport.minDepth = 0.0f;
1150 viewport.width = 512;
1151 viewport.height = 512;
1152 viewport.x = 0;
1153 viewport.y = 0;
1154 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1155 vkEndCommandBuffer(command_buffer[1]);
1156 }
1157 {
1158 VkSubmitInfo submit_info{};
1159 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1160 submit_info.commandBufferCount = 1;
1161 submit_info.pCommandBuffers = &command_buffer[0];
1162 submit_info.signalSemaphoreCount = 1;
1163 submit_info.pSignalSemaphores = &semaphore;
1164 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1165 }
1166 {
1167 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1168 VkSubmitInfo submit_info{};
1169 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1170 submit_info.commandBufferCount = 1;
1171 submit_info.pCommandBuffers = &command_buffer[1];
1172 submit_info.waitSemaphoreCount = 1;
1173 submit_info.pWaitSemaphores = &semaphore;
1174 submit_info.pWaitDstStageMask = flags;
1175 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1176 }
1177
1178 vkQueueWaitIdle(m_device->m_queue);
1179
1180 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1181 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1182 &command_buffer[0]);
1183 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1184
1185 m_errorMonitor->VerifyNotFound();
1186}
1187
1188// This is a positive test. No errors should be generated.
1189TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
1190
1191 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1192 "submitted on separate queues, the second having a fence"
1193 "followed by a QueueWaitIdle.");
1194
1195 m_errorMonitor->ExpectSuccess();
1196
1197 VkFence fence;
1198 VkFenceCreateInfo fence_create_info{};
1199 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1200 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1201
1202 VkSemaphore semaphore;
1203 VkSemaphoreCreateInfo semaphore_create_info{};
1204 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1205 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1206 &semaphore);
1207
1208 VkCommandPool command_pool;
1209 VkCommandPoolCreateInfo pool_create_info{};
1210 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1211 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1212 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1213 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1214 &command_pool);
1215
1216 VkCommandBuffer command_buffer[2];
1217 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1218 command_buffer_allocate_info.sType =
1219 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1220 command_buffer_allocate_info.commandPool = command_pool;
1221 command_buffer_allocate_info.commandBufferCount = 2;
1222 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1223 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1224 command_buffer);
1225
1226 VkQueue queue = VK_NULL_HANDLE;
1227 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1228 1, &queue);
1229
1230 {
1231 VkCommandBufferBeginInfo begin_info{};
1232 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1233 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1234
1235 vkCmdPipelineBarrier(command_buffer[0],
1236 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1237 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1238 0, nullptr, 0, nullptr);
1239
1240 VkViewport viewport{};
1241 viewport.maxDepth = 1.0f;
1242 viewport.minDepth = 0.0f;
1243 viewport.width = 512;
1244 viewport.height = 512;
1245 viewport.x = 0;
1246 viewport.y = 0;
1247 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1248 vkEndCommandBuffer(command_buffer[0]);
1249 }
1250 {
1251 VkCommandBufferBeginInfo begin_info{};
1252 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1253 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1254
1255 VkViewport viewport{};
1256 viewport.maxDepth = 1.0f;
1257 viewport.minDepth = 0.0f;
1258 viewport.width = 512;
1259 viewport.height = 512;
1260 viewport.x = 0;
1261 viewport.y = 0;
1262 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1263 vkEndCommandBuffer(command_buffer[1]);
1264 }
1265 {
1266 VkSubmitInfo submit_info{};
1267 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1268 submit_info.commandBufferCount = 1;
1269 submit_info.pCommandBuffers = &command_buffer[0];
1270 submit_info.signalSemaphoreCount = 1;
1271 submit_info.pSignalSemaphores = &semaphore;
1272 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1273 }
1274 {
1275 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1276 VkSubmitInfo submit_info{};
1277 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1278 submit_info.commandBufferCount = 1;
1279 submit_info.pCommandBuffers = &command_buffer[1];
1280 submit_info.waitSemaphoreCount = 1;
1281 submit_info.pWaitSemaphores = &semaphore;
1282 submit_info.pWaitDstStageMask = flags;
1283 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1284 }
1285
1286 vkQueueWaitIdle(m_device->m_queue);
1287
1288 vkDestroyFence(m_device->device(), fence, nullptr);
1289 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1290 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1291 &command_buffer[0]);
1292 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1293
1294 m_errorMonitor->VerifyNotFound();
1295}
1296
1297// This is a positive test. No errors should be generated.
1298TEST_F(VkLayerTest,
1299 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
1300
1301 TEST_DESCRIPTION(
1302 "Two command buffers, each in a separate QueueSubmit call "
1303 "submitted on separate queues, the second having a fence"
1304 "followed by two consecutive WaitForFences calls on the same fence.");
1305
1306 m_errorMonitor->ExpectSuccess();
1307
1308 VkFence fence;
1309 VkFenceCreateInfo fence_create_info{};
1310 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1311 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1312
1313 VkSemaphore semaphore;
1314 VkSemaphoreCreateInfo semaphore_create_info{};
1315 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1316 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1317 &semaphore);
1318
1319 VkCommandPool command_pool;
1320 VkCommandPoolCreateInfo pool_create_info{};
1321 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1322 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1323 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1324 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1325 &command_pool);
1326
1327 VkCommandBuffer command_buffer[2];
1328 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1329 command_buffer_allocate_info.sType =
1330 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1331 command_buffer_allocate_info.commandPool = command_pool;
1332 command_buffer_allocate_info.commandBufferCount = 2;
1333 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1334 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1335 command_buffer);
1336
1337 VkQueue queue = VK_NULL_HANDLE;
1338 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1339 1, &queue);
1340
1341 {
1342 VkCommandBufferBeginInfo begin_info{};
1343 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1344 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1345
1346 vkCmdPipelineBarrier(command_buffer[0],
1347 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1348 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1349 0, nullptr, 0, nullptr);
1350
1351 VkViewport viewport{};
1352 viewport.maxDepth = 1.0f;
1353 viewport.minDepth = 0.0f;
1354 viewport.width = 512;
1355 viewport.height = 512;
1356 viewport.x = 0;
1357 viewport.y = 0;
1358 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1359 vkEndCommandBuffer(command_buffer[0]);
1360 }
1361 {
1362 VkCommandBufferBeginInfo begin_info{};
1363 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1364 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1365
1366 VkViewport viewport{};
1367 viewport.maxDepth = 1.0f;
1368 viewport.minDepth = 0.0f;
1369 viewport.width = 512;
1370 viewport.height = 512;
1371 viewport.x = 0;
1372 viewport.y = 0;
1373 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1374 vkEndCommandBuffer(command_buffer[1]);
1375 }
1376 {
1377 VkSubmitInfo submit_info{};
1378 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1379 submit_info.commandBufferCount = 1;
1380 submit_info.pCommandBuffers = &command_buffer[0];
1381 submit_info.signalSemaphoreCount = 1;
1382 submit_info.pSignalSemaphores = &semaphore;
1383 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1384 }
1385 {
1386 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1387 VkSubmitInfo submit_info{};
1388 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1389 submit_info.commandBufferCount = 1;
1390 submit_info.pCommandBuffers = &command_buffer[1];
1391 submit_info.waitSemaphoreCount = 1;
1392 submit_info.pWaitSemaphores = &semaphore;
1393 submit_info.pWaitDstStageMask = flags;
1394 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1395 }
1396
1397 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1398 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1399
1400 vkDestroyFence(m_device->device(), fence, nullptr);
1401 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1402 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1403 &command_buffer[0]);
1404 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1405
1406 m_errorMonitor->VerifyNotFound();
1407}
1408
1409// This is a positive test. No errors should be generated.
1410TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
1411
1412 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1413 "submitted on separate queues, the second having a fence, "
1414 "followed by a WaitForFences call.");
1415
1416 m_errorMonitor->ExpectSuccess();
1417
1418 VkFence fence;
1419 VkFenceCreateInfo fence_create_info{};
1420 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1421 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1422
1423 VkSemaphore semaphore;
1424 VkSemaphoreCreateInfo semaphore_create_info{};
1425 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1426 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1427 &semaphore);
1428
1429 VkCommandPool command_pool;
1430 VkCommandPoolCreateInfo pool_create_info{};
1431 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1432 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1433 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1434 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1435 &command_pool);
1436
1437 VkCommandBuffer command_buffer[2];
1438 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1439 command_buffer_allocate_info.sType =
1440 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1441 command_buffer_allocate_info.commandPool = command_pool;
1442 command_buffer_allocate_info.commandBufferCount = 2;
1443 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1444 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1445 command_buffer);
1446
1447 VkQueue queue = VK_NULL_HANDLE;
1448 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
1449 1, &queue);
1450
1451
1452 {
1453 VkCommandBufferBeginInfo begin_info{};
1454 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1455 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1456
1457 vkCmdPipelineBarrier(command_buffer[0],
1458 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1459 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1460 0, nullptr, 0, nullptr);
1461
1462 VkViewport viewport{};
1463 viewport.maxDepth = 1.0f;
1464 viewport.minDepth = 0.0f;
1465 viewport.width = 512;
1466 viewport.height = 512;
1467 viewport.x = 0;
1468 viewport.y = 0;
1469 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1470 vkEndCommandBuffer(command_buffer[0]);
1471 }
1472 {
1473 VkCommandBufferBeginInfo begin_info{};
1474 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1475 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1476
1477 VkViewport viewport{};
1478 viewport.maxDepth = 1.0f;
1479 viewport.minDepth = 0.0f;
1480 viewport.width = 512;
1481 viewport.height = 512;
1482 viewport.x = 0;
1483 viewport.y = 0;
1484 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1485 vkEndCommandBuffer(command_buffer[1]);
1486 }
1487 {
1488 VkSubmitInfo submit_info{};
1489 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1490 submit_info.commandBufferCount = 1;
1491 submit_info.pCommandBuffers = &command_buffer[0];
1492 submit_info.signalSemaphoreCount = 1;
1493 submit_info.pSignalSemaphores = &semaphore;
1494 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
1495 }
1496 {
1497 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1498 VkSubmitInfo submit_info{};
1499 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1500 submit_info.commandBufferCount = 1;
1501 submit_info.pCommandBuffers = &command_buffer[1];
1502 submit_info.waitSemaphoreCount = 1;
1503 submit_info.pWaitSemaphores = &semaphore;
1504 submit_info.pWaitDstStageMask = flags;
1505 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1506 }
1507
1508 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1509
1510 vkDestroyFence(m_device->device(), fence, nullptr);
1511 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1512 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1513 &command_buffer[0]);
1514 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1515
1516 m_errorMonitor->VerifyNotFound();
1517}
1518
1519// This is a positive test. No errors should be generated.
1520TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
1521
1522 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1523 "on the same queue, sharing a signal/wait semaphore, the "
1524 "second having a fence, "
1525 "followed by a WaitForFences call.");
1526
1527 m_errorMonitor->ExpectSuccess();
1528
1529 VkFence fence;
1530 VkFenceCreateInfo fence_create_info{};
1531 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1532 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1533
1534 VkSemaphore semaphore;
1535 VkSemaphoreCreateInfo semaphore_create_info{};
1536 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1537 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1538 &semaphore);
1539
1540 VkCommandPool command_pool;
1541 VkCommandPoolCreateInfo pool_create_info{};
1542 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1543 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1544 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1545 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1546 &command_pool);
1547
1548 VkCommandBuffer command_buffer[2];
1549 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1550 command_buffer_allocate_info.sType =
1551 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1552 command_buffer_allocate_info.commandPool = command_pool;
1553 command_buffer_allocate_info.commandBufferCount = 2;
1554 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1555 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1556 command_buffer);
1557
1558 {
1559 VkCommandBufferBeginInfo begin_info{};
1560 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1561 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1562
1563 vkCmdPipelineBarrier(command_buffer[0],
1564 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1565 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1566 0, nullptr, 0, nullptr);
1567
1568 VkViewport viewport{};
1569 viewport.maxDepth = 1.0f;
1570 viewport.minDepth = 0.0f;
1571 viewport.width = 512;
1572 viewport.height = 512;
1573 viewport.x = 0;
1574 viewport.y = 0;
1575 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1576 vkEndCommandBuffer(command_buffer[0]);
1577 }
1578 {
1579 VkCommandBufferBeginInfo begin_info{};
1580 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1581 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1582
1583 VkViewport viewport{};
1584 viewport.maxDepth = 1.0f;
1585 viewport.minDepth = 0.0f;
1586 viewport.width = 512;
1587 viewport.height = 512;
1588 viewport.x = 0;
1589 viewport.y = 0;
1590 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1591 vkEndCommandBuffer(command_buffer[1]);
1592 }
1593 {
1594 VkSubmitInfo submit_info{};
1595 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1596 submit_info.commandBufferCount = 1;
1597 submit_info.pCommandBuffers = &command_buffer[0];
1598 submit_info.signalSemaphoreCount = 1;
1599 submit_info.pSignalSemaphores = &semaphore;
1600 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1601 }
1602 {
1603 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1604 VkSubmitInfo submit_info{};
1605 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1606 submit_info.commandBufferCount = 1;
1607 submit_info.pCommandBuffers = &command_buffer[1];
1608 submit_info.waitSemaphoreCount = 1;
1609 submit_info.pWaitSemaphores = &semaphore;
1610 submit_info.pWaitDstStageMask = flags;
1611 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1612 }
1613
1614 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1615
1616 vkDestroyFence(m_device->device(), fence, nullptr);
1617 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1618 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1619 &command_buffer[0]);
1620 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1621
1622 m_errorMonitor->VerifyNotFound();
1623}
1624
1625// This is a positive test. No errors should be generated.
1626TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
1627
1628 TEST_DESCRIPTION(
1629 "Two command buffers, each in a separate QueueSubmit call "
1630 "on the same queue, no fences, followed by a third QueueSubmit with NO "
1631 "SubmitInfos but with a fence, followed by a WaitForFences call.");
1632
1633 m_errorMonitor->ExpectSuccess();
1634
1635 VkFence fence;
1636 VkFenceCreateInfo fence_create_info{};
1637 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1638 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1639
1640 VkCommandPool command_pool;
1641 VkCommandPoolCreateInfo pool_create_info{};
1642 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1643 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1644 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1645 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1646 &command_pool);
1647
1648 VkCommandBuffer command_buffer[2];
1649 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1650 command_buffer_allocate_info.sType =
1651 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1652 command_buffer_allocate_info.commandPool = command_pool;
1653 command_buffer_allocate_info.commandBufferCount = 2;
1654 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1655 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1656 command_buffer);
1657
1658 {
1659 VkCommandBufferBeginInfo begin_info{};
1660 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1661 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1662
1663 vkCmdPipelineBarrier(command_buffer[0],
1664 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1665 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1666 0, nullptr, 0, nullptr);
1667
1668 VkViewport viewport{};
1669 viewport.maxDepth = 1.0f;
1670 viewport.minDepth = 0.0f;
1671 viewport.width = 512;
1672 viewport.height = 512;
1673 viewport.x = 0;
1674 viewport.y = 0;
1675 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1676 vkEndCommandBuffer(command_buffer[0]);
1677 }
1678 {
1679 VkCommandBufferBeginInfo begin_info{};
1680 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1681 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1682
1683 VkViewport viewport{};
1684 viewport.maxDepth = 1.0f;
1685 viewport.minDepth = 0.0f;
1686 viewport.width = 512;
1687 viewport.height = 512;
1688 viewport.x = 0;
1689 viewport.y = 0;
1690 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1691 vkEndCommandBuffer(command_buffer[1]);
1692 }
1693 {
1694 VkSubmitInfo submit_info{};
1695 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1696 submit_info.commandBufferCount = 1;
1697 submit_info.pCommandBuffers = &command_buffer[0];
1698 submit_info.signalSemaphoreCount = 0;
1699 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
1700 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1701 }
1702 {
1703 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1704 VkSubmitInfo submit_info{};
1705 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1706 submit_info.commandBufferCount = 1;
1707 submit_info.pCommandBuffers = &command_buffer[1];
1708 submit_info.waitSemaphoreCount = 0;
1709 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
1710 submit_info.pWaitDstStageMask = flags;
1711 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1712 }
1713
1714 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
1715
1716 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1717
1718 vkDestroyFence(m_device->device(), fence, nullptr);
1719 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1720 &command_buffer[0]);
1721 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1722
1723 m_errorMonitor->VerifyNotFound();
1724}
1725
1726// This is a positive test. No errors should be generated.
1727TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
1728
1729 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
1730 "on the same queue, the second having a fence, followed "
1731 "by a WaitForFences call.");
1732
1733 m_errorMonitor->ExpectSuccess();
1734
1735 VkFence fence;
1736 VkFenceCreateInfo fence_create_info{};
1737 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1738 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1739
1740 VkCommandPool command_pool;
1741 VkCommandPoolCreateInfo pool_create_info{};
1742 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1743 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1744 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1745 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1746 &command_pool);
1747
1748 VkCommandBuffer command_buffer[2];
1749 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1750 command_buffer_allocate_info.sType =
1751 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1752 command_buffer_allocate_info.commandPool = command_pool;
1753 command_buffer_allocate_info.commandBufferCount = 2;
1754 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1755 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1756 command_buffer);
1757
1758 {
1759 VkCommandBufferBeginInfo begin_info{};
1760 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1761 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1762
1763 vkCmdPipelineBarrier(command_buffer[0],
1764 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1765 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1766 0, nullptr, 0, nullptr);
1767
1768 VkViewport viewport{};
1769 viewport.maxDepth = 1.0f;
1770 viewport.minDepth = 0.0f;
1771 viewport.width = 512;
1772 viewport.height = 512;
1773 viewport.x = 0;
1774 viewport.y = 0;
1775 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1776 vkEndCommandBuffer(command_buffer[0]);
1777 }
1778 {
1779 VkCommandBufferBeginInfo begin_info{};
1780 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1781 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1782
1783 VkViewport viewport{};
1784 viewport.maxDepth = 1.0f;
1785 viewport.minDepth = 0.0f;
1786 viewport.width = 512;
1787 viewport.height = 512;
1788 viewport.x = 0;
1789 viewport.y = 0;
1790 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1791 vkEndCommandBuffer(command_buffer[1]);
1792 }
1793 {
1794 VkSubmitInfo submit_info{};
1795 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1796 submit_info.commandBufferCount = 1;
1797 submit_info.pCommandBuffers = &command_buffer[0];
1798 submit_info.signalSemaphoreCount = 0;
1799 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
1800 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1801 }
1802 {
1803 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1804 VkSubmitInfo submit_info{};
1805 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1806 submit_info.commandBufferCount = 1;
1807 submit_info.pCommandBuffers = &command_buffer[1];
1808 submit_info.waitSemaphoreCount = 0;
1809 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
1810 submit_info.pWaitDstStageMask = flags;
1811 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1812 }
1813
1814 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1815
1816 vkDestroyFence(m_device->device(), fence, nullptr);
1817 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1818 &command_buffer[0]);
1819 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1820
1821 m_errorMonitor->VerifyNotFound();
1822}
1823
1824// This is a positive test. No errors should be generated.
1825TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
1826
1827 TEST_DESCRIPTION(
1828 "Two command buffers each in a separate SubmitInfo sent in a single "
1829 "QueueSubmit call followed by a WaitForFences call.");
1830
1831 m_errorMonitor->ExpectSuccess();
1832
1833 VkFence fence;
1834 VkFenceCreateInfo fence_create_info{};
1835 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1836 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
1837
1838 VkSemaphore semaphore;
1839 VkSemaphoreCreateInfo semaphore_create_info{};
1840 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1841 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
1842 &semaphore);
1843
1844 VkCommandPool command_pool;
1845 VkCommandPoolCreateInfo pool_create_info{};
1846 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1847 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
1848 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1849 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
1850 &command_pool);
1851
1852 VkCommandBuffer command_buffer[2];
1853 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
1854 command_buffer_allocate_info.sType =
1855 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1856 command_buffer_allocate_info.commandPool = command_pool;
1857 command_buffer_allocate_info.commandBufferCount = 2;
1858 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1859 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
1860 command_buffer);
1861
1862 {
1863 VkCommandBufferBeginInfo begin_info{};
1864 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1865 vkBeginCommandBuffer(command_buffer[0], &begin_info);
1866
1867 vkCmdPipelineBarrier(command_buffer[0],
1868 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
1869 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
1870 0, nullptr, 0, nullptr);
1871
1872 VkViewport viewport{};
1873 viewport.maxDepth = 1.0f;
1874 viewport.minDepth = 0.0f;
1875 viewport.width = 512;
1876 viewport.height = 512;
1877 viewport.x = 0;
1878 viewport.y = 0;
1879 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
1880 vkEndCommandBuffer(command_buffer[0]);
1881 }
1882 {
1883 VkCommandBufferBeginInfo begin_info{};
1884 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1885 vkBeginCommandBuffer(command_buffer[1], &begin_info);
1886
1887 VkViewport viewport{};
1888 viewport.maxDepth = 1.0f;
1889 viewport.minDepth = 0.0f;
1890 viewport.width = 512;
1891 viewport.height = 512;
1892 viewport.x = 0;
1893 viewport.y = 0;
1894 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
1895 vkEndCommandBuffer(command_buffer[1]);
1896 }
1897 {
1898 VkSubmitInfo submit_info[2];
1899 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
1900
1901 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1902 submit_info[0].pNext = NULL;
1903 submit_info[0].commandBufferCount = 1;
1904 submit_info[0].pCommandBuffers = &command_buffer[0];
1905 submit_info[0].signalSemaphoreCount = 1;
1906 submit_info[0].pSignalSemaphores = &semaphore;
1907 submit_info[0].waitSemaphoreCount = 0;
1908 submit_info[0].pWaitSemaphores = NULL;
1909 submit_info[0].pWaitDstStageMask = 0;
1910
1911 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1912 submit_info[1].pNext = NULL;
1913 submit_info[1].commandBufferCount = 1;
1914 submit_info[1].pCommandBuffers = &command_buffer[1];
1915 submit_info[1].waitSemaphoreCount = 1;
1916 submit_info[1].pWaitSemaphores = &semaphore;
1917 submit_info[1].pWaitDstStageMask = flags;
1918 submit_info[1].signalSemaphoreCount = 0;
1919 submit_info[1].pSignalSemaphores = NULL;
1920 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
1921 }
1922
1923 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
1924
1925 vkDestroyFence(m_device->device(), fence, nullptr);
1926 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
1927 &command_buffer[0]);
1928 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
1929
1930 m_errorMonitor->VerifyNotFound();
1931}
1932
Karl Schultz6addd812016-02-02 17:17:23 -07001933TEST_F(VkLayerTest, LineWidthStateNotBound) {
1934 m_errorMonitor->SetDesiredFailureMsg(
1935 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001936 "Dynamic line width state not set for this command buffer");
1937
Karl Schultz6addd812016-02-02 17:17:23 -07001938 TEST_DESCRIPTION("Simple Draw Call that validates failure when a line "
1939 "width state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001940
Karl Schultz6addd812016-02-02 17:17:23 -07001941 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1942 BsoFailLineWidth);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001943
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001944 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001945}
1946
Karl Schultz6addd812016-02-02 17:17:23 -07001947TEST_F(VkLayerTest, DepthBiasStateNotBound) {
1948 m_errorMonitor->SetDesiredFailureMsg(
1949 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001950 "Dynamic depth bias state not set for this command buffer");
1951
Karl Schultz6addd812016-02-02 17:17:23 -07001952 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
1953 "bias state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001954
Karl Schultz6addd812016-02-02 17:17:23 -07001955 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1956 BsoFailDepthBias);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001957
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001958 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001959}
1960
Karl Schultz6addd812016-02-02 17:17:23 -07001961// Disable these two tests until we can sort out how to track multiple layer
1962// errors
1963TEST_F(VkLayerTest, ViewportStateNotBound) {
1964 m_errorMonitor->SetDesiredFailureMsg(
1965 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001966 "Dynamic viewport state not set for this command buffer");
1967
Karl Schultz6addd812016-02-02 17:17:23 -07001968 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1969 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001970
Karl Schultz6addd812016-02-02 17:17:23 -07001971 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1972 BsoFailViewport);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001973
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001974 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001975}
1976
Karl Schultz6addd812016-02-02 17:17:23 -07001977TEST_F(VkLayerTest, ScissorStateNotBound) {
1978 m_errorMonitor->SetDesiredFailureMsg(
1979 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001980 "Dynamic scissor state not set for this command buffer");
1981
Karl Schultz6addd812016-02-02 17:17:23 -07001982 TEST_DESCRIPTION("Simple Draw Call that validates failure when a viewport "
1983 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001984
Karl Schultz6addd812016-02-02 17:17:23 -07001985 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
1986 BsoFailScissor);
Tobin Ehlis963a4042015-09-29 08:18:34 -06001987
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001988 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06001989}
1990
Karl Schultz6addd812016-02-02 17:17:23 -07001991TEST_F(VkLayerTest, BlendStateNotBound) {
1992 m_errorMonitor->SetDesiredFailureMsg(
1993 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7a1d2352016-03-28 11:18:19 -06001994 "Dynamic blend constants state not set for this command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001995
Karl Schultz6addd812016-02-02 17:17:23 -07001996 TEST_DESCRIPTION("Simple Draw Call that validates failure when a blend "
1997 "state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06001998
Karl Schultz6addd812016-02-02 17:17:23 -07001999 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2000 BsoFailBlend);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002001
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002002 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002003}
2004
Karl Schultz6addd812016-02-02 17:17:23 -07002005TEST_F(VkLayerTest, DepthBoundsStateNotBound) {
2006 m_errorMonitor->SetDesiredFailureMsg(
2007 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002008 "Dynamic depth bounds state not set for this command buffer");
2009
Karl Schultz6addd812016-02-02 17:17:23 -07002010 TEST_DESCRIPTION("Simple Draw Call that validates failure when a depth "
2011 "bounds state object is not bound beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002012
Karl Schultz6addd812016-02-02 17:17:23 -07002013 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2014 BsoFailDepthBounds);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002015
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002016 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002017}
2018
Karl Schultz6addd812016-02-02 17:17:23 -07002019TEST_F(VkLayerTest, StencilReadMaskNotSet) {
2020 m_errorMonitor->SetDesiredFailureMsg(
2021 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002022 "Dynamic stencil read mask state not set for this command buffer");
2023
Tobin Ehlis963a4042015-09-29 08:18:34 -06002024 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002025
Karl Schultz6addd812016-02-02 17:17:23 -07002026 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2027 "read mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002028
Karl Schultz6addd812016-02-02 17:17:23 -07002029 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2030 BsoFailStencilReadMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002031
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002032 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002033}
2034
Karl Schultz6addd812016-02-02 17:17:23 -07002035TEST_F(VkLayerTest, StencilWriteMaskNotSet) {
2036 m_errorMonitor->SetDesiredFailureMsg(
2037 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002038 "Dynamic stencil write mask state not set for this command buffer");
2039
Tobin Ehlis963a4042015-09-29 08:18:34 -06002040 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002041
Karl Schultz6addd812016-02-02 17:17:23 -07002042 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2043 "write mask is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002044
Karl Schultz6addd812016-02-02 17:17:23 -07002045 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2046 BsoFailStencilWriteMask);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002047
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002048 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002049}
2050
Karl Schultz6addd812016-02-02 17:17:23 -07002051TEST_F(VkLayerTest, StencilReferenceNotSet) {
2052 m_errorMonitor->SetDesiredFailureMsg(
2053 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002054 "Dynamic stencil reference state not set for this command buffer");
2055
Karl Schultz6addd812016-02-02 17:17:23 -07002056 TEST_DESCRIPTION("Simple Draw Call that validates failure when a stencil "
2057 "reference is not set beforehand");
Tobin Ehlis963a4042015-09-29 08:18:34 -06002058
Karl Schultz6addd812016-02-02 17:17:23 -07002059 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
2060 BsoFailStencilReference);
Tobin Ehlis963a4042015-09-29 08:18:34 -06002061
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002062 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06002063}
2064
Karl Schultz6addd812016-02-02 17:17:23 -07002065TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002066 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002067
Karl Schultz6addd812016-02-02 17:17:23 -07002068 m_errorMonitor->SetDesiredFailureMsg(
2069 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2070 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
2071 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002072
2073 VkFenceCreateInfo fenceInfo = {};
2074 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2075 fenceInfo.pNext = NULL;
2076 fenceInfo.flags = 0;
2077
2078 ASSERT_NO_FATAL_FAILURE(InitState());
2079 ASSERT_NO_FATAL_FAILURE(InitViewport());
2080 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2081
Karl Schultz6addd812016-02-02 17:17:23 -07002082 // We luck out b/c by default the framework creates CB w/ the
2083 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002084 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002085 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2086 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002087 EndCommandBuffer();
2088
2089 testFence.init(*m_device, fenceInfo);
2090
2091 // Bypass framework since it does the waits automatically
2092 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002093 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002094 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2095 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002096 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002097 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002098 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002099 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002100 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002101 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002102 submit_info.pSignalSemaphores = NULL;
2103
Karl Schultz6addd812016-02-02 17:17:23 -07002104 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
2105 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002106
Karl Schultz6addd812016-02-02 17:17:23 -07002107 // Cause validation error by re-submitting cmd buffer that should only be
2108 // submitted once
2109 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002110
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002111 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06002112}
2113
Karl Schultz6addd812016-02-02 17:17:23 -07002114TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002115 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07002116 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002117
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002119 "Unable to allocate 1 descriptors of "
2120 "type "
2121 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002122
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002123 ASSERT_NO_FATAL_FAILURE(InitState());
2124 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002125
Karl Schultz6addd812016-02-02 17:17:23 -07002126 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
2127 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002128 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002129 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2130 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002131
2132 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002133 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2134 ds_pool_ci.pNext = NULL;
2135 ds_pool_ci.flags = 0;
2136 ds_pool_ci.maxSets = 1;
2137 ds_pool_ci.poolSizeCount = 1;
2138 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002139
2140 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002141 err =
2142 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002143 ASSERT_VK_SUCCESS(err);
2144
2145 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002146 dsl_binding.binding = 0;
2147 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2148 dsl_binding.descriptorCount = 1;
2149 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2150 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002151
2152 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002153 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2154 ds_layout_ci.pNext = NULL;
2155 ds_layout_ci.bindingCount = 1;
2156 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002157
2158 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002159 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2160 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002161 ASSERT_VK_SUCCESS(err);
2162
2163 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002164 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002165 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002166 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002167 alloc_info.descriptorPool = ds_pool;
2168 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002169 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2170 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002171
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002172 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002173
Chia-I Wuf7458c52015-10-26 21:10:41 +08002174 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2175 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06002176}
2177
Karl Schultz6addd812016-02-02 17:17:23 -07002178TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
2179 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06002180
Karl Schultz6addd812016-02-02 17:17:23 -07002181 m_errorMonitor->SetDesiredFailureMsg(
2182 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2183 "It is invalid to call vkFreeDescriptorSets() with a pool created "
2184 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002185
Tobin Ehlise735c692015-10-08 13:13:50 -06002186 ASSERT_NO_FATAL_FAILURE(InitState());
2187 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06002188
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002189 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002190 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2191 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06002192
2193 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002194 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2195 ds_pool_ci.pNext = NULL;
2196 ds_pool_ci.maxSets = 1;
2197 ds_pool_ci.poolSizeCount = 1;
2198 ds_pool_ci.flags = 0;
2199 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
2200 // app can only call vkResetDescriptorPool on this pool.;
2201 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06002202
2203 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002204 err =
2205 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06002206 ASSERT_VK_SUCCESS(err);
2207
2208 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002209 dsl_binding.binding = 0;
2210 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2211 dsl_binding.descriptorCount = 1;
2212 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2213 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06002214
2215 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002216 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2217 ds_layout_ci.pNext = NULL;
2218 ds_layout_ci.bindingCount = 1;
2219 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06002220
2221 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002222 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2223 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06002224 ASSERT_VK_SUCCESS(err);
2225
2226 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002227 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002228 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002229 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002230 alloc_info.descriptorPool = ds_pool;
2231 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002232 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2233 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06002234 ASSERT_VK_SUCCESS(err);
2235
2236 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002237 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06002238
Chia-I Wuf7458c52015-10-26 21:10:41 +08002239 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2240 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06002241}
2242
Karl Schultz6addd812016-02-02 17:17:23 -07002243TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002244 // Attempt to clear Descriptor Pool with bad object.
2245 // ObjectTracker should catch this.
2246 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2247 "Invalid VkDescriptorPool Object 0xbaad6001");
2248 VkDescriptorPool badPool = (VkDescriptorPool)0xbaad6001;
2249 vkResetDescriptorPool(device(), badPool, 0);
2250 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002251}
2252
Karl Schultz6addd812016-02-02 17:17:23 -07002253TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002254 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
2255 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002256 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06002257 // call vkCmdBindDescriptorSets w/ false Descriptor Set
2258 VkDescriptorSet badSet = (VkDescriptorSet)0xbaad6001;
2259 VkResult err;
2260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2261 "Invalid VkDescriptorSet Object 0xbaad6001");
2262
2263 ASSERT_NO_FATAL_FAILURE(InitState());
2264
2265 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
2266 layout_bindings[0].binding = 0;
2267 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2268 layout_bindings[0].descriptorCount = 1;
2269 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2270 layout_bindings[0].pImmutableSamplers = NULL;
2271
2272 VkDescriptorSetLayout descriptor_set_layout;
2273 VkDescriptorSetLayoutCreateInfo dslci = {};
2274 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2275 dslci.pNext = NULL;
2276 dslci.bindingCount = 1;
2277 dslci.pBindings = layout_bindings;
2278 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
2279 assert(!err);
2280
2281 VkPipelineLayout pipeline_layout;
2282 VkPipelineLayoutCreateInfo plci = {};
2283 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2284 plci.pNext = NULL;
2285 plci.setLayoutCount = 1;
2286 plci.pSetLayouts = &descriptor_set_layout;
2287 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2288 assert(!err);
2289
2290 BeginCommandBuffer();
2291 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
2292 pipeline_layout, 0, 1, &badSet, 0, NULL);
2293 m_errorMonitor->VerifyFound();
2294 EndCommandBuffer();
2295 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
2296 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002297}
2298
Karl Schultz6addd812016-02-02 17:17:23 -07002299TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002300 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
2301 // ObjectTracker should catch this.
2302 VkDescriptorSetLayout bad_layout = (VkDescriptorSetLayout)0xbaad6001;
2303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2304 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
2305
2306 VkPipelineLayout pipeline_layout;
2307 VkPipelineLayoutCreateInfo plci = {};
2308 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2309 plci.pNext = NULL;
2310 plci.setLayoutCount = 1;
2311 plci.pSetLayouts = &bad_layout;
2312 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
2313
2314 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002315}
2316
Karl Schultz6addd812016-02-02 17:17:23 -07002317TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06002318 // Attempt to bind an invalid Pipeline to a valid Command Buffer
2319 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002320 // Create a valid cmd buffer
2321 // call vkCmdBindPipeline w/ false Pipeline
Karl Schultzbdb75952016-04-19 11:36:49 -06002322 VkPipeline bad_pipeline = (VkPipeline)0xbaad6001;
2323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2324 "Invalid VkPipeline Object 0xbaad6001");
2325 ASSERT_NO_FATAL_FAILURE(InitState());
2326 BeginCommandBuffer();
2327 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2328 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
2329 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06002330}
2331
Karl Schultz6addd812016-02-02 17:17:23 -07002332TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
2333 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
2334 // CommandBuffer
2335 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002336
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07002337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002338 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002339
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002340 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06002341 ASSERT_NO_FATAL_FAILURE(InitViewport());
2342 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002343 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002344 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2345 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06002346
2347 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002348 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2349 ds_pool_ci.pNext = NULL;
2350 ds_pool_ci.maxSets = 1;
2351 ds_pool_ci.poolSizeCount = 1;
2352 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06002353
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002354 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002355 err =
2356 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002357 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002358
Tony Barboureb254902015-07-15 12:50:33 -06002359 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002360 dsl_binding.binding = 0;
2361 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2362 dsl_binding.descriptorCount = 1;
2363 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2364 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002365
Tony Barboureb254902015-07-15 12:50:33 -06002366 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002367 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2368 ds_layout_ci.pNext = NULL;
2369 ds_layout_ci.bindingCount = 1;
2370 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002371 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002372 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2373 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002374 ASSERT_VK_SUCCESS(err);
2375
2376 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002377 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002378 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002379 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002380 alloc_info.descriptorPool = ds_pool;
2381 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002382 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2383 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002384 ASSERT_VK_SUCCESS(err);
2385
Tony Barboureb254902015-07-15 12:50:33 -06002386 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002387 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2388 pipeline_layout_ci.pNext = NULL;
2389 pipeline_layout_ci.setLayoutCount = 1;
2390 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002391
2392 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002393 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2394 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002395 ASSERT_VK_SUCCESS(err);
2396
Karl Schultz6addd812016-02-02 17:17:23 -07002397 VkShaderObj vs(m_device, bindStateVertShaderText,
2398 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06002399 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07002400 // on more devices
2401 VkShaderObj fs(m_device, bindStateFragShaderText,
2402 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002403
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002404 VkPipelineObj pipe(m_device);
2405 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06002406 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06002407 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06002408 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06002409
2410 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002411 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2412 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2413 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2414 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2415 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06002416
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002417 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002418
Chia-I Wuf7458c52015-10-26 21:10:41 +08002419 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2420 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2421 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06002422}
2423
Karl Schultz6addd812016-02-02 17:17:23 -07002424TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002425 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07002426 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002427
Karl Schultz6addd812016-02-02 17:17:23 -07002428 m_errorMonitor->SetDesiredFailureMsg(
2429 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002430 "Attempt to update descriptor with invalid bufferView ");
2431
2432 ASSERT_NO_FATAL_FAILURE(InitState());
2433 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002434 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2435 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002436
2437 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002438 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2439 ds_pool_ci.pNext = NULL;
2440 ds_pool_ci.maxSets = 1;
2441 ds_pool_ci.poolSizeCount = 1;
2442 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002443
2444 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002445 err =
2446 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002447 ASSERT_VK_SUCCESS(err);
2448
2449 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002450 dsl_binding.binding = 0;
2451 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2452 dsl_binding.descriptorCount = 1;
2453 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2454 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002455
2456 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002457 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2458 ds_layout_ci.pNext = NULL;
2459 ds_layout_ci.bindingCount = 1;
2460 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002461 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002462 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2463 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002464 ASSERT_VK_SUCCESS(err);
2465
2466 VkDescriptorSet descriptorSet;
2467 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002468 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002469 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002470 alloc_info.descriptorPool = ds_pool;
2471 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002472 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2473 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002474 ASSERT_VK_SUCCESS(err);
2475
Karl Schultz6addd812016-02-02 17:17:23 -07002476 VkBufferView view =
2477 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002478 VkWriteDescriptorSet descriptor_write;
2479 memset(&descriptor_write, 0, sizeof(descriptor_write));
2480 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2481 descriptor_write.dstSet = descriptorSet;
2482 descriptor_write.dstBinding = 0;
2483 descriptor_write.descriptorCount = 1;
2484 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
2485 descriptor_write.pTexelBufferView = &view;
2486
2487 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2488
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002489 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07002490
2491 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2492 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2493}
2494
Karl Schultz6addd812016-02-02 17:17:23 -07002495TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
2496 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
2497 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07002498 // 1. No dynamicOffset supplied
2499 // 2. Too many dynamicOffsets supplied
2500 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07002501 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07002502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07002503 " requires 1 dynamicOffsets, but only "
2504 "0 dynamicOffsets are left in "
2505 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002506
2507 ASSERT_NO_FATAL_FAILURE(InitState());
2508 ASSERT_NO_FATAL_FAILURE(InitViewport());
2509 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2510
2511 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002512 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2513 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002514
2515 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002516 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2517 ds_pool_ci.pNext = NULL;
2518 ds_pool_ci.maxSets = 1;
2519 ds_pool_ci.poolSizeCount = 1;
2520 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002521
2522 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002523 err =
2524 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002525 ASSERT_VK_SUCCESS(err);
2526
2527 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002528 dsl_binding.binding = 0;
2529 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2530 dsl_binding.descriptorCount = 1;
2531 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2532 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002533
2534 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002535 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2536 ds_layout_ci.pNext = NULL;
2537 ds_layout_ci.bindingCount = 1;
2538 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002539 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002540 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2541 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002542 ASSERT_VK_SUCCESS(err);
2543
2544 VkDescriptorSet descriptorSet;
2545 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002546 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002547 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002548 alloc_info.descriptorPool = ds_pool;
2549 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002550 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2551 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002552 ASSERT_VK_SUCCESS(err);
2553
2554 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002555 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2556 pipeline_layout_ci.pNext = NULL;
2557 pipeline_layout_ci.setLayoutCount = 1;
2558 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002559
2560 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002561 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2562 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002563 ASSERT_VK_SUCCESS(err);
2564
2565 // Create a buffer to update the descriptor with
2566 uint32_t qfi = 0;
2567 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002568 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2569 buffCI.size = 1024;
2570 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2571 buffCI.queueFamilyIndexCount = 1;
2572 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002573
2574 VkBuffer dyub;
2575 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2576 ASSERT_VK_SUCCESS(err);
2577 // Correctly update descriptor to avoid "NOT_UPDATED" error
2578 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002579 buffInfo.buffer = dyub;
2580 buffInfo.offset = 0;
2581 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002582
2583 VkWriteDescriptorSet descriptor_write;
2584 memset(&descriptor_write, 0, sizeof(descriptor_write));
2585 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2586 descriptor_write.dstSet = descriptorSet;
2587 descriptor_write.dstBinding = 0;
2588 descriptor_write.descriptorCount = 1;
2589 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
2590 descriptor_write.pBufferInfo = &buffInfo;
2591
2592 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
2593
2594 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002595 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2596 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2597 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002598 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002599 uint32_t pDynOff[2] = {512, 756};
2600 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07002601 m_errorMonitor->SetDesiredFailureMsg(
2602 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002603 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07002604 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2605 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2606 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12002607 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07002608 // Finally cause error due to dynamicOffset being too big
Karl Schultz6addd812016-02-02 17:17:23 -07002609 m_errorMonitor->SetDesiredFailureMsg(
2610 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07002611 " from its update, this oversteps its buffer (");
2612 // Create PSO to be used for draw-time errors below
2613 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002614 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002615 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002616 "out gl_PerVertex { \n"
2617 " vec4 gl_Position;\n"
2618 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002619 "void main(){\n"
2620 " gl_Position = vec4(1);\n"
2621 "}\n";
2622 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002623 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07002624 "\n"
2625 "layout(location=0) out vec4 x;\n"
2626 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2627 "void main(){\n"
2628 " x = vec4(bar.y);\n"
2629 "}\n";
2630 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2631 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2632 VkPipelineObj pipe(m_device);
2633 pipe.AddShader(&vs);
2634 pipe.AddShader(&fs);
2635 pipe.AddColorAttachment();
2636 pipe.CreateVKPipeline(pipeline_layout, renderPass());
2637
Karl Schultz6addd812016-02-02 17:17:23 -07002638 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
2639 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
2640 // This update should succeed, but offset size of 512 will overstep buffer
2641 // /w range 1024 & size 1024
2642 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
2643 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
2644 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07002645 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002646 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07002647
2648 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2649 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
2650}
2651
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002652TEST_F(VkLayerTest, InvalidPushConstants) {
2653 // Hit push constant error cases:
2654 // 1. Create PipelineLayout where push constant overstep maxPushConstantSize
2655 // 2. Incorrectly set push constant size to 0
2656 // 3. Incorrectly set push constant size to non-multiple of 4
2657 // 4. Attempt push constant update that exceeds maxPushConstantSize
2658 VkResult err;
2659 m_errorMonitor->SetDesiredFailureMsg(
2660 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2661 "vkCreatePipelineLayout() call has push constants with offset ");
2662
2663 ASSERT_NO_FATAL_FAILURE(InitState());
2664 ASSERT_NO_FATAL_FAILURE(InitViewport());
2665 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2666
2667 VkPushConstantRange pc_range = {};
2668 pc_range.size = 0xFFFFFFFFu;
2669 pc_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
2670 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
2671 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2672 pipeline_layout_ci.pushConstantRangeCount = 1;
2673 pipeline_layout_ci.pPushConstantRanges = &pc_range;
2674
2675 VkPipelineLayout pipeline_layout;
2676 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2677 &pipeline_layout);
2678
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002679 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002680 // Now cause errors due to size 0 and non-4 byte aligned size
2681 pc_range.size = 0;
2682 m_errorMonitor->SetDesiredFailureMsg(
2683 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2684 "vkCreatePipelineLayout() call has push constant index 0 with size 0");
2685 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2686 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002687 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002688 pc_range.size = 1;
2689 m_errorMonitor->SetDesiredFailureMsg(
2690 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2691 "vkCreatePipelineLayout() call has push constant index 0 with size 1");
2692 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2693 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002694 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002695 // Cause error due to bad size in vkCmdPushConstants() call
2696 m_errorMonitor->SetDesiredFailureMsg(
2697 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2698 "vkCmdPushConstants() call has push constants with offset ");
2699 pipeline_layout_ci.pushConstantRangeCount = 0;
2700 pipeline_layout_ci.pPushConstantRanges = NULL;
2701 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2702 &pipeline_layout);
2703 ASSERT_VK_SUCCESS(err);
2704 BeginCommandBuffer();
2705 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
2706 VK_SHADER_STAGE_VERTEX_BIT, 0, 0xFFFFFFFFu, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002707 m_errorMonitor->VerifyFound();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07002708 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2709}
2710
Karl Schultz6addd812016-02-02 17:17:23 -07002711TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002712 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07002713 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002714
2715 ASSERT_NO_FATAL_FAILURE(InitState());
2716 ASSERT_NO_FATAL_FAILURE(InitViewport());
2717 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2718
2719 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
2720 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002721 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2722 ds_type_count[0].descriptorCount = 10;
2723 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2724 ds_type_count[1].descriptorCount = 2;
2725 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2726 ds_type_count[2].descriptorCount = 2;
2727 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
2728 ds_type_count[3].descriptorCount = 5;
2729 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
2730 // type
2731 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
2732 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
2733 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002734
2735 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002736 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2737 ds_pool_ci.pNext = NULL;
2738 ds_pool_ci.maxSets = 5;
2739 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
2740 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002741
2742 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07002743 err =
2744 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002745 ASSERT_VK_SUCCESS(err);
2746
2747 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
2748 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002749 dsl_binding[0].binding = 0;
2750 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2751 dsl_binding[0].descriptorCount = 5;
2752 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
2753 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002754
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002755 // Create layout identical to set0 layout but w/ different stageFlags
2756 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002757 dsl_fs_stage_only.binding = 0;
2758 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2759 dsl_fs_stage_only.descriptorCount = 5;
2760 dsl_fs_stage_only.stageFlags =
2761 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
2762 // bind time
2763 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002764 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002765 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2766 ds_layout_ci.pNext = NULL;
2767 ds_layout_ci.bindingCount = 1;
2768 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002769 static const uint32_t NUM_LAYOUTS = 4;
2770 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002771 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002772 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
2773 // layout for error case
2774 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2775 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002776 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002777 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002778 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2779 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002780 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002781 dsl_binding[0].binding = 0;
2782 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002783 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002784 dsl_binding[1].binding = 1;
2785 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
2786 dsl_binding[1].descriptorCount = 2;
2787 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
2788 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07002789 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002790 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002791 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2792 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002793 ASSERT_VK_SUCCESS(err);
2794 dsl_binding[0].binding = 0;
2795 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002796 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002797 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07002798 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2799 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002800 ASSERT_VK_SUCCESS(err);
2801 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002802 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07002803 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
2804 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002805 ASSERT_VK_SUCCESS(err);
2806
2807 static const uint32_t NUM_SETS = 4;
2808 VkDescriptorSet descriptorSet[NUM_SETS] = {};
2809 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002810 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002811 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002812 alloc_info.descriptorPool = ds_pool;
2813 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002814 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
2815 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002816 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002817 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07002818 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002819 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002820 err =
2821 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002822 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002823
2824 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002825 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2826 pipeline_layout_ci.pNext = NULL;
2827 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
2828 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002829
2830 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002831 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2832 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002833 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002834 // Create pipelineLayout with only one setLayout
2835 pipeline_layout_ci.setLayoutCount = 1;
2836 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07002837 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2838 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002839 ASSERT_VK_SUCCESS(err);
2840 // Create pipelineLayout with 2 descriptor setLayout at index 0
2841 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
2842 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07002843 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2844 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002845 ASSERT_VK_SUCCESS(err);
2846 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
2847 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
2848 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07002849 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2850 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002851 ASSERT_VK_SUCCESS(err);
2852 // Create pipelineLayout with UB type, but stageFlags for FS only
2853 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
2854 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07002855 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2856 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002857 ASSERT_VK_SUCCESS(err);
2858 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
2859 VkDescriptorSetLayout pl_bad_s0[2] = {};
2860 pl_bad_s0[0] = ds_layout_fs_only;
2861 pl_bad_s0[1] = ds_layout[1];
2862 pipeline_layout_ci.setLayoutCount = 2;
2863 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
2864 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07002865 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
2866 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002867 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002868
2869 // Create a buffer to update the descriptor with
2870 uint32_t qfi = 0;
2871 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002872 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2873 buffCI.size = 1024;
2874 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2875 buffCI.queueFamilyIndexCount = 1;
2876 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002877
2878 VkBuffer dyub;
2879 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
2880 ASSERT_VK_SUCCESS(err);
2881 // Correctly update descriptor to avoid "NOT_UPDATED" error
2882 static const uint32_t NUM_BUFFS = 5;
2883 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002884 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07002885 buffInfo[i].buffer = dyub;
2886 buffInfo[i].offset = 0;
2887 buffInfo[i].range = 1024;
2888 }
Karl Schultz6addd812016-02-02 17:17:23 -07002889 VkImage image;
2890 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2891 const int32_t tex_width = 32;
2892 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002893 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002894 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2895 image_create_info.pNext = NULL;
2896 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2897 image_create_info.format = tex_format;
2898 image_create_info.extent.width = tex_width;
2899 image_create_info.extent.height = tex_height;
2900 image_create_info.extent.depth = 1;
2901 image_create_info.mipLevels = 1;
2902 image_create_info.arrayLayers = 1;
2903 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2904 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2905 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2906 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002907 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2908 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002909
Karl Schultz6addd812016-02-02 17:17:23 -07002910 VkMemoryRequirements memReqs;
2911 VkDeviceMemory imageMem;
2912 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002913 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002914 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2915 memAlloc.pNext = NULL;
2916 memAlloc.allocationSize = 0;
2917 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002918 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
2919 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002920 pass =
2921 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07002922 ASSERT_TRUE(pass);
2923 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
2924 ASSERT_VK_SUCCESS(err);
2925 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
2926 ASSERT_VK_SUCCESS(err);
2927
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002928 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002929 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2930 image_view_create_info.image = image;
2931 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
2932 image_view_create_info.format = tex_format;
2933 image_view_create_info.subresourceRange.layerCount = 1;
2934 image_view_create_info.subresourceRange.baseMipLevel = 0;
2935 image_view_create_info.subresourceRange.levelCount = 1;
2936 image_view_create_info.subresourceRange.aspectMask =
2937 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07002938
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002939 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07002940 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
2941 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002942 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002943 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002944 imageInfo[0].imageView = view;
2945 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2946 imageInfo[1].imageView = view;
2947 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002948 imageInfo[2].imageView = view;
2949 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
2950 imageInfo[3].imageView = view;
2951 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002952
2953 static const uint32_t NUM_SET_UPDATES = 3;
2954 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
2955 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2956 descriptor_write[0].dstSet = descriptorSet[0];
2957 descriptor_write[0].dstBinding = 0;
2958 descriptor_write[0].descriptorCount = 5;
2959 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2960 descriptor_write[0].pBufferInfo = buffInfo;
2961 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2962 descriptor_write[1].dstSet = descriptorSet[1];
2963 descriptor_write[1].dstBinding = 0;
2964 descriptor_write[1].descriptorCount = 2;
2965 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
2966 descriptor_write[1].pImageInfo = imageInfo;
2967 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
2968 descriptor_write[2].dstSet = descriptorSet[1];
2969 descriptor_write[2].dstBinding = 1;
2970 descriptor_write[2].descriptorCount = 2;
2971 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07002972 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07002973
2974 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002975
Tobin Ehlis88452832015-12-03 09:40:56 -07002976 // Create PSO to be used for draw-time errors below
2977 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002978 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002979 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07002980 "out gl_PerVertex {\n"
2981 " vec4 gl_Position;\n"
2982 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002983 "void main(){\n"
2984 " gl_Position = vec4(1);\n"
2985 "}\n";
2986 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12002987 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07002988 "\n"
2989 "layout(location=0) out vec4 x;\n"
2990 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
2991 "void main(){\n"
2992 " x = vec4(bar.y);\n"
2993 "}\n";
2994 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2995 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07002996 VkPipelineObj pipe(m_device);
2997 pipe.AddShader(&vs);
2998 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07002999 pipe.AddColorAttachment();
3000 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07003001
3002 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07003003
Karl Schultz6addd812016-02-02 17:17:23 -07003004 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3005 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3006 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
3007 // of PSO
3008 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
3009 // cmd_pipeline.c
3010 // due to the fact that cmd_alloc_dset_data() has not been called in
3011 // cmd_bind_graphics_pipeline()
3012 // TODO : Want to cause various binding incompatibility issues here to test
3013 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07003014 // First cause various verify_layout_compatibility() fails
3015 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003016 // verify_set_layout_compatibility fail cases:
3017 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07003018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3019 " due to: invalid VkPipelineLayout ");
3020 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3021 VK_PIPELINE_BIND_POINT_GRAPHICS,
3022 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
3023 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003024 m_errorMonitor->VerifyFound();
3025
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003026 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07003027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3028 " attempting to bind set to index 1");
3029 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3030 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
3031 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003032 m_errorMonitor->VerifyFound();
3033
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003034 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003035 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
3036 // descriptors
3037 m_errorMonitor->SetDesiredFailureMsg(
3038 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3039 ", but corresponding set being bound has 5 descriptors.");
3040 vkCmdBindDescriptorSets(
3041 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3042 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003043 m_errorMonitor->VerifyFound();
3044
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003045 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
3046 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07003047 m_errorMonitor->SetDesiredFailureMsg(
3048 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3049 " descriptor from pipelineLayout is type 'VK_DESCRIPTOR_TYPE_SAMPLER'");
3050 vkCmdBindDescriptorSets(
3051 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3052 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003053 m_errorMonitor->VerifyFound();
3054
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003055 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
3056 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07003057 m_errorMonitor->SetDesiredFailureMsg(
3058 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3059 " descriptor from pipelineLayout has stageFlags ");
3060 vkCmdBindDescriptorSets(
3061 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3062 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003063 m_errorMonitor->VerifyFound();
3064
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003065 // Cause INFO messages due to disturbing previously bound Sets
3066 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07003067 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3068 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3069 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003070 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07003071 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003072 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003073 " previously bound as set #0 was disturbed ");
3074 vkCmdBindDescriptorSets(
3075 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3076 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003077 m_errorMonitor->VerifyFound();
3078
Karl Schultz6addd812016-02-02 17:17:23 -07003079 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3080 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3081 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003082 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07003083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003084 " newly bound as set #0 so set #1 and "
3085 "any subsequent sets were disturbed ");
3086 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3087 VK_PIPELINE_BIND_POINT_GRAPHICS,
3088 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003089 m_errorMonitor->VerifyFound();
3090
Tobin Ehlis88452832015-12-03 09:40:56 -07003091 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07003092 // 1. Error due to not binding required set (we actually use same code as
3093 // above to disturb set0)
3094 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3095 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3096 2, &descriptorSet[0], 0, NULL);
3097 vkCmdBindDescriptorSets(
3098 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
3099 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
3100 m_errorMonitor->SetDesiredFailureMsg(
3101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3102 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07003103 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003104 m_errorMonitor->VerifyFound();
3105
Tobin Ehlis991d45a2016-01-06 08:48:41 -07003106 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003107 // 2. Error due to bound set not being compatible with PSO's
3108 // VkPipelineLayout (diff stageFlags in this case)
3109 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
3110 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
3111 2, &descriptorSet[0], 0, NULL);
3112 m_errorMonitor->SetDesiredFailureMsg(
3113 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3114 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07003115 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003116 m_errorMonitor->VerifyFound();
3117
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003118 // Remaining clean-up
3119 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07003120 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07003121 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
3122 }
3123 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
3124 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, descriptorSet);
3125 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07003126 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3127 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3128}
Tobin Ehlis559c6382015-11-05 09:52:49 -07003129
Karl Schultz6addd812016-02-02 17:17:23 -07003130TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003131
Karl Schultz6addd812016-02-02 17:17:23 -07003132 m_errorMonitor->SetDesiredFailureMsg(
3133 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003134 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003135
3136 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003137 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003138 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003139 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003140
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003141 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003142}
3143
Karl Schultz6addd812016-02-02 17:17:23 -07003144TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
3145 VkResult err;
3146 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003147
Karl Schultz6addd812016-02-02 17:17:23 -07003148 m_errorMonitor->SetDesiredFailureMsg(
3149 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07003150 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003151
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003152 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003153
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003154 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003155 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003156 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003157 cmd.commandPool = m_commandPool;
3158 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003159 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06003160
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003161 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06003162 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003163
3164 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003165 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003166 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003167 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06003168 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07003169 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
3170 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003171 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003172
3173 // The error should be caught by validation of the BeginCommandBuffer call
3174 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
3175
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003176 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003177 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06003178}
3179
Karl Schultz6addd812016-02-02 17:17:23 -07003180TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003181 // Cause error due to Begin while recording CB
3182 // Then cause 2 errors for attempting to reset CB w/o having
3183 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
3184 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003186 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003187
3188 ASSERT_NO_FATAL_FAILURE(InitState());
3189
3190 // Calls AllocateCommandBuffers
3191 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
3192
Karl Schultz6addd812016-02-02 17:17:23 -07003193 // Force the failure by setting the Renderpass and Framebuffer fields with
3194 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003195 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07003196 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003197 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3198 cmd_buf_info.pNext = NULL;
3199 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003200 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003201
3202 // Begin CB to transition to recording state
3203 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
3204 // Can't re-begin. This should trigger error
3205 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003206 m_errorMonitor->VerifyFound();
3207
Karl Schultz6addd812016-02-02 17:17:23 -07003208 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3209 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003210 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
3211 // Reset attempt will trigger error due to incorrect CommandPool state
3212 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003213 m_errorMonitor->VerifyFound();
3214
Karl Schultz6addd812016-02-02 17:17:23 -07003215 m_errorMonitor->SetDesiredFailureMsg(
3216 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3217 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003218 // Transition CB to RECORDED state
3219 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
3220 // Now attempting to Begin will implicitly reset, which triggers error
3221 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003222 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07003223}
3224
Karl Schultz6addd812016-02-02 17:17:23 -07003225TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003226 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003227 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003228
Karl Schultz6addd812016-02-02 17:17:23 -07003229 m_errorMonitor->SetDesiredFailureMsg(
3230 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003231 "Invalid Pipeline CreateInfo State: Vtx Shader required");
3232
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003233 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003234 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003235
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003236 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003237 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3238 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06003239
3240 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003241 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3242 ds_pool_ci.pNext = NULL;
3243 ds_pool_ci.maxSets = 1;
3244 ds_pool_ci.poolSizeCount = 1;
3245 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003246
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003247 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003248 err =
3249 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003250 ASSERT_VK_SUCCESS(err);
3251
Tony Barboureb254902015-07-15 12:50:33 -06003252 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003253 dsl_binding.binding = 0;
3254 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3255 dsl_binding.descriptorCount = 1;
3256 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3257 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003258
Tony Barboureb254902015-07-15 12:50:33 -06003259 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003260 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3261 ds_layout_ci.pNext = NULL;
3262 ds_layout_ci.bindingCount = 1;
3263 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06003264
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003265 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003266 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3267 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003268 ASSERT_VK_SUCCESS(err);
3269
3270 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003271 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003272 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003273 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003274 alloc_info.descriptorPool = ds_pool;
3275 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003276 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3277 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003278 ASSERT_VK_SUCCESS(err);
3279
Tony Barboureb254902015-07-15 12:50:33 -06003280 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003281 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3282 pipeline_layout_ci.setLayoutCount = 1;
3283 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003284
3285 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003286 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3287 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003288 ASSERT_VK_SUCCESS(err);
3289
Tobin Ehlise68360f2015-10-01 11:15:13 -06003290 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07003291 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06003292
3293 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003294 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3295 vp_state_ci.scissorCount = 1;
3296 vp_state_ci.pScissors = &sc;
3297 vp_state_ci.viewportCount = 1;
3298 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003299
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003300 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3301 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3302 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3303 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3304 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3305 rs_state_ci.depthClampEnable = VK_FALSE;
3306 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3307 rs_state_ci.depthBiasEnable = VK_FALSE;
3308
Tony Barboureb254902015-07-15 12:50:33 -06003309 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003310 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3311 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003312 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003313 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3314 gp_ci.layout = pipeline_layout;
3315 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06003316
3317 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003318 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3319 pc_ci.initialDataSize = 0;
3320 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003321
3322 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003323 VkPipelineCache pipelineCache;
3324
Karl Schultz6addd812016-02-02 17:17:23 -07003325 err =
3326 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06003327 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003328 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3329 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06003330
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003331 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003332
Chia-I Wuf7458c52015-10-26 21:10:41 +08003333 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3334 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3335 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3336 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003337}
Tobin Ehlis912df022015-09-17 08:46:18 -06003338/*// TODO : This test should be good, but needs Tess support in compiler to run
3339TEST_F(VkLayerTest, InvalidPatchControlPoints)
3340{
3341 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06003342 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06003343
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003345 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
3346primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003347
Tobin Ehlis912df022015-09-17 08:46:18 -06003348 ASSERT_NO_FATAL_FAILURE(InitState());
3349 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06003350
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003351 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06003352 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003353 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003354
3355 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3356 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3357 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003358 ds_pool_ci.poolSizeCount = 1;
3359 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06003360
3361 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003362 err = vkCreateDescriptorPool(m_device->device(),
3363VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06003364 ASSERT_VK_SUCCESS(err);
3365
3366 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08003367 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06003368 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08003369 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003370 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3371 dsl_binding.pImmutableSamplers = NULL;
3372
3373 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003374 ds_layout_ci.sType =
3375VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003376 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003377 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07003378 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06003379
3380 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003381 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3382&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003383 ASSERT_VK_SUCCESS(err);
3384
3385 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07003386 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
3387VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06003388 ASSERT_VK_SUCCESS(err);
3389
3390 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003391 pipeline_layout_ci.sType =
3392VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06003393 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003394 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06003395 pipeline_layout_ci.pSetLayouts = &ds_layout;
3396
3397 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003398 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3399&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06003400 ASSERT_VK_SUCCESS(err);
3401
3402 VkPipelineShaderStageCreateInfo shaderStages[3];
3403 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
3404
Karl Schultz6addd812016-02-02 17:17:23 -07003405 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
3406this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003407 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07003408 VkShaderObj
3409tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
3410this);
3411 VkShaderObj
3412te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
3413this);
Tobin Ehlis912df022015-09-17 08:46:18 -06003414
Karl Schultz6addd812016-02-02 17:17:23 -07003415 shaderStages[0].sType =
3416VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003417 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003418 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003419 shaderStages[1].sType =
3420VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003421 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003422 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07003423 shaderStages[2].sType =
3424VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06003425 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06003426 shaderStages[2].shader = te.handle();
3427
3428 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003429 iaCI.sType =
3430VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08003431 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06003432
3433 VkPipelineTessellationStateCreateInfo tsCI = {};
3434 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
3435 tsCI.patchControlPoints = 0; // This will cause an error
3436
3437 VkGraphicsPipelineCreateInfo gp_ci = {};
3438 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3439 gp_ci.pNext = NULL;
3440 gp_ci.stageCount = 3;
3441 gp_ci.pStages = shaderStages;
3442 gp_ci.pVertexInputState = NULL;
3443 gp_ci.pInputAssemblyState = &iaCI;
3444 gp_ci.pTessellationState = &tsCI;
3445 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003446 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06003447 gp_ci.pMultisampleState = NULL;
3448 gp_ci.pDepthStencilState = NULL;
3449 gp_ci.pColorBlendState = NULL;
3450 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3451 gp_ci.layout = pipeline_layout;
3452 gp_ci.renderPass = renderPass();
3453
3454 VkPipelineCacheCreateInfo pc_ci = {};
3455 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
3456 pc_ci.pNext = NULL;
3457 pc_ci.initialSize = 0;
3458 pc_ci.initialData = 0;
3459 pc_ci.maxSize = 0;
3460
3461 VkPipeline pipeline;
3462 VkPipelineCache pipelineCache;
3463
Karl Schultz6addd812016-02-02 17:17:23 -07003464 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
3465&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06003466 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003467 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3468&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06003469
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003470 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003471
Chia-I Wuf7458c52015-10-26 21:10:41 +08003472 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3473 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3474 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3475 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06003476}
3477*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06003478// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07003479TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07003480 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003481
Karl Schultz6addd812016-02-02 17:17:23 -07003482 m_errorMonitor->SetDesiredFailureMsg(
3483 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003484 "Gfx Pipeline viewport count (1) must match scissor count (0).");
3485
Tobin Ehlise68360f2015-10-01 11:15:13 -06003486 ASSERT_NO_FATAL_FAILURE(InitState());
3487 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003488
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003489 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003490 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3491 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003492
3493 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003494 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3495 ds_pool_ci.maxSets = 1;
3496 ds_pool_ci.poolSizeCount = 1;
3497 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003498
3499 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003500 err =
3501 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003502 ASSERT_VK_SUCCESS(err);
3503
3504 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003505 dsl_binding.binding = 0;
3506 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3507 dsl_binding.descriptorCount = 1;
3508 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003509
3510 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003511 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3512 ds_layout_ci.bindingCount = 1;
3513 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003514
3515 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003516 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3517 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003518 ASSERT_VK_SUCCESS(err);
3519
3520 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003521 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003522 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003523 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003524 alloc_info.descriptorPool = ds_pool;
3525 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003526 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3527 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003528 ASSERT_VK_SUCCESS(err);
3529
3530 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003531 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3532 pipeline_layout_ci.setLayoutCount = 1;
3533 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003534
3535 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003536 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3537 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003538 ASSERT_VK_SUCCESS(err);
3539
3540 VkViewport vp = {}; // Just need dummy vp to point to
3541
3542 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003543 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3544 vp_state_ci.scissorCount = 0;
3545 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
3546 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003547
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003548 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3549 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3550 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3551 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3552 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3553 rs_state_ci.depthClampEnable = VK_FALSE;
3554 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3555 rs_state_ci.depthBiasEnable = VK_FALSE;
3556
Cody Northropeb3a6c12015-10-05 14:44:45 -06003557 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003558 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003559
Karl Schultz6addd812016-02-02 17:17:23 -07003560 VkShaderObj vs(m_device, bindStateVertShaderText,
3561 VK_SHADER_STAGE_VERTEX_BIT, this);
3562 VkShaderObj fs(m_device, bindStateFragShaderText,
3563 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003564 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003565 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003566 shaderStages[0] = vs.GetStageCreateInfo();
3567 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003568
3569 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003570 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3571 gp_ci.stageCount = 2;
3572 gp_ci.pStages = shaderStages;
3573 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003574 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003575 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3576 gp_ci.layout = pipeline_layout;
3577 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003578
3579 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003580 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003581
3582 VkPipeline pipeline;
3583 VkPipelineCache pipelineCache;
3584
Karl Schultz6addd812016-02-02 17:17:23 -07003585 err =
3586 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003587 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003588 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3589 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003590
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003591 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003592
Chia-I Wuf7458c52015-10-26 21:10:41 +08003593 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3594 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3595 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3596 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003597}
Karl Schultz6addd812016-02-02 17:17:23 -07003598// Don't set viewport state in PSO. This is an error b/c we always need this
3599// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06003600// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07003601TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06003602 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07003603 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003604
Karl Schultz6addd812016-02-02 17:17:23 -07003605 m_errorMonitor->SetDesiredFailureMsg(
3606 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003607 "Gfx Pipeline pViewportState is null. Even if ");
3608
Tobin Ehlise68360f2015-10-01 11:15:13 -06003609 ASSERT_NO_FATAL_FAILURE(InitState());
3610 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003611
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003612 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003613 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3614 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003615
3616 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003617 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3618 ds_pool_ci.maxSets = 1;
3619 ds_pool_ci.poolSizeCount = 1;
3620 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003621
3622 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003623 err =
3624 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003625 ASSERT_VK_SUCCESS(err);
3626
3627 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003628 dsl_binding.binding = 0;
3629 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3630 dsl_binding.descriptorCount = 1;
3631 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003632
3633 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003634 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3635 ds_layout_ci.bindingCount = 1;
3636 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003637
3638 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003639 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3640 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003641 ASSERT_VK_SUCCESS(err);
3642
3643 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003644 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003645 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003646 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003647 alloc_info.descriptorPool = ds_pool;
3648 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003649 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3650 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003651 ASSERT_VK_SUCCESS(err);
3652
3653 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003654 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3655 pipeline_layout_ci.setLayoutCount = 1;
3656 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003657
3658 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003659 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3660 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003661 ASSERT_VK_SUCCESS(err);
3662
3663 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3664 // Set scissor as dynamic to avoid second error
3665 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003666 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3667 dyn_state_ci.dynamicStateCount = 1;
3668 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003669
Cody Northropeb3a6c12015-10-05 14:44:45 -06003670 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003671 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003672
Karl Schultz6addd812016-02-02 17:17:23 -07003673 VkShaderObj vs(m_device, bindStateVertShaderText,
3674 VK_SHADER_STAGE_VERTEX_BIT, this);
3675 VkShaderObj fs(m_device, bindStateFragShaderText,
3676 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003677 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003678 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003679 shaderStages[0] = vs.GetStageCreateInfo();
3680 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003681
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003682
3683 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
3684 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3685 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
3686 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
3687 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
3688 rs_state_ci.depthClampEnable = VK_FALSE;
3689 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
3690 rs_state_ci.depthBiasEnable = VK_FALSE;
3691
Tobin Ehlise68360f2015-10-01 11:15:13 -06003692 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003693 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3694 gp_ci.stageCount = 2;
3695 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07003696 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07003697 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
3698 // should cause validation error
3699 gp_ci.pDynamicState = &dyn_state_ci;
3700 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3701 gp_ci.layout = pipeline_layout;
3702 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003703
3704 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003705 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003706
3707 VkPipeline pipeline;
3708 VkPipelineCache pipelineCache;
3709
Karl Schultz6addd812016-02-02 17:17:23 -07003710 err =
3711 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003712 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003713 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3714 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003715
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003716 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003717
Chia-I Wuf7458c52015-10-26 21:10:41 +08003718 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3719 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3720 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3721 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003722}
3723// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07003724// Then run second test where dynamic scissor count doesn't match PSO scissor
3725// count
3726TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
3727 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003728
Karl Schultz6addd812016-02-02 17:17:23 -07003729 m_errorMonitor->SetDesiredFailureMsg(
3730 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003731 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
3732
Tobin Ehlise68360f2015-10-01 11:15:13 -06003733 ASSERT_NO_FATAL_FAILURE(InitState());
3734 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06003735
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003736 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003737 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3738 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003739
3740 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003741 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3742 ds_pool_ci.maxSets = 1;
3743 ds_pool_ci.poolSizeCount = 1;
3744 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003745
3746 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003747 err =
3748 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003749 ASSERT_VK_SUCCESS(err);
3750
3751 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003752 dsl_binding.binding = 0;
3753 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3754 dsl_binding.descriptorCount = 1;
3755 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003756
3757 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003758 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3759 ds_layout_ci.bindingCount = 1;
3760 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003761
3762 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003763 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3764 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003765 ASSERT_VK_SUCCESS(err);
3766
3767 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003768 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003769 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003770 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003771 alloc_info.descriptorPool = ds_pool;
3772 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003773 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3774 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003775 ASSERT_VK_SUCCESS(err);
3776
3777 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003778 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3779 pipeline_layout_ci.setLayoutCount = 1;
3780 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003781
3782 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003783 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3784 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003785 ASSERT_VK_SUCCESS(err);
3786
3787 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003788 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3789 vp_state_ci.viewportCount = 1;
3790 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
3791 vp_state_ci.scissorCount = 1;
3792 vp_state_ci.pScissors =
3793 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06003794
3795 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
3796 // Set scissor as dynamic to avoid that error
3797 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003798 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3799 dyn_state_ci.dynamicStateCount = 1;
3800 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003801
Cody Northropeb3a6c12015-10-05 14:44:45 -06003802 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07003803 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06003804
Karl Schultz6addd812016-02-02 17:17:23 -07003805 VkShaderObj vs(m_device, bindStateVertShaderText,
3806 VK_SHADER_STAGE_VERTEX_BIT, this);
3807 VkShaderObj fs(m_device, bindStateFragShaderText,
3808 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003809 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003810 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08003811 shaderStages[0] = vs.GetStageCreateInfo();
3812 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003813
Cody Northropf6622dc2015-10-06 10:33:21 -06003814 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3815 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3816 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003817 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003818 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003819 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06003820 vi_ci.pVertexAttributeDescriptions = nullptr;
3821
3822 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3823 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3824 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3825
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003826 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003827 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06003828 rs_ci.pNext = nullptr;
3829
Mark Youngc89c6312016-03-31 16:03:20 -06003830 VkPipelineColorBlendAttachmentState att = {};
3831 att.blendEnable = VK_FALSE;
3832 att.colorWriteMask = 0xf;
3833
Cody Northropf6622dc2015-10-06 10:33:21 -06003834 VkPipelineColorBlendStateCreateInfo cb_ci = {};
3835 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
3836 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06003837 cb_ci.attachmentCount = 1;
3838 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06003839
Tobin Ehlise68360f2015-10-01 11:15:13 -06003840 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003841 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
3842 gp_ci.stageCount = 2;
3843 gp_ci.pStages = shaderStages;
3844 gp_ci.pVertexInputState = &vi_ci;
3845 gp_ci.pInputAssemblyState = &ia_ci;
3846 gp_ci.pViewportState = &vp_state_ci;
3847 gp_ci.pRasterizationState = &rs_ci;
3848 gp_ci.pColorBlendState = &cb_ci;
3849 gp_ci.pDynamicState = &dyn_state_ci;
3850 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
3851 gp_ci.layout = pipeline_layout;
3852 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06003853
3854 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003855 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06003856
3857 VkPipeline pipeline;
3858 VkPipelineCache pipelineCache;
3859
Karl Schultz6addd812016-02-02 17:17:23 -07003860 err =
3861 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003862 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07003863 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3864 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06003865
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003866 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003867
Tobin Ehlisd332f282015-10-02 11:00:56 -06003868 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07003869 // First need to successfully create the PSO from above by setting
3870 // pViewports
3871 m_errorMonitor->SetDesiredFailureMsg(
3872 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3873 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
3874 "scissorCount is 1. These counts must match.");
3875
3876 VkViewport vp = {}; // Just need dummy vp to point to
3877 vp_state_ci.pViewports = &vp;
3878 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
3879 &gp_ci, NULL, &pipeline);
3880 ASSERT_VK_SUCCESS(err);
3881 BeginCommandBuffer();
3882 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3883 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3884 VkRect2D scissors[2] = {}; // don't care about data
3885 // Count of 2 doesn't match PSO count of 1
3886 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
3887 Draw(1, 0, 0, 0);
3888
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003889 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07003890
3891 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
3892 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3893 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3894 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
3895}
3896// Create PSO w/o non-zero scissorCount but no scissor data
3897// Then run second test where dynamic viewportCount doesn't match PSO
3898// viewportCount
3899TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
3900 VkResult err;
3901
3902 m_errorMonitor->SetDesiredFailureMsg(
3903 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3904 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
3905
3906 ASSERT_NO_FATAL_FAILURE(InitState());
3907 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3908
3909 VkDescriptorPoolSize ds_type_count = {};
3910 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3911 ds_type_count.descriptorCount = 1;
3912
3913 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3914 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3915 ds_pool_ci.maxSets = 1;
3916 ds_pool_ci.poolSizeCount = 1;
3917 ds_pool_ci.pPoolSizes = &ds_type_count;
3918
3919 VkDescriptorPool ds_pool;
3920 err =
3921 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3922 ASSERT_VK_SUCCESS(err);
3923
3924 VkDescriptorSetLayoutBinding dsl_binding = {};
3925 dsl_binding.binding = 0;
3926 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3927 dsl_binding.descriptorCount = 1;
3928 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3929
3930 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3931 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3932 ds_layout_ci.bindingCount = 1;
3933 ds_layout_ci.pBindings = &dsl_binding;
3934
3935 VkDescriptorSetLayout ds_layout;
3936 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3937 &ds_layout);
3938 ASSERT_VK_SUCCESS(err);
3939
3940 VkDescriptorSet descriptorSet;
3941 VkDescriptorSetAllocateInfo alloc_info = {};
3942 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3943 alloc_info.descriptorSetCount = 1;
3944 alloc_info.descriptorPool = ds_pool;
3945 alloc_info.pSetLayouts = &ds_layout;
3946 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3947 &descriptorSet);
3948 ASSERT_VK_SUCCESS(err);
3949
3950 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3951 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3952 pipeline_layout_ci.setLayoutCount = 1;
3953 pipeline_layout_ci.pSetLayouts = &ds_layout;
3954
3955 VkPipelineLayout pipeline_layout;
3956 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3957 &pipeline_layout);
3958 ASSERT_VK_SUCCESS(err);
3959
3960 VkPipelineViewportStateCreateInfo vp_state_ci = {};
3961 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
3962 vp_state_ci.scissorCount = 1;
3963 vp_state_ci.pScissors =
3964 NULL; // Null scissor w/ count of 1 should cause error
3965 vp_state_ci.viewportCount = 1;
3966 vp_state_ci.pViewports =
3967 NULL; // vp is dynamic (below) so this won't cause error
3968
3969 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
3970 // Set scissor as dynamic to avoid that error
3971 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
3972 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
3973 dyn_state_ci.dynamicStateCount = 1;
3974 dyn_state_ci.pDynamicStates = &vp_state;
3975
3976 VkPipelineShaderStageCreateInfo shaderStages[2];
3977 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
3978
3979 VkShaderObj vs(m_device, bindStateVertShaderText,
3980 VK_SHADER_STAGE_VERTEX_BIT, this);
3981 VkShaderObj fs(m_device, bindStateFragShaderText,
3982 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06003983 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07003984 // but add it to be able to run on more devices
3985 shaderStages[0] = vs.GetStageCreateInfo();
3986 shaderStages[1] = fs.GetStageCreateInfo();
3987
3988 VkPipelineVertexInputStateCreateInfo vi_ci = {};
3989 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3990 vi_ci.pNext = nullptr;
3991 vi_ci.vertexBindingDescriptionCount = 0;
3992 vi_ci.pVertexBindingDescriptions = nullptr;
3993 vi_ci.vertexAttributeDescriptionCount = 0;
3994 vi_ci.pVertexAttributeDescriptions = nullptr;
3995
3996 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
3997 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
3998 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3999
4000 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4001 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4002 rs_ci.pNext = nullptr;
4003
Mark Youngc89c6312016-03-31 16:03:20 -06004004 VkPipelineColorBlendAttachmentState att = {};
4005 att.blendEnable = VK_FALSE;
4006 att.colorWriteMask = 0xf;
4007
Karl Schultz6addd812016-02-02 17:17:23 -07004008 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4009 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4010 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06004011 cb_ci.attachmentCount = 1;
4012 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07004013
4014 VkGraphicsPipelineCreateInfo gp_ci = {};
4015 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4016 gp_ci.stageCount = 2;
4017 gp_ci.pStages = shaderStages;
4018 gp_ci.pVertexInputState = &vi_ci;
4019 gp_ci.pInputAssemblyState = &ia_ci;
4020 gp_ci.pViewportState = &vp_state_ci;
4021 gp_ci.pRasterizationState = &rs_ci;
4022 gp_ci.pColorBlendState = &cb_ci;
4023 gp_ci.pDynamicState = &dyn_state_ci;
4024 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4025 gp_ci.layout = pipeline_layout;
4026 gp_ci.renderPass = renderPass();
4027
4028 VkPipelineCacheCreateInfo pc_ci = {};
4029 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4030
4031 VkPipeline pipeline;
4032 VkPipelineCache pipelineCache;
4033
4034 err =
4035 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
4036 ASSERT_VK_SUCCESS(err);
4037 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4038 &gp_ci, NULL, &pipeline);
4039
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004040 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07004041
4042 // Now hit second fail case where we set scissor w/ different count than PSO
4043 // First need to successfully create the PSO from above by setting
4044 // pViewports
4045 m_errorMonitor->SetDesiredFailureMsg(
4046 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4047 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
4048 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004049
Tobin Ehlisd332f282015-10-02 11:00:56 -06004050 VkRect2D sc = {}; // Just need dummy vp to point to
4051 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07004052 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
4053 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004054 ASSERT_VK_SUCCESS(err);
4055 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004056 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4057 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004058 VkViewport viewports[2] = {}; // don't care about data
4059 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07004060 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06004061 Draw(1, 0, 0, 0);
4062
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004063 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06004064
Chia-I Wuf7458c52015-10-26 21:10:41 +08004065 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4066 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4067 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4068 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06004069}
4070
Karl Schultz6addd812016-02-02 17:17:23 -07004071TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004072 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004073 m_errorMonitor->SetDesiredFailureMsg(
4074 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004075 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004076
4077 ASSERT_NO_FATAL_FAILURE(InitState());
4078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004079
Tony Barbourfe3351b2015-07-28 10:17:20 -06004080 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004081 // Don't care about RenderPass handle b/c error should be flagged before
4082 // that
4083 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
4084 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004085
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004086 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06004087}
4088
Karl Schultz6addd812016-02-02 17:17:23 -07004089TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004090 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004091 m_errorMonitor->SetDesiredFailureMsg(
4092 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004093 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004094
4095 ASSERT_NO_FATAL_FAILURE(InitState());
4096 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004097
Tony Barbourfe3351b2015-07-28 10:17:20 -06004098 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004099 // Just create a dummy Renderpass that's non-NULL so we can get to the
4100 // proper error
Tony Barboureb254902015-07-15 12:50:33 -06004101 VkRenderPassBeginInfo rp_begin = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004102 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4103 rp_begin.pNext = NULL;
4104 rp_begin.renderPass = renderPass();
4105 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004106
Karl Schultz6addd812016-02-02 17:17:23 -07004107 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
4108 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06004109
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004110 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004111}
4112
Karl Schultz6addd812016-02-02 17:17:23 -07004113TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004114 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004115 m_errorMonitor->SetDesiredFailureMsg(
4116 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004117 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004118
4119 ASSERT_NO_FATAL_FAILURE(InitState());
4120 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004121
4122 // Renderpass is started here
4123 BeginCommandBuffer();
4124
4125 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004126 vk_testing::Buffer dstBuffer;
4127 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004128
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004129 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004130
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004131 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004132}
4133
Karl Schultz6addd812016-02-02 17:17:23 -07004134TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004135 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07004136 m_errorMonitor->SetDesiredFailureMsg(
4137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004138 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004139
4140 ASSERT_NO_FATAL_FAILURE(InitState());
4141 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004142
4143 // Renderpass is started here
4144 BeginCommandBuffer();
4145
4146 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004147 vk_testing::Buffer dstBuffer;
4148 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004149
Karl Schultz6addd812016-02-02 17:17:23 -07004150 VkDeviceSize dstOffset = 0;
4151 VkDeviceSize dataSize = 1024;
4152 const uint32_t *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004153
Karl Schultz6addd812016-02-02 17:17:23 -07004154 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
4155 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004156
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004157 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004158}
4159
Karl Schultz6addd812016-02-02 17:17:23 -07004160TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004161 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004162 m_errorMonitor->SetDesiredFailureMsg(
4163 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004164 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004165
4166 ASSERT_NO_FATAL_FAILURE(InitState());
4167 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004168
4169 // Renderpass is started here
4170 BeginCommandBuffer();
4171
Michael Lentine0a369f62016-02-03 16:51:46 -06004172 VkClearColorValue clear_color;
4173 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07004174 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
4175 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4176 const int32_t tex_width = 32;
4177 const int32_t tex_height = 32;
4178 VkImageCreateInfo image_create_info = {};
4179 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4180 image_create_info.pNext = NULL;
4181 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4182 image_create_info.format = tex_format;
4183 image_create_info.extent.width = tex_width;
4184 image_create_info.extent.height = tex_height;
4185 image_create_info.extent.depth = 1;
4186 image_create_info.mipLevels = 1;
4187 image_create_info.arrayLayers = 1;
4188 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4189 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
4190 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004191
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004192 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004193 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4194 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004195
Karl Schultz6addd812016-02-02 17:17:23 -07004196 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4197 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004198
Karl Schultz6addd812016-02-02 17:17:23 -07004199 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4200 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004201
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004202 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004203}
4204
Karl Schultz6addd812016-02-02 17:17:23 -07004205TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004206 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004207 m_errorMonitor->SetDesiredFailureMsg(
4208 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004209 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004210
4211 ASSERT_NO_FATAL_FAILURE(InitState());
4212 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004213
4214 // Renderpass is started here
4215 BeginCommandBuffer();
4216
4217 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07004218 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004219 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
4220 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4221 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
4222 image_create_info.extent.width = 64;
4223 image_create_info.extent.height = 64;
4224 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4225 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004226
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004227 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07004228 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
4229 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004230
Karl Schultz6addd812016-02-02 17:17:23 -07004231 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
4232 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004233
Karl Schultz6addd812016-02-02 17:17:23 -07004234 vkCmdClearDepthStencilImage(
4235 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
4236 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
4237 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004238
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004239 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004240}
4241
Karl Schultz6addd812016-02-02 17:17:23 -07004242TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004243 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004244 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004245
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004246 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004247 "vkCmdClearAttachments: This call "
4248 "must be issued inside an active "
4249 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004250
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004251 ASSERT_NO_FATAL_FAILURE(InitState());
4252 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004253
4254 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004255 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004256 ASSERT_VK_SUCCESS(err);
4257
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06004258 VkClearAttachment color_attachment;
4259 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4260 color_attachment.clearValue.color.float32[0] = 0;
4261 color_attachment.clearValue.color.float32[1] = 0;
4262 color_attachment.clearValue.color.float32[2] = 0;
4263 color_attachment.clearValue.color.float32[3] = 0;
4264 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07004265 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
4266 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
4267 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004268
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004269 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06004270}
4271
Karl Schultz6addd812016-02-02 17:17:23 -07004272TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004273 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07004274 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004275
Karl Schultz6addd812016-02-02 17:17:23 -07004276 m_errorMonitor->SetDesiredFailureMsg(
4277 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004278 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
4279
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004280 ASSERT_NO_FATAL_FAILURE(InitState());
4281 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004282 uint32_t qfi = 0;
4283 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004284 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4285 buffCI.size = 1024;
4286 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4287 buffCI.queueFamilyIndexCount = 1;
4288 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004289
4290 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004291 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004292 ASSERT_VK_SUCCESS(err);
4293
4294 BeginCommandBuffer();
4295 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07004296 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
4297 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004298 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07004299 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
4300 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004301
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004302 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004303
Chia-I Wuf7458c52015-10-26 21:10:41 +08004304 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06004305}
4306
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004307TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
4308 // Create an out-of-range queueFamilyIndex
4309 m_errorMonitor->SetDesiredFailureMsg(
4310 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis24aab042016-03-24 10:54:18 -06004311 "queueFamilyIndex 777, must have been given when the device was created.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004312
4313 ASSERT_NO_FATAL_FAILURE(InitState());
4314 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4315 VkBufferCreateInfo buffCI = {};
4316 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4317 buffCI.size = 1024;
4318 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4319 buffCI.queueFamilyIndexCount = 1;
4320 // Introduce failure by specifying invalid queue_family_index
4321 uint32_t qfi = 777;
4322 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06004323 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004324
4325 VkBuffer ib;
4326 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
4327
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004328 m_errorMonitor->VerifyFound();
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07004329}
4330
Karl Schultz6addd812016-02-02 17:17:23 -07004331TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
4332 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
4333 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004334
Karl Schultz6addd812016-02-02 17:17:23 -07004335 m_errorMonitor->SetDesiredFailureMsg(
4336 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004337 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004338
4339 ASSERT_NO_FATAL_FAILURE(InitState());
4340 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004341
4342 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07004343 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004344 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
4345 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004346
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004347 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06004348}
4349
Karl Schultz6addd812016-02-02 17:17:23 -07004350TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004351 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07004352 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004353
Karl Schultz6addd812016-02-02 17:17:23 -07004354 m_errorMonitor->SetDesiredFailureMsg(
4355 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Write descriptor update has descriptor "
4356 "type VK_DESCRIPTOR_TYPE_SAMPLER that "
4357 "does not match ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004358
Tobin Ehlis3b780662015-05-28 12:11:26 -06004359 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004360 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004361 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004362 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4363 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004364
4365 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004366 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4367 ds_pool_ci.pNext = NULL;
4368 ds_pool_ci.maxSets = 1;
4369 ds_pool_ci.poolSizeCount = 1;
4370 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004371
Tobin Ehlis3b780662015-05-28 12:11:26 -06004372 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004373 err =
4374 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004375 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004376 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004377 dsl_binding.binding = 0;
4378 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4379 dsl_binding.descriptorCount = 1;
4380 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4381 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004382
Tony Barboureb254902015-07-15 12:50:33 -06004383 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004384 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4385 ds_layout_ci.pNext = NULL;
4386 ds_layout_ci.bindingCount = 1;
4387 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004388
Tobin Ehlis3b780662015-05-28 12:11:26 -06004389 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004390 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4391 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004392 ASSERT_VK_SUCCESS(err);
4393
4394 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004395 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004396 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004397 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004398 alloc_info.descriptorPool = ds_pool;
4399 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004400 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4401 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004402 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004403
Tony Barboureb254902015-07-15 12:50:33 -06004404 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004405 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4406 sampler_ci.pNext = NULL;
4407 sampler_ci.magFilter = VK_FILTER_NEAREST;
4408 sampler_ci.minFilter = VK_FILTER_NEAREST;
4409 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4410 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4411 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4412 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4413 sampler_ci.mipLodBias = 1.0;
4414 sampler_ci.anisotropyEnable = VK_FALSE;
4415 sampler_ci.maxAnisotropy = 1;
4416 sampler_ci.compareEnable = VK_FALSE;
4417 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4418 sampler_ci.minLod = 1.0;
4419 sampler_ci.maxLod = 1.0;
4420 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4421 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Mark Lobodzinski52ac6582015-09-01 15:42:56 -06004422
Tobin Ehlis3b780662015-05-28 12:11:26 -06004423 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004424 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004425 ASSERT_VK_SUCCESS(err);
4426
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004427 VkDescriptorImageInfo info = {};
4428 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004429
4430 VkWriteDescriptorSet descriptor_write;
4431 memset(&descriptor_write, 0, sizeof(descriptor_write));
4432 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004433 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004434 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004435 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004436 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004437 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004438
4439 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4440
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004441 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004442
Chia-I Wuf7458c52015-10-26 21:10:41 +08004443 vkDestroySampler(m_device->device(), sampler, NULL);
4444 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4445 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004446}
4447
Karl Schultz6addd812016-02-02 17:17:23 -07004448TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004449 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07004450 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004451
Karl Schultz6addd812016-02-02 17:17:23 -07004452 m_errorMonitor->SetDesiredFailureMsg(
4453 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Descriptor update type of "
4454 "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET "
4455 "is out of bounds for matching binding");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004456
Tobin Ehlis3b780662015-05-28 12:11:26 -06004457 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004458 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004459 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004460 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4461 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004462
4463 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004464 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4465 ds_pool_ci.pNext = NULL;
4466 ds_pool_ci.maxSets = 1;
4467 ds_pool_ci.poolSizeCount = 1;
4468 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06004469
Tobin Ehlis3b780662015-05-28 12:11:26 -06004470 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004471 err =
4472 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004473 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004474
Tony Barboureb254902015-07-15 12:50:33 -06004475 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004476 dsl_binding.binding = 0;
4477 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4478 dsl_binding.descriptorCount = 1;
4479 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4480 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06004481
4482 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004483 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4484 ds_layout_ci.pNext = NULL;
4485 ds_layout_ci.bindingCount = 1;
4486 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004487
Tobin Ehlis3b780662015-05-28 12:11:26 -06004488 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004489 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4490 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004491 ASSERT_VK_SUCCESS(err);
4492
4493 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004494 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004495 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004496 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004497 alloc_info.descriptorPool = ds_pool;
4498 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004499 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4500 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004501 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004502
Tony Barboureb254902015-07-15 12:50:33 -06004503 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004504 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4505 sampler_ci.pNext = NULL;
4506 sampler_ci.magFilter = VK_FILTER_NEAREST;
4507 sampler_ci.minFilter = VK_FILTER_NEAREST;
4508 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4509 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4510 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4511 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4512 sampler_ci.mipLodBias = 1.0;
4513 sampler_ci.anisotropyEnable = VK_FALSE;
4514 sampler_ci.maxAnisotropy = 1;
4515 sampler_ci.compareEnable = VK_FALSE;
4516 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4517 sampler_ci.minLod = 1.0;
4518 sampler_ci.maxLod = 1.0;
4519 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4520 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06004521
Tobin Ehlis3b780662015-05-28 12:11:26 -06004522 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004523 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004524 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004525
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004526 VkDescriptorImageInfo info = {};
4527 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004528
4529 VkWriteDescriptorSet descriptor_write;
4530 memset(&descriptor_write, 0, sizeof(descriptor_write));
4531 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004532 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07004533 descriptor_write.dstArrayElement =
4534 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08004535 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004536 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004537 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004538 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004539
4540 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4541
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004542 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004543
Chia-I Wuf7458c52015-10-26 21:10:41 +08004544 vkDestroySampler(m_device->device(), sampler, NULL);
4545 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4546 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004547}
4548
Karl Schultz6addd812016-02-02 17:17:23 -07004549TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
4550 // Create layout w/ count of 1 and attempt update to that layout w/ binding
4551 // index 2
4552 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004553
Karl Schultz6addd812016-02-02 17:17:23 -07004554 m_errorMonitor->SetDesiredFailureMsg(
4555 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004556 " does not have binding to match update binding ");
4557
Tobin Ehlis3b780662015-05-28 12:11:26 -06004558 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004559 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004560 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004561 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4562 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004563
4564 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004565 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4566 ds_pool_ci.pNext = NULL;
4567 ds_pool_ci.maxSets = 1;
4568 ds_pool_ci.poolSizeCount = 1;
4569 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004570
Tobin Ehlis3b780662015-05-28 12:11:26 -06004571 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004572 err =
4573 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004574 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004575
Tony Barboureb254902015-07-15 12:50:33 -06004576 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004577 dsl_binding.binding = 0;
4578 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4579 dsl_binding.descriptorCount = 1;
4580 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4581 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06004582
4583 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004584 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4585 ds_layout_ci.pNext = NULL;
4586 ds_layout_ci.bindingCount = 1;
4587 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004588 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004589 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4590 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004591 ASSERT_VK_SUCCESS(err);
4592
4593 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004594 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004595 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004596 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004597 alloc_info.descriptorPool = ds_pool;
4598 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004599 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4600 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004601 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004602
Tony Barboureb254902015-07-15 12:50:33 -06004603 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004604 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4605 sampler_ci.pNext = NULL;
4606 sampler_ci.magFilter = VK_FILTER_NEAREST;
4607 sampler_ci.minFilter = VK_FILTER_NEAREST;
4608 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4609 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4610 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4611 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4612 sampler_ci.mipLodBias = 1.0;
4613 sampler_ci.anisotropyEnable = VK_FALSE;
4614 sampler_ci.maxAnisotropy = 1;
4615 sampler_ci.compareEnable = VK_FALSE;
4616 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4617 sampler_ci.minLod = 1.0;
4618 sampler_ci.maxLod = 1.0;
4619 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4620 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06004621
Tobin Ehlis3b780662015-05-28 12:11:26 -06004622 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004623 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004624 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004625
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004626 VkDescriptorImageInfo info = {};
4627 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004628
4629 VkWriteDescriptorSet descriptor_write;
4630 memset(&descriptor_write, 0, sizeof(descriptor_write));
4631 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004632 descriptor_write.dstSet = descriptorSet;
4633 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004634 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004635 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004636 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004637 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004638
4639 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4640
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004641 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004642
Chia-I Wuf7458c52015-10-26 21:10:41 +08004643 vkDestroySampler(m_device->device(), sampler, NULL);
4644 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4645 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004646}
4647
Karl Schultz6addd812016-02-02 17:17:23 -07004648TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
4649 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
4650 // types
4651 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004652
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07004653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07004654 "Unexpected UPDATE struct of type ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004655
Tobin Ehlis3b780662015-05-28 12:11:26 -06004656 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06004657
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004658 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004659 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4660 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06004661
4662 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004663 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4664 ds_pool_ci.pNext = NULL;
4665 ds_pool_ci.maxSets = 1;
4666 ds_pool_ci.poolSizeCount = 1;
4667 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06004668
Tobin Ehlis3b780662015-05-28 12:11:26 -06004669 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004670 err =
4671 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004672 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06004673 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004674 dsl_binding.binding = 0;
4675 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4676 dsl_binding.descriptorCount = 1;
4677 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4678 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004679
Tony Barboureb254902015-07-15 12:50:33 -06004680 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004681 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4682 ds_layout_ci.pNext = NULL;
4683 ds_layout_ci.bindingCount = 1;
4684 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06004685
Tobin Ehlis3b780662015-05-28 12:11:26 -06004686 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004687 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4688 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004689 ASSERT_VK_SUCCESS(err);
4690
4691 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004692 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004693 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004694 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004695 alloc_info.descriptorPool = ds_pool;
4696 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004697 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4698 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004699 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004700
Tony Barboureb254902015-07-15 12:50:33 -06004701 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004702 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4703 sampler_ci.pNext = NULL;
4704 sampler_ci.magFilter = VK_FILTER_NEAREST;
4705 sampler_ci.minFilter = VK_FILTER_NEAREST;
4706 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4707 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4708 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4709 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4710 sampler_ci.mipLodBias = 1.0;
4711 sampler_ci.anisotropyEnable = VK_FALSE;
4712 sampler_ci.maxAnisotropy = 1;
4713 sampler_ci.compareEnable = VK_FALSE;
4714 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4715 sampler_ci.minLod = 1.0;
4716 sampler_ci.maxLod = 1.0;
4717 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4718 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004719 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004720 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06004721 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004722
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004723 VkDescriptorImageInfo info = {};
4724 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004725
4726 VkWriteDescriptorSet descriptor_write;
4727 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -07004728 descriptor_write.sType =
4729 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004730 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004731 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06004732 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004733 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06004734 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08004735
4736 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4737
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004738 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06004739
Chia-I Wuf7458c52015-10-26 21:10:41 +08004740 vkDestroySampler(m_device->device(), sampler, NULL);
4741 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4742 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004743}
4744
Karl Schultz6addd812016-02-02 17:17:23 -07004745TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004746 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07004747 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004748
Karl Schultz6addd812016-02-02 17:17:23 -07004749 m_errorMonitor->SetDesiredFailureMsg(
4750 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004751 "Attempt to update descriptor with invalid sampler 0xbaadbeef");
4752
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004753 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004754 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
4755 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004756 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004757 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
4758 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004759
4760 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004761 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;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004766
4767 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004768 err =
4769 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004770 ASSERT_VK_SUCCESS(err);
4771
4772 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004773 dsl_binding.binding = 0;
4774 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4775 dsl_binding.descriptorCount = 1;
4776 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4777 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004778
4779 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004780 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;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004784 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004785 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4786 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004787 ASSERT_VK_SUCCESS(err);
4788
4789 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004790 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004791 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004792 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004793 alloc_info.descriptorPool = ds_pool;
4794 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004795 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4796 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004797 ASSERT_VK_SUCCESS(err);
4798
Karl Schultz6addd812016-02-02 17:17:23 -07004799 VkSampler sampler =
4800 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004801
4802 VkDescriptorImageInfo descriptor_info;
4803 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
4804 descriptor_info.sampler = sampler;
4805
4806 VkWriteDescriptorSet descriptor_write;
4807 memset(&descriptor_write, 0, sizeof(descriptor_write));
4808 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004809 descriptor_write.dstSet = descriptorSet;
4810 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004811 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004812 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4813 descriptor_write.pImageInfo = &descriptor_info;
4814
4815 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4816
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004817 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004818
Chia-I Wuf7458c52015-10-26 21:10:41 +08004819 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4820 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004821}
4822
Karl Schultz6addd812016-02-02 17:17:23 -07004823TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
4824 // Create a single combined Image/Sampler descriptor and send it an invalid
4825 // imageView
4826 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004827
Karl Schultz6addd812016-02-02 17:17:23 -07004828 m_errorMonitor->SetDesiredFailureMsg(
4829 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004830 "Attempt to update descriptor with invalid imageView 0xbaadbeef");
4831
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004832 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004833 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004834 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4835 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004836
4837 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004838 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4839 ds_pool_ci.pNext = NULL;
4840 ds_pool_ci.maxSets = 1;
4841 ds_pool_ci.poolSizeCount = 1;
4842 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004843
4844 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004845 err =
4846 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004847 ASSERT_VK_SUCCESS(err);
4848
4849 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004850 dsl_binding.binding = 0;
4851 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4852 dsl_binding.descriptorCount = 1;
4853 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4854 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004855
4856 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004857 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4858 ds_layout_ci.pNext = NULL;
4859 ds_layout_ci.bindingCount = 1;
4860 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004861 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004862 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4863 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004864 ASSERT_VK_SUCCESS(err);
4865
4866 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004867 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004868 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004869 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004870 alloc_info.descriptorPool = ds_pool;
4871 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004872 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4873 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004874 ASSERT_VK_SUCCESS(err);
4875
4876 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004877 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4878 sampler_ci.pNext = NULL;
4879 sampler_ci.magFilter = VK_FILTER_NEAREST;
4880 sampler_ci.minFilter = VK_FILTER_NEAREST;
4881 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4882 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4883 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4884 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4885 sampler_ci.mipLodBias = 1.0;
4886 sampler_ci.anisotropyEnable = VK_FALSE;
4887 sampler_ci.maxAnisotropy = 1;
4888 sampler_ci.compareEnable = VK_FALSE;
4889 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4890 sampler_ci.minLod = 1.0;
4891 sampler_ci.maxLod = 1.0;
4892 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4893 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004894
4895 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08004896 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004897 ASSERT_VK_SUCCESS(err);
4898
Karl Schultz6addd812016-02-02 17:17:23 -07004899 VkImageView view =
4900 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004901
4902 VkDescriptorImageInfo descriptor_info;
4903 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
4904 descriptor_info.sampler = sampler;
4905 descriptor_info.imageView = view;
4906
4907 VkWriteDescriptorSet descriptor_write;
4908 memset(&descriptor_write, 0, sizeof(descriptor_write));
4909 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004910 descriptor_write.dstSet = descriptorSet;
4911 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004912 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004913 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
4914 descriptor_write.pImageInfo = &descriptor_info;
4915
4916 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4917
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004918 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004919
Chia-I Wuf7458c52015-10-26 21:10:41 +08004920 vkDestroySampler(m_device->device(), sampler, NULL);
4921 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4922 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06004923}
4924
Karl Schultz6addd812016-02-02 17:17:23 -07004925TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
4926 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
4927 // into the other
4928 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004929
Karl Schultz6addd812016-02-02 17:17:23 -07004930 m_errorMonitor->SetDesiredFailureMsg(
4931 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Copy descriptor update index 0, update "
4932 "count #1, has src update descriptor "
4933 "type VK_DESCRIPTOR_TYPE_SAMPLER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004934
Tobin Ehlis04356f92015-10-27 16:35:27 -06004935 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07004936 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004937 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004938 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4939 ds_type_count[0].descriptorCount = 1;
4940 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
4941 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004942
4943 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004944 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4945 ds_pool_ci.pNext = NULL;
4946 ds_pool_ci.maxSets = 1;
4947 ds_pool_ci.poolSizeCount = 2;
4948 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004949
4950 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07004951 err =
4952 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004953 ASSERT_VK_SUCCESS(err);
4954 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004955 dsl_binding[0].binding = 0;
4956 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4957 dsl_binding[0].descriptorCount = 1;
4958 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4959 dsl_binding[0].pImmutableSamplers = NULL;
4960 dsl_binding[1].binding = 1;
4961 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4962 dsl_binding[1].descriptorCount = 1;
4963 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
4964 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004965
4966 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004967 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4968 ds_layout_ci.pNext = NULL;
4969 ds_layout_ci.bindingCount = 2;
4970 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004971
4972 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004973 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
4974 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004975 ASSERT_VK_SUCCESS(err);
4976
4977 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004978 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004979 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004980 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06004981 alloc_info.descriptorPool = ds_pool;
4982 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07004983 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
4984 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06004985 ASSERT_VK_SUCCESS(err);
4986
4987 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004988 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4989 sampler_ci.pNext = NULL;
4990 sampler_ci.magFilter = VK_FILTER_NEAREST;
4991 sampler_ci.minFilter = VK_FILTER_NEAREST;
4992 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4993 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4994 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4995 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4996 sampler_ci.mipLodBias = 1.0;
4997 sampler_ci.anisotropyEnable = VK_FALSE;
4998 sampler_ci.maxAnisotropy = 1;
4999 sampler_ci.compareEnable = VK_FALSE;
5000 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5001 sampler_ci.minLod = 1.0;
5002 sampler_ci.maxLod = 1.0;
5003 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5004 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005005
5006 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005007 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005008 ASSERT_VK_SUCCESS(err);
5009
5010 VkDescriptorImageInfo info = {};
5011 info.sampler = sampler;
5012
5013 VkWriteDescriptorSet descriptor_write;
5014 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
5015 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005016 descriptor_write.dstSet = descriptorSet;
5017 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08005018 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06005019 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
5020 descriptor_write.pImageInfo = &info;
5021 // This write update should succeed
5022 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5023 // Now perform a copy update that fails due to type mismatch
5024 VkCopyDescriptorSet copy_ds_update;
5025 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5026 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5027 copy_ds_update.srcSet = descriptorSet;
5028 copy_ds_update.srcBinding = 1; // copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005029 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005030 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08005031 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005032 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5033
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005034 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005035 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005036 m_errorMonitor->SetDesiredFailureMsg(
5037 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005038 "Copy descriptor update 0 has srcBinding 3 which is out of bounds ");
Tobin Ehlis04356f92015-10-27 16:35:27 -06005039 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5040 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5041 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07005042 copy_ds_update.srcBinding =
5043 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005044 copy_ds_update.dstSet = descriptorSet;
5045 copy_ds_update.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005046 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06005047 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5048
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005049 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005050
Tobin Ehlis04356f92015-10-27 16:35:27 -06005051 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005052 m_errorMonitor->SetDesiredFailureMsg(
5053 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005054 "Copy descriptor src update is out of bounds for matching binding 1 ");
5055
Tobin Ehlis04356f92015-10-27 16:35:27 -06005056 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
5057 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
5058 copy_ds_update.srcSet = descriptorSet;
5059 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005060 copy_ds_update.dstSet = descriptorSet;
5061 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005062 copy_ds_update.descriptorCount =
5063 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06005064 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
5065
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005066 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06005067
Chia-I Wuf7458c52015-10-26 21:10:41 +08005068 vkDestroySampler(m_device->device(), sampler, NULL);
5069 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5070 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06005071}
5072
Karl Schultz6addd812016-02-02 17:17:23 -07005073TEST_F(VkLayerTest, NumSamplesMismatch) {
5074 // Create CommandBuffer where MSAA samples doesn't match RenderPass
5075 // sampleCount
5076 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005077
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005079 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005080
Tobin Ehlis3b780662015-05-28 12:11:26 -06005081 ASSERT_NO_FATAL_FAILURE(InitState());
5082 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005083 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06005084 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005085 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005086
5087 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005088 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5089 ds_pool_ci.pNext = NULL;
5090 ds_pool_ci.maxSets = 1;
5091 ds_pool_ci.poolSizeCount = 1;
5092 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005093
Tobin Ehlis3b780662015-05-28 12:11:26 -06005094 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005095 err =
5096 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005097 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005098
Tony Barboureb254902015-07-15 12:50:33 -06005099 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08005100 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06005101 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08005102 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005103 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5104 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005105
Tony Barboureb254902015-07-15 12:50:33 -06005106 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5107 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5108 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08005109 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07005110 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005111
Tobin Ehlis3b780662015-05-28 12:11:26 -06005112 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005113 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5114 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005115 ASSERT_VK_SUCCESS(err);
5116
5117 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005118 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005119 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005120 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005121 alloc_info.descriptorPool = ds_pool;
5122 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005123 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5124 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005125 ASSERT_VK_SUCCESS(err);
5126
Tony Barboureb254902015-07-15 12:50:33 -06005127 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005128 pipe_ms_state_ci.sType =
5129 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5130 pipe_ms_state_ci.pNext = NULL;
5131 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5132 pipe_ms_state_ci.sampleShadingEnable = 0;
5133 pipe_ms_state_ci.minSampleShading = 1.0;
5134 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005135
Tony Barboureb254902015-07-15 12:50:33 -06005136 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005137 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5138 pipeline_layout_ci.pNext = NULL;
5139 pipeline_layout_ci.setLayoutCount = 1;
5140 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06005141
5142 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005143 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5144 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06005145 ASSERT_VK_SUCCESS(err);
5146
Karl Schultz6addd812016-02-02 17:17:23 -07005147 VkShaderObj vs(m_device, bindStateVertShaderText,
5148 VK_SHADER_STAGE_VERTEX_BIT, this);
5149 VkShaderObj fs(m_device, bindStateFragShaderText,
5150 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005151 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005152 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005153 VkPipelineObj pipe(m_device);
5154 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005155 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005156 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005157 pipe.SetMSAA(&pipe_ms_state_ci);
5158 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005159
Tony Barbourfe3351b2015-07-28 10:17:20 -06005160 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005161 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5162 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06005163
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005164 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005165
Chia-I Wuf7458c52015-10-26 21:10:41 +08005166 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5167 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5168 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005169}
Tobin Ehlis0f10db52016-04-04 10:00:21 -06005170#ifdef ADD_BACK_IN_WHEN_CHECK_IS_BACK // TODO : Re-enable when GH256 fixed
Mark Youngc89c6312016-03-31 16:03:20 -06005171TEST_F(VkLayerTest, NumBlendAttachMismatch) {
5172 // Create Pipeline where the number of blend attachments doesn't match the
5173 // number of color attachments. In this case, we don't add any color
5174 // blend attachments even though we have a color attachment.
5175 VkResult err;
5176
5177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5178 "Mismatch between blend state attachment");
5179
5180 ASSERT_NO_FATAL_FAILURE(InitState());
5181 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5182 VkDescriptorPoolSize ds_type_count = {};
5183 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5184 ds_type_count.descriptorCount = 1;
5185
5186 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5187 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5188 ds_pool_ci.pNext = NULL;
5189 ds_pool_ci.maxSets = 1;
5190 ds_pool_ci.poolSizeCount = 1;
5191 ds_pool_ci.pPoolSizes = &ds_type_count;
5192
5193 VkDescriptorPool ds_pool;
5194 err =
5195 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5196 ASSERT_VK_SUCCESS(err);
5197
5198 VkDescriptorSetLayoutBinding dsl_binding = {};
5199 dsl_binding.binding = 0;
5200 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5201 dsl_binding.descriptorCount = 1;
5202 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5203 dsl_binding.pImmutableSamplers = NULL;
5204
5205 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5206 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5207 ds_layout_ci.pNext = NULL;
5208 ds_layout_ci.bindingCount = 1;
5209 ds_layout_ci.pBindings = &dsl_binding;
5210
5211 VkDescriptorSetLayout ds_layout;
5212 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5213 &ds_layout);
5214 ASSERT_VK_SUCCESS(err);
5215
5216 VkDescriptorSet descriptorSet;
5217 VkDescriptorSetAllocateInfo alloc_info = {};
5218 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5219 alloc_info.descriptorSetCount = 1;
5220 alloc_info.descriptorPool = ds_pool;
5221 alloc_info.pSetLayouts = &ds_layout;
5222 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5223 &descriptorSet);
5224 ASSERT_VK_SUCCESS(err);
5225
5226 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
5227 pipe_ms_state_ci.sType =
5228 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5229 pipe_ms_state_ci.pNext = NULL;
5230 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5231 pipe_ms_state_ci.sampleShadingEnable = 0;
5232 pipe_ms_state_ci.minSampleShading = 1.0;
5233 pipe_ms_state_ci.pSampleMask = NULL;
5234
5235 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5236 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5237 pipeline_layout_ci.pNext = NULL;
5238 pipeline_layout_ci.setLayoutCount = 1;
5239 pipeline_layout_ci.pSetLayouts = &ds_layout;
5240
5241 VkPipelineLayout pipeline_layout;
5242 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5243 &pipeline_layout);
5244 ASSERT_VK_SUCCESS(err);
5245
5246 VkShaderObj vs(m_device, bindStateVertShaderText,
5247 VK_SHADER_STAGE_VERTEX_BIT, this);
5248 VkShaderObj fs(m_device, bindStateFragShaderText,
5249 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005250 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -06005251 // but add it to be able to run on more devices
5252 VkPipelineObj pipe(m_device);
5253 pipe.AddShader(&vs);
5254 pipe.AddShader(&fs);
5255 pipe.SetMSAA(&pipe_ms_state_ci);
5256 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5257
5258 BeginCommandBuffer();
5259 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5260 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5261
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005262 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -06005263
5264 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5265 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5266 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5267}
Tony Barbour4e81a202016-04-04 11:09:40 -06005268#endif //ADD_BACK_IN_WHEN_CHECK_IS_BACK
Karl Schultz6addd812016-02-02 17:17:23 -07005269TEST_F(VkLayerTest, ClearCmdNoDraw) {
5270 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
5271 // to issuing a Draw
5272 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005273
Karl Schultz6addd812016-02-02 17:17:23 -07005274 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -07005275 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005276 "vkCmdClearAttachments() issued on CB object ");
5277
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005278 ASSERT_NO_FATAL_FAILURE(InitState());
5279 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005280
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005281 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005282 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5283 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005284
5285 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005286 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5287 ds_pool_ci.pNext = NULL;
5288 ds_pool_ci.maxSets = 1;
5289 ds_pool_ci.poolSizeCount = 1;
5290 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005291
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005292 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005293 err =
5294 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005295 ASSERT_VK_SUCCESS(err);
5296
Tony Barboureb254902015-07-15 12:50:33 -06005297 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005298 dsl_binding.binding = 0;
5299 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5300 dsl_binding.descriptorCount = 1;
5301 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5302 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005303
Tony Barboureb254902015-07-15 12:50:33 -06005304 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005305 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5306 ds_layout_ci.pNext = NULL;
5307 ds_layout_ci.bindingCount = 1;
5308 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005309
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005310 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005311 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5312 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005313 ASSERT_VK_SUCCESS(err);
5314
5315 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005316 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005317 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005318 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005319 alloc_info.descriptorPool = ds_pool;
5320 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005321 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5322 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005323 ASSERT_VK_SUCCESS(err);
5324
Tony Barboureb254902015-07-15 12:50:33 -06005325 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005326 pipe_ms_state_ci.sType =
5327 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5328 pipe_ms_state_ci.pNext = NULL;
5329 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
5330 pipe_ms_state_ci.sampleShadingEnable = 0;
5331 pipe_ms_state_ci.minSampleShading = 1.0;
5332 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005333
Tony Barboureb254902015-07-15 12:50:33 -06005334 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005335 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5336 pipeline_layout_ci.pNext = NULL;
5337 pipeline_layout_ci.setLayoutCount = 1;
5338 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005339
5340 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005341 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5342 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005343 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005344
Karl Schultz6addd812016-02-02 17:17:23 -07005345 VkShaderObj vs(m_device, bindStateVertShaderText,
5346 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005347 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005348 // on more devices
5349 VkShaderObj fs(m_device, bindStateFragShaderText,
5350 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005351
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005352 VkPipelineObj pipe(m_device);
5353 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005354 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005355 pipe.SetMSAA(&pipe_ms_state_ci);
5356 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005357
5358 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005359
Karl Schultz6addd812016-02-02 17:17:23 -07005360 // Main thing we care about for this test is that the VkImage obj we're
5361 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005362 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06005363 VkClearAttachment color_attachment;
5364 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5365 color_attachment.clearValue.color.float32[0] = 1.0;
5366 color_attachment.clearValue.color.float32[1] = 1.0;
5367 color_attachment.clearValue.color.float32[2] = 1.0;
5368 color_attachment.clearValue.color.float32[3] = 1.0;
5369 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07005370 VkClearRect clear_rect = {
5371 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005372
Karl Schultz6addd812016-02-02 17:17:23 -07005373 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
5374 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005375
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005376 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005377
Chia-I Wuf7458c52015-10-26 21:10:41 +08005378 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5379 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5380 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -06005381}
5382
Karl Schultz6addd812016-02-02 17:17:23 -07005383TEST_F(VkLayerTest, VtxBufferBadIndex) {
5384 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005385
Karl Schultz6addd812016-02-02 17:17:23 -07005386 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005387 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -07005388 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005389
Tobin Ehlis502480b2015-06-24 15:53:07 -06005390 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -06005391 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -06005392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -06005393
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005394 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005395 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5396 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005397
5398 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005399 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5400 ds_pool_ci.pNext = NULL;
5401 ds_pool_ci.maxSets = 1;
5402 ds_pool_ci.poolSizeCount = 1;
5403 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06005404
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06005405 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07005406 err =
5407 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005408 ASSERT_VK_SUCCESS(err);
5409
Tony Barboureb254902015-07-15 12:50:33 -06005410 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005411 dsl_binding.binding = 0;
5412 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5413 dsl_binding.descriptorCount = 1;
5414 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5415 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005416
Tony Barboureb254902015-07-15 12:50:33 -06005417 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005418 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5419 ds_layout_ci.pNext = NULL;
5420 ds_layout_ci.bindingCount = 1;
5421 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06005422
Tobin Ehlis502480b2015-06-24 15:53:07 -06005423 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005424 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
5425 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005426 ASSERT_VK_SUCCESS(err);
5427
5428 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005429 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005430 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005431 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005432 alloc_info.descriptorPool = ds_pool;
5433 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07005434 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
5435 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005436 ASSERT_VK_SUCCESS(err);
5437
Tony Barboureb254902015-07-15 12:50:33 -06005438 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005439 pipe_ms_state_ci.sType =
5440 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
5441 pipe_ms_state_ci.pNext = NULL;
5442 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
5443 pipe_ms_state_ci.sampleShadingEnable = 0;
5444 pipe_ms_state_ci.minSampleShading = 1.0;
5445 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005446
Tony Barboureb254902015-07-15 12:50:33 -06005447 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005448 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5449 pipeline_layout_ci.pNext = NULL;
5450 pipeline_layout_ci.setLayoutCount = 1;
5451 pipeline_layout_ci.pSetLayouts = &ds_layout;
5452 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -06005453
Karl Schultz6addd812016-02-02 17:17:23 -07005454 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
5455 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005456 ASSERT_VK_SUCCESS(err);
5457
Karl Schultz6addd812016-02-02 17:17:23 -07005458 VkShaderObj vs(m_device, bindStateVertShaderText,
5459 VK_SHADER_STAGE_VERTEX_BIT, this);
5460 VkShaderObj fs(m_device, bindStateFragShaderText,
5461 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06005462 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07005463 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005464 VkPipelineObj pipe(m_device);
5465 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005466 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005467 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005468 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -06005469 pipe.SetViewport(m_viewports);
5470 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -06005471 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005472
5473 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07005474 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
5475 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06005476 // Don't care about actual data, just need to get to draw to flag error
5477 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -07005478 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
5479 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -06005480 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -06005481 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005482
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005483 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005484
Chia-I Wuf7458c52015-10-26 21:10:41 +08005485 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5486 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5487 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -06005488}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005489#endif // DRAW_STATE_TESTS
5490
Tobin Ehlis0788f522015-05-26 16:11:58 -06005491#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -06005492#if GTEST_IS_THREADSAFE
5493struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005494 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005495 VkEvent event;
5496 bool bailout;
5497};
5498
Karl Schultz6addd812016-02-02 17:17:23 -07005499extern "C" void *AddToCommandBuffer(void *arg) {
5500 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005501
Karl Schultz6addd812016-02-02 17:17:23 -07005502 for (int i = 0; i < 10000; i++) {
5503 vkCmdSetEvent(data->commandBuffer, data->event,
5504 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005505 if (data->bailout) {
5506 break;
5507 }
5508 }
5509 return NULL;
5510}
5511
Karl Schultz6addd812016-02-02 17:17:23 -07005512TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005513 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005514
Karl Schultz6addd812016-02-02 17:17:23 -07005515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5516 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005517
Mike Stroyanaccf7692015-05-12 16:00:45 -06005518 ASSERT_NO_FATAL_FAILURE(InitState());
5519 ASSERT_NO_FATAL_FAILURE(InitViewport());
5520 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5521
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005522 // Calls AllocateCommandBuffers
5523 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06005524
5525 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005526 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005527
5528 VkEventCreateInfo event_info;
5529 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -06005530 VkResult err;
5531
5532 memset(&event_info, 0, sizeof(event_info));
5533 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5534
Chia-I Wuf7458c52015-10-26 21:10:41 +08005535 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005536 ASSERT_VK_SUCCESS(err);
5537
Mike Stroyanaccf7692015-05-12 16:00:45 -06005538 err = vkResetEvent(device(), event);
5539 ASSERT_VK_SUCCESS(err);
5540
5541 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005542 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005543 data.event = event;
5544 data.bailout = false;
5545 m_errorMonitor->SetBailout(&data.bailout);
5546 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005547 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005548 // Add many entries to command buffer from this thread at the same time.
5549 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -06005550
Mike Stroyan4268d1f2015-07-13 14:45:35 -06005551 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005552 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005553
Mike Stroyan10b8cb72016-01-22 15:22:03 -07005554 m_errorMonitor->SetBailout(NULL);
5555
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005556 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -06005557
Chia-I Wuf7458c52015-10-26 21:10:41 +08005558 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -06005559}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06005560#endif // GTEST_IS_THREADSAFE
5561#endif // THREADING_TESTS
5562
Chris Forbes9f7ff632015-05-25 11:13:08 +12005563#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07005564TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005566 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005567
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005568 ASSERT_NO_FATAL_FAILURE(InitState());
5569 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5570
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005571 VkShaderModule module;
5572 VkShaderModuleCreateInfo moduleCreateInfo;
5573 struct icd_spv_header spv;
5574
5575 spv.magic = ICD_SPV_MAGIC;
5576 spv.version = ICD_SPV_VERSION;
5577 spv.gen_magic = 0;
5578
5579 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5580 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07005581 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005582 moduleCreateInfo.codeSize = 4;
5583 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005584 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005585
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005586 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005587}
5588
Karl Schultz6addd812016-02-02 17:17:23 -07005589TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005591 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005592
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005593 ASSERT_NO_FATAL_FAILURE(InitState());
5594 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5595
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005596 VkShaderModule module;
5597 VkShaderModuleCreateInfo moduleCreateInfo;
5598 struct icd_spv_header spv;
5599
5600 spv.magic = ~ICD_SPV_MAGIC;
5601 spv.version = ICD_SPV_VERSION;
5602 spv.gen_magic = 0;
5603
5604 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5605 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07005606 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005607 moduleCreateInfo.codeSize = sizeof(spv) + 10;
5608 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005609 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005610
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005611 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005612}
5613
Karl Schultz6addd812016-02-02 17:17:23 -07005614TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005616 "Shader is not SPIR-V");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005617
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005618 ASSERT_NO_FATAL_FAILURE(InitState());
5619 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5620
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005621 VkShaderModule module;
5622 VkShaderModuleCreateInfo moduleCreateInfo;
5623 struct icd_spv_header spv;
5624
5625 spv.magic = ICD_SPV_MAGIC;
5626 spv.version = ~ICD_SPV_VERSION;
5627 spv.gen_magic = 0;
5628
5629 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
5630 moduleCreateInfo.pNext = NULL;
5631
Karl Schultz6addd812016-02-02 17:17:23 -07005632 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005633 moduleCreateInfo.codeSize = sizeof(spv) + 10;
5634 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +08005635 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005636
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005637 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -06005638}
5639
Karl Schultz6addd812016-02-02 17:17:23 -07005640TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005642 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005643
Chris Forbes9f7ff632015-05-25 11:13:08 +12005644 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005645 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005646
5647 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005648 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005649 "\n"
5650 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005651 "out gl_PerVertex {\n"
5652 " vec4 gl_Position;\n"
5653 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005654 "void main(){\n"
5655 " gl_Position = vec4(1);\n"
5656 " x = 0;\n"
5657 "}\n";
5658 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005659 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +12005660 "\n"
5661 "layout(location=0) out vec4 color;\n"
5662 "void main(){\n"
5663 " color = vec4(1);\n"
5664 "}\n";
5665
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005666 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5667 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005668
5669 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005670 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005671 pipe.AddShader(&vs);
5672 pipe.AddShader(&fs);
5673
Chris Forbes9f7ff632015-05-25 11:13:08 +12005674 VkDescriptorSetObj descriptorSet(m_device);
5675 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005676 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +12005677
Tony Barbour5781e8f2015-08-04 16:23:11 -06005678 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +12005679
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005680 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +12005681}
Chris Forbes9f7ff632015-05-25 11:13:08 +12005682
Karl Schultz6addd812016-02-02 17:17:23 -07005683TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005685 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005686
Chris Forbes59cb88d2015-05-25 11:13:13 +12005687 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005688 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005689
5690 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005691 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005692 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07005693 "out gl_PerVertex {\n"
5694 " vec4 gl_Position;\n"
5695 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005696 "void main(){\n"
5697 " gl_Position = vec4(1);\n"
5698 "}\n";
5699 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005700 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +12005701 "\n"
5702 "layout(location=0) in float x;\n"
5703 "layout(location=0) out vec4 color;\n"
5704 "void main(){\n"
5705 " color = vec4(x);\n"
5706 "}\n";
5707
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005708 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5709 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005710
5711 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005712 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005713 pipe.AddShader(&vs);
5714 pipe.AddShader(&fs);
5715
Chris Forbes59cb88d2015-05-25 11:13:13 +12005716 VkDescriptorSetObj descriptorSet(m_device);
5717 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005718 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +12005719
Tony Barbour5781e8f2015-08-04 16:23:11 -06005720 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +12005721
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005722 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +12005723}
5724
Karl Schultz6addd812016-02-02 17:17:23 -07005725TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005727 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005728
5729 ASSERT_NO_FATAL_FAILURE(InitState());
5730 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5731
5732 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005733 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13005734 "\n"
5735 "out gl_PerVertex {\n"
5736 " vec4 gl_Position;\n"
5737 "};\n"
5738 "void main(){\n"
5739 " gl_Position = vec4(1);\n"
5740 "}\n";
5741 char const *fsSource =
5742 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13005743 "\n"
5744 "in block { layout(location=0) float x; } ins;\n"
5745 "layout(location=0) out vec4 color;\n"
5746 "void main(){\n"
5747 " color = vec4(ins.x);\n"
5748 "}\n";
5749
5750 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5751 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5752
5753 VkPipelineObj pipe(m_device);
5754 pipe.AddColorAttachment();
5755 pipe.AddShader(&vs);
5756 pipe.AddShader(&fs);
5757
5758 VkDescriptorSetObj descriptorSet(m_device);
5759 descriptorSet.AppendDummy();
5760 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5761
5762 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5763
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005764 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13005765}
5766
Karl Schultz6addd812016-02-02 17:17:23 -07005767TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +13005768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +13005769 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -07005770 "output arr[2] of float32' vs 'ptr to "
5771 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +13005772
5773 ASSERT_NO_FATAL_FAILURE(InitState());
5774 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5775
5776 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005777 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13005778 "\n"
5779 "layout(location=0) out float x[2];\n"
5780 "out gl_PerVertex {\n"
5781 " vec4 gl_Position;\n"
5782 "};\n"
5783 "void main(){\n"
5784 " x[0] = 0; x[1] = 0;\n"
5785 " gl_Position = vec4(1);\n"
5786 "}\n";
5787 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005788 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +13005789 "\n"
5790 "layout(location=0) in float x[3];\n"
5791 "layout(location=0) out vec4 color;\n"
5792 "void main(){\n"
5793 " color = vec4(x[0] + x[1] + x[2]);\n"
5794 "}\n";
5795
5796 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5797 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5798
5799 VkPipelineObj pipe(m_device);
5800 pipe.AddColorAttachment();
5801 pipe.AddShader(&vs);
5802 pipe.AddShader(&fs);
5803
5804 VkDescriptorSetObj descriptorSet(m_device);
5805 descriptorSet.AppendDummy();
5806 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5807
5808 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5809
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005810 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +13005811}
5812
Karl Schultz6addd812016-02-02 17:17:23 -07005813TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07005814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005815 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005816
Chris Forbesb56af562015-05-25 11:13:17 +12005817 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005818 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +12005819
5820 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005821 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005822 "\n"
5823 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07005824 "out gl_PerVertex {\n"
5825 " vec4 gl_Position;\n"
5826 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005827 "void main(){\n"
5828 " x = 0;\n"
5829 " gl_Position = vec4(1);\n"
5830 "}\n";
5831 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12005832 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +12005833 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005834 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +12005835 "layout(location=0) out vec4 color;\n"
5836 "void main(){\n"
5837 " color = vec4(x);\n"
5838 "}\n";
5839
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06005840 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5841 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +12005842
5843 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08005844 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +12005845 pipe.AddShader(&vs);
5846 pipe.AddShader(&fs);
5847
Chris Forbesb56af562015-05-25 11:13:17 +12005848 VkDescriptorSetObj descriptorSet(m_device);
5849 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005850 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +12005851
Tony Barbour5781e8f2015-08-04 16:23:11 -06005852 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +12005853
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005854 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +12005855}
5856
Karl Schultz6addd812016-02-02 17:17:23 -07005857TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +13005858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005859 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +13005860
5861 ASSERT_NO_FATAL_FAILURE(InitState());
5862 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5863
5864 char const *vsSource =
5865 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13005866 "\n"
5867 "out block { layout(location=0) int x; } outs;\n"
5868 "out gl_PerVertex {\n"
5869 " vec4 gl_Position;\n"
5870 "};\n"
5871 "void main(){\n"
5872 " outs.x = 0;\n"
5873 " gl_Position = vec4(1);\n"
5874 "}\n";
5875 char const *fsSource =
5876 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +13005877 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07005878 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +13005879 "layout(location=0) out vec4 color;\n"
5880 "void main(){\n"
5881 " color = vec4(ins.x);\n"
5882 "}\n";
5883
5884 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5885 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5886
5887 VkPipelineObj pipe(m_device);
5888 pipe.AddColorAttachment();
5889 pipe.AddShader(&vs);
5890 pipe.AddShader(&fs);
5891
5892 VkDescriptorSetObj descriptorSet(m_device);
5893 descriptorSet.AppendDummy();
5894 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5895
5896 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5897
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005898 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13005899}
5900
5901TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
5902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5903 "location 0.0 which is not written by vertex shader");
5904
5905 ASSERT_NO_FATAL_FAILURE(InitState());
5906 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5907
5908 char const *vsSource =
5909 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13005910 "\n"
5911 "out block { layout(location=1) float x; } outs;\n"
5912 "out gl_PerVertex {\n"
5913 " vec4 gl_Position;\n"
5914 "};\n"
5915 "void main(){\n"
5916 " outs.x = 0;\n"
5917 " gl_Position = vec4(1);\n"
5918 "}\n";
5919 char const *fsSource =
5920 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13005921 "\n"
5922 "in block { layout(location=0) float x; } ins;\n"
5923 "layout(location=0) out vec4 color;\n"
5924 "void main(){\n"
5925 " color = vec4(ins.x);\n"
5926 "}\n";
5927
5928 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5929 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5930
5931 VkPipelineObj pipe(m_device);
5932 pipe.AddColorAttachment();
5933 pipe.AddShader(&vs);
5934 pipe.AddShader(&fs);
5935
5936 VkDescriptorSetObj descriptorSet(m_device);
5937 descriptorSet.AppendDummy();
5938 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5939
5940 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5941
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005942 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +13005943}
5944
5945TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
5946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5947 "location 0.1 which is not written by vertex shader");
5948
5949 ASSERT_NO_FATAL_FAILURE(InitState());
5950 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5951
5952 char const *vsSource =
5953 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13005954 "\n"
5955 "out block { layout(location=0, component=0) float x; } outs;\n"
5956 "out gl_PerVertex {\n"
5957 " vec4 gl_Position;\n"
5958 "};\n"
5959 "void main(){\n"
5960 " outs.x = 0;\n"
5961 " gl_Position = vec4(1);\n"
5962 "}\n";
5963 char const *fsSource =
5964 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +13005965 "\n"
5966 "in block { layout(location=0, component=1) float x; } ins;\n"
5967 "layout(location=0) out vec4 color;\n"
5968 "void main(){\n"
5969 " color = vec4(ins.x);\n"
5970 "}\n";
5971
5972 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5973 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5974
5975 VkPipelineObj pipe(m_device);
5976 pipe.AddColorAttachment();
5977 pipe.AddShader(&vs);
5978 pipe.AddShader(&fs);
5979
5980 VkDescriptorSetObj descriptorSet(m_device);
5981 descriptorSet.AppendDummy();
5982 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
5983
5984 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
5985
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005986 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +13005987}
5988
Karl Schultz6addd812016-02-02 17:17:23 -07005989TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07005991 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005992
Chris Forbesde136e02015-05-25 11:13:28 +12005993 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06005994 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +12005995
5996 VkVertexInputBindingDescription input_binding;
5997 memset(&input_binding, 0, sizeof(input_binding));
5998
5999 VkVertexInputAttributeDescription input_attrib;
6000 memset(&input_attrib, 0, sizeof(input_attrib));
6001 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6002
6003 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006004 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006005 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006006 "out gl_PerVertex {\n"
6007 " vec4 gl_Position;\n"
6008 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006009 "void main(){\n"
6010 " gl_Position = vec4(1);\n"
6011 "}\n";
6012 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006013 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +12006014 "\n"
6015 "layout(location=0) out vec4 color;\n"
6016 "void main(){\n"
6017 " color = vec4(1);\n"
6018 "}\n";
6019
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006020 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6021 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +12006022
6023 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006024 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +12006025 pipe.AddShader(&vs);
6026 pipe.AddShader(&fs);
6027
6028 pipe.AddVertexInputBindings(&input_binding, 1);
6029 pipe.AddVertexInputAttribs(&input_attrib, 1);
6030
Chris Forbesde136e02015-05-25 11:13:28 +12006031 VkDescriptorSetObj descriptorSet(m_device);
6032 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006033 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +12006034
Tony Barbour5781e8f2015-08-04 16:23:11 -06006035 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +12006036
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006037 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +12006038}
6039
Karl Schultz6addd812016-02-02 17:17:23 -07006040TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006042 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +13006043
6044 ASSERT_NO_FATAL_FAILURE(InitState());
6045 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6046
6047 VkVertexInputBindingDescription input_binding;
6048 memset(&input_binding, 0, sizeof(input_binding));
6049
6050 VkVertexInputAttributeDescription input_attrib;
6051 memset(&input_attrib, 0, sizeof(input_attrib));
6052 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6053
6054 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006055 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006056 "\n"
6057 "layout(location=1) in float x;\n"
6058 "out gl_PerVertex {\n"
6059 " vec4 gl_Position;\n"
6060 "};\n"
6061 "void main(){\n"
6062 " gl_Position = vec4(x);\n"
6063 "}\n";
6064 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006065 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +13006066 "\n"
6067 "layout(location=0) out vec4 color;\n"
6068 "void main(){\n"
6069 " color = vec4(1);\n"
6070 "}\n";
6071
6072 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6073 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6074
6075 VkPipelineObj pipe(m_device);
6076 pipe.AddColorAttachment();
6077 pipe.AddShader(&vs);
6078 pipe.AddShader(&fs);
6079
6080 pipe.AddVertexInputBindings(&input_binding, 1);
6081 pipe.AddVertexInputAttribs(&input_attrib, 1);
6082
6083 VkDescriptorSetObj descriptorSet(m_device);
6084 descriptorSet.AppendDummy();
6085 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6086
6087 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6088
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006089 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +13006090}
6091
Karl Schultz6addd812016-02-02 17:17:23 -07006092TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
6093 m_errorMonitor->SetDesiredFailureMsg(
6094 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006095 "VS consumes input at location 0 but not provided");
6096
Chris Forbes62e8e502015-05-25 11:13:29 +12006097 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006098 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +12006099
6100 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006101 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006102 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006103 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -07006104 "out gl_PerVertex {\n"
6105 " vec4 gl_Position;\n"
6106 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006107 "void main(){\n"
6108 " gl_Position = x;\n"
6109 "}\n";
6110 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006111 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +12006112 "\n"
6113 "layout(location=0) out vec4 color;\n"
6114 "void main(){\n"
6115 " color = vec4(1);\n"
6116 "}\n";
6117
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006118 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6119 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +12006120
6121 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006122 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +12006123 pipe.AddShader(&vs);
6124 pipe.AddShader(&fs);
6125
Chris Forbes62e8e502015-05-25 11:13:29 +12006126 VkDescriptorSetObj descriptorSet(m_device);
6127 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006128 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +12006129
Tony Barbour5781e8f2015-08-04 16:23:11 -06006130 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +12006131
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006132 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +12006133}
6134
Karl Schultz6addd812016-02-02 17:17:23 -07006135TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
6136 m_errorMonitor->SetDesiredFailureMsg(
6137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006138 "location 0 does not match VS input type");
6139
Chris Forbesc97d98e2015-05-25 11:13:31 +12006140 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006141 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006142
6143 VkVertexInputBindingDescription input_binding;
6144 memset(&input_binding, 0, sizeof(input_binding));
6145
6146 VkVertexInputAttributeDescription input_attrib;
6147 memset(&input_attrib, 0, sizeof(input_attrib));
6148 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6149
6150 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006151 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006152 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006153 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006154 "out gl_PerVertex {\n"
6155 " vec4 gl_Position;\n"
6156 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006157 "void main(){\n"
6158 " gl_Position = vec4(x);\n"
6159 "}\n";
6160 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006161 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +12006162 "\n"
6163 "layout(location=0) out vec4 color;\n"
6164 "void main(){\n"
6165 " color = vec4(1);\n"
6166 "}\n";
6167
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006168 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6169 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006170
6171 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006172 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006173 pipe.AddShader(&vs);
6174 pipe.AddShader(&fs);
6175
6176 pipe.AddVertexInputBindings(&input_binding, 1);
6177 pipe.AddVertexInputAttribs(&input_attrib, 1);
6178
Chris Forbesc97d98e2015-05-25 11:13:31 +12006179 VkDescriptorSetObj descriptorSet(m_device);
6180 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006181 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +12006182
Tony Barbour5781e8f2015-08-04 16:23:11 -06006183 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +12006184
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006185 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +12006186}
6187
Chris Forbesc68b43c2016-04-06 11:18:47 +12006188TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
6189 m_errorMonitor->SetDesiredFailureMsg(
6190 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6191 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
6192
6193 ASSERT_NO_FATAL_FAILURE(InitState());
6194 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6195
6196 char const *vsSource =
6197 "#version 450\n"
6198 "\n"
6199 "out gl_PerVertex {\n"
6200 " vec4 gl_Position;\n"
6201 "};\n"
6202 "void main(){\n"
6203 " gl_Position = vec4(1);\n"
6204 "}\n";
6205 char const *fsSource =
6206 "#version 450\n"
6207 "\n"
6208 "layout(location=0) out vec4 color;\n"
6209 "void main(){\n"
6210 " color = vec4(1);\n"
6211 "}\n";
6212
6213 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6214 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6215
6216 VkPipelineObj pipe(m_device);
6217 pipe.AddColorAttachment();
6218 pipe.AddShader(&vs);
6219 pipe.AddShader(&vs);
6220 pipe.AddShader(&fs);
6221
6222 VkDescriptorSetObj descriptorSet(m_device);
6223 descriptorSet.AppendDummy();
6224 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6225
6226 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6227
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006228 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +12006229}
6230
Karl Schultz6addd812016-02-02 17:17:23 -07006231TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006232 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006233
6234 ASSERT_NO_FATAL_FAILURE(InitState());
6235 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6236
6237 VkVertexInputBindingDescription input_binding;
6238 memset(&input_binding, 0, sizeof(input_binding));
6239
6240 VkVertexInputAttributeDescription input_attribs[2];
6241 memset(input_attribs, 0, sizeof(input_attribs));
6242
6243 for (int i = 0; i < 2; i++) {
6244 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6245 input_attribs[i].location = i;
6246 }
6247
6248 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006249 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006250 "\n"
6251 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -07006252 "out gl_PerVertex {\n"
6253 " vec4 gl_Position;\n"
6254 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006255 "void main(){\n"
6256 " gl_Position = x[0] + x[1];\n"
6257 "}\n";
6258 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006259 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006260 "\n"
6261 "layout(location=0) out vec4 color;\n"
6262 "void main(){\n"
6263 " color = vec4(1);\n"
6264 "}\n";
6265
6266 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6267 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6268
6269 VkPipelineObj pipe(m_device);
6270 pipe.AddColorAttachment();
6271 pipe.AddShader(&vs);
6272 pipe.AddShader(&fs);
6273
6274 pipe.AddVertexInputBindings(&input_binding, 1);
6275 pipe.AddVertexInputAttribs(input_attribs, 2);
6276
6277 VkDescriptorSetObj descriptorSet(m_device);
6278 descriptorSet.AppendDummy();
6279 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6280
6281 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6282
6283 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006284 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006285}
6286
Chris Forbes2682b242015-11-24 11:13:14 +13006287TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
6288{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006289 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +13006290
6291 ASSERT_NO_FATAL_FAILURE(InitState());
6292 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6293
6294 VkVertexInputBindingDescription input_binding;
6295 memset(&input_binding, 0, sizeof(input_binding));
6296
6297 VkVertexInputAttributeDescription input_attribs[2];
6298 memset(input_attribs, 0, sizeof(input_attribs));
6299
6300 for (int i = 0; i < 2; i++) {
6301 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
6302 input_attribs[i].location = i;
6303 }
6304
6305 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006306 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006307 "\n"
6308 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -07006309 "out gl_PerVertex {\n"
6310 " vec4 gl_Position;\n"
6311 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006312 "void main(){\n"
6313 " gl_Position = x[0] + x[1];\n"
6314 "}\n";
6315 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006316 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +13006317 "\n"
6318 "layout(location=0) out vec4 color;\n"
6319 "void main(){\n"
6320 " color = vec4(1);\n"
6321 "}\n";
6322
6323 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6324 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6325
6326 VkPipelineObj pipe(m_device);
6327 pipe.AddColorAttachment();
6328 pipe.AddShader(&vs);
6329 pipe.AddShader(&fs);
6330
6331 pipe.AddVertexInputBindings(&input_binding, 1);
6332 pipe.AddVertexInputAttribs(input_attribs, 2);
6333
6334 VkDescriptorSetObj descriptorSet(m_device);
6335 descriptorSet.AppendDummy();
6336 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6337
6338 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6339
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006340 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +13006341}
Chris Forbes2682b242015-11-24 11:13:14 +13006342
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006343TEST_F(VkLayerTest, CreatePipelineSimplePositive)
6344{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006345 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006346
6347 ASSERT_NO_FATAL_FAILURE(InitState());
6348 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6349
6350 char const *vsSource =
6351 "#version 450\n"
6352 "out gl_PerVertex {\n"
6353 " vec4 gl_Position;\n"
6354 "};\n"
6355 "void main(){\n"
6356 " gl_Position = vec4(0);\n"
6357 "}\n";
6358 char const *fsSource =
6359 "#version 450\n"
6360 "\n"
6361 "layout(location=0) out vec4 color;\n"
6362 "void main(){\n"
6363 " color = vec4(1);\n"
6364 "}\n";
6365
6366 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6367 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6368
6369 VkPipelineObj pipe(m_device);
6370 pipe.AddColorAttachment();
6371 pipe.AddShader(&vs);
6372 pipe.AddShader(&fs);
6373
6374 VkDescriptorSetObj descriptorSet(m_device);
6375 descriptorSet.AppendDummy();
6376 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6377
6378 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6379
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006380 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006381}
6382
Chris Forbes912c9192016-04-05 17:50:35 +12006383TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
6384{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006385 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +12006386
6387 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
6388
6389 ASSERT_NO_FATAL_FAILURE(InitState());
6390 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6391
6392 char const *vsSource =
6393 "#version 450\n"
6394 "out gl_PerVertex {\n"
6395 " vec4 gl_Position;\n"
6396 "};\n"
6397 "layout(location=0) out vec3 x;\n"
6398 "layout(location=1) out ivec3 y;\n"
6399 "layout(location=2) out vec3 z;\n"
6400 "void main(){\n"
6401 " gl_Position = vec4(0);\n"
6402 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
6403 "}\n";
6404 char const *fsSource =
6405 "#version 450\n"
6406 "\n"
6407 "layout(location=0) out vec4 color;\n"
6408 "layout(location=0) in float x;\n"
6409 "layout(location=1) flat in int y;\n"
6410 "layout(location=2) in vec2 z;\n"
6411 "void main(){\n"
6412 " color = vec4(1 + x + y + z.x);\n"
6413 "}\n";
6414
6415 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6416 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6417
6418 VkPipelineObj pipe(m_device);
6419 pipe.AddColorAttachment();
6420 pipe.AddShader(&vs);
6421 pipe.AddShader(&fs);
6422
6423 VkDescriptorSetObj descriptorSet(m_device);
6424 descriptorSet.AppendDummy();
6425 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6426
6427 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6428
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006429 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +12006430}
6431
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006432TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
6433{
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006434 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006435
6436 ASSERT_NO_FATAL_FAILURE(InitState());
6437 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6438
Chris Forbesc1e852d2016-04-04 19:26:42 +12006439 if (!m_device->phy().features().tessellationShader) {
6440 printf("Device does not support tessellation shaders; skipped.\n");
6441 return;
6442 }
6443
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006444 char const *vsSource =
6445 "#version 450\n"
6446 "void main(){}\n";
6447 char const *tcsSource =
6448 "#version 450\n"
6449 "layout(location=0) out int x[];\n"
6450 "layout(vertices=3) out;\n"
6451 "void main(){\n"
6452 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
6453 " gl_TessLevelInner[0] = 1;\n"
6454 " x[gl_InvocationID] = gl_InvocationID;\n"
6455 "}\n";
6456 char const *tesSource =
6457 "#version 450\n"
6458 "layout(triangles, equal_spacing, cw) in;\n"
6459 "layout(location=0) in int x[];\n"
6460 "out gl_PerVertex { vec4 gl_Position; };\n"
6461 "void main(){\n"
6462 " gl_Position.xyz = gl_TessCoord;\n"
6463 " gl_Position.w = x[0] + x[1] + x[2];\n"
6464 "}\n";
6465 char const *fsSource =
6466 "#version 450\n"
6467 "layout(location=0) out vec4 color;\n"
6468 "void main(){\n"
6469 " color = vec4(1);\n"
6470 "}\n";
6471
6472 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6473 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
6474 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
6475 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6476
6477 VkPipelineInputAssemblyStateCreateInfo iasci{
6478 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
6479 nullptr,
6480 0,
6481 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
6482 VK_FALSE};
6483
Chris Forbesb4cacb62016-04-04 19:15:00 +12006484 VkPipelineTessellationStateCreateInfo tsci{
6485 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
6486 nullptr,
6487 0,
6488 3};
6489
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006490 VkPipelineObj pipe(m_device);
6491 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +12006492 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006493 pipe.AddColorAttachment();
6494 pipe.AddShader(&vs);
6495 pipe.AddShader(&tcs);
6496 pipe.AddShader(&tes);
6497 pipe.AddShader(&fs);
6498
6499 VkDescriptorSetObj descriptorSet(m_device);
6500 descriptorSet.AppendDummy();
6501 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6502
6503 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6504
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006505 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +12006506}
6507
Chris Forbesa0ab8152016-04-20 13:34:27 +12006508TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
6509{
6510 m_errorMonitor->ExpectSuccess();
6511
6512 ASSERT_NO_FATAL_FAILURE(InitState());
6513 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6514
6515 if (!m_device->phy().features().geometryShader) {
6516 printf("Device does not support geometry shaders; skipped.\n");
6517 return;
6518 }
6519
6520 char const *vsSource =
6521 "#version 450\n"
6522 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
6523 "void main(){\n"
6524 " vs_out.x = vec4(1);\n"
6525 "}\n";
6526 char const *gsSource =
6527 "#version 450\n"
6528 "layout(triangles) in;\n"
6529 "layout(triangle_strip, max_vertices=3) out;\n"
6530 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
6531 "out gl_PerVertex { vec4 gl_Position; };\n"
6532 "void main() {\n"
6533 " gl_Position = gs_in[0].x;\n"
6534 " EmitVertex();\n"
6535 "}\n";
6536 char const *fsSource =
6537 "#version 450\n"
6538 "layout(location=0) out vec4 color;\n"
6539 "void main(){\n"
6540 " color = vec4(1);\n"
6541 "}\n";
6542
6543 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6544 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
6545 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6546
6547 VkPipelineObj pipe(m_device);
6548 pipe.AddColorAttachment();
6549 pipe.AddShader(&vs);
6550 pipe.AddShader(&gs);
6551 pipe.AddShader(&fs);
6552
6553 VkDescriptorSetObj descriptorSet(m_device);
6554 descriptorSet.AppendDummy();
6555 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6556
6557 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6558
6559 m_errorMonitor->VerifyNotFound();
6560}
6561
Chris Forbesa0193bc2016-04-04 19:19:47 +12006562TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
6563{
6564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6565 "is per-vertex in tessellation control shader stage "
6566 "but per-patch in tessellation evaluation shader stage");
6567
6568 ASSERT_NO_FATAL_FAILURE(InitState());
6569 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6570
Chris Forbesc1e852d2016-04-04 19:26:42 +12006571 if (!m_device->phy().features().tessellationShader) {
6572 printf("Device does not support tessellation shaders; skipped.\n");
6573 return;
6574 }
6575
Chris Forbesa0193bc2016-04-04 19:19:47 +12006576 char const *vsSource =
6577 "#version 450\n"
6578 "void main(){}\n";
6579 char const *tcsSource =
6580 "#version 450\n"
6581 "layout(location=0) out int x[];\n"
6582 "layout(vertices=3) out;\n"
6583 "void main(){\n"
6584 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
6585 " gl_TessLevelInner[0] = 1;\n"
6586 " x[gl_InvocationID] = gl_InvocationID;\n"
6587 "}\n";
6588 char const *tesSource =
6589 "#version 450\n"
6590 "layout(triangles, equal_spacing, cw) in;\n"
6591 "layout(location=0) patch in int x;\n"
6592 "out gl_PerVertex { vec4 gl_Position; };\n"
6593 "void main(){\n"
6594 " gl_Position.xyz = gl_TessCoord;\n"
6595 " gl_Position.w = x;\n"
6596 "}\n";
6597 char const *fsSource =
6598 "#version 450\n"
6599 "layout(location=0) out vec4 color;\n"
6600 "void main(){\n"
6601 " color = vec4(1);\n"
6602 "}\n";
6603
6604 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6605 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
6606 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
6607 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6608
6609 VkPipelineInputAssemblyStateCreateInfo iasci{
6610 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
6611 nullptr,
6612 0,
6613 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
6614 VK_FALSE};
6615
6616 VkPipelineTessellationStateCreateInfo tsci{
6617 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
6618 nullptr,
6619 0,
6620 3};
6621
6622 VkPipelineObj pipe(m_device);
6623 pipe.SetInputAssembly(&iasci);
6624 pipe.SetTessellation(&tsci);
6625 pipe.AddColorAttachment();
6626 pipe.AddShader(&vs);
6627 pipe.AddShader(&tcs);
6628 pipe.AddShader(&tes);
6629 pipe.AddShader(&fs);
6630
6631 VkDescriptorSetObj descriptorSet(m_device);
6632 descriptorSet.AppendDummy();
6633 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6634
6635 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6636
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006637 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +12006638}
6639
Karl Schultz6addd812016-02-02 17:17:23 -07006640TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
6641 m_errorMonitor->SetDesiredFailureMsg(
6642 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006643 "Duplicate vertex input binding descriptions for binding 0");
6644
Chris Forbes280ba2c2015-06-12 11:16:41 +12006645 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006646 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +12006647
6648 /* Two binding descriptions for binding 0 */
6649 VkVertexInputBindingDescription input_bindings[2];
6650 memset(input_bindings, 0, sizeof(input_bindings));
6651
6652 VkVertexInputAttributeDescription input_attrib;
6653 memset(&input_attrib, 0, sizeof(input_attrib));
6654 input_attrib.format = VK_FORMAT_R32_SFLOAT;
6655
6656 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006657 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12006658 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006659 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -07006660 "out gl_PerVertex {\n"
6661 " vec4 gl_Position;\n"
6662 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12006663 "void main(){\n"
6664 " gl_Position = vec4(x);\n"
6665 "}\n";
6666 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006667 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +12006668 "\n"
6669 "layout(location=0) out vec4 color;\n"
6670 "void main(){\n"
6671 " color = vec4(1);\n"
6672 "}\n";
6673
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006674 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6675 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +12006676
6677 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +08006678 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +12006679 pipe.AddShader(&vs);
6680 pipe.AddShader(&fs);
6681
6682 pipe.AddVertexInputBindings(input_bindings, 2);
6683 pipe.AddVertexInputAttribs(&input_attrib, 1);
6684
Chris Forbes280ba2c2015-06-12 11:16:41 +12006685 VkDescriptorSetObj descriptorSet(m_device);
6686 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006687 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +12006688
Tony Barbour5781e8f2015-08-04 16:23:11 -06006689 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +12006690
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006691 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +12006692}
Chris Forbes8f68b562015-05-25 11:13:32 +12006693
Chris Forbes35efec72016-04-21 14:32:08 +12006694TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
6695 m_errorMonitor->ExpectSuccess();
6696
6697 ASSERT_NO_FATAL_FAILURE(InitState());
6698 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6699
6700 if (!m_device->phy().features().tessellationShader) {
6701 printf("Device does not support 64bit vertex attributes; skipped.\n");
6702 return;
6703 }
6704
6705 VkVertexInputBindingDescription input_bindings[1];
6706 memset(input_bindings, 0, sizeof(input_bindings));
6707
6708 VkVertexInputAttributeDescription input_attribs[4];
6709 memset(input_attribs, 0, sizeof(input_attribs));
6710 input_attribs[0].location = 0;
6711 input_attribs[0].offset = 0;
6712 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6713 input_attribs[1].location = 2;
6714 input_attribs[1].offset = 32;
6715 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6716 input_attribs[2].location = 4;
6717 input_attribs[2].offset = 64;
6718 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6719 input_attribs[3].location = 6;
6720 input_attribs[3].offset = 96;
6721 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
6722
6723 char const *vsSource =
6724 "#version 450\n"
6725 "\n"
6726 "layout(location=0) in dmat4 x;\n"
6727 "out gl_PerVertex {\n"
6728 " vec4 gl_Position;\n"
6729 "};\n"
6730 "void main(){\n"
6731 " gl_Position = vec4(x[0][0]);\n"
6732 "}\n";
6733 char const *fsSource =
6734 "#version 450\n"
6735 "\n"
6736 "layout(location=0) out vec4 color;\n"
6737 "void main(){\n"
6738 " color = vec4(1);\n"
6739 "}\n";
6740
6741 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6742 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6743
6744 VkPipelineObj pipe(m_device);
6745 pipe.AddColorAttachment();
6746 pipe.AddShader(&vs);
6747 pipe.AddShader(&fs);
6748
6749 pipe.AddVertexInputBindings(input_bindings, 1);
6750 pipe.AddVertexInputAttribs(input_attribs, 4);
6751
6752 VkDescriptorSetObj descriptorSet(m_device);
6753 descriptorSet.AppendDummy();
6754 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6755
6756 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6757
6758 m_errorMonitor->VerifyNotFound();
6759}
6760
Karl Schultz6addd812016-02-02 17:17:23 -07006761TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006763 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006764
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006765 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006766
6767 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006768 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006769 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006770 "out gl_PerVertex {\n"
6771 " vec4 gl_Position;\n"
6772 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006773 "void main(){\n"
6774 " gl_Position = vec4(1);\n"
6775 "}\n";
6776 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006777 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006778 "\n"
6779 "void main(){\n"
6780 "}\n";
6781
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006782 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6783 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006784
6785 VkPipelineObj pipe(m_device);
6786 pipe.AddShader(&vs);
6787 pipe.AddShader(&fs);
6788
Chia-I Wu08accc62015-07-07 11:50:03 +08006789 /* set up CB 0, not written */
6790 pipe.AddColorAttachment();
6791 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006792
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006793 VkDescriptorSetObj descriptorSet(m_device);
6794 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006795 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006796
Tony Barbour5781e8f2015-08-04 16:23:11 -06006797 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006798
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006799 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +12006800}
6801
Karl Schultz6addd812016-02-02 17:17:23 -07006802TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -07006803 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006804 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006805 "FS writes to output location 1 with no matching attachment");
6806
Chris Forbesf3fffaa2015-05-25 11:13:43 +12006807 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12006808
6809 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006810 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12006811 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006812 "out gl_PerVertex {\n"
6813 " vec4 gl_Position;\n"
6814 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12006815 "void main(){\n"
6816 " gl_Position = vec4(1);\n"
6817 "}\n";
6818 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006819 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +12006820 "\n"
6821 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006822 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +12006823 "void main(){\n"
6824 " x = vec4(1);\n"
6825 " y = vec4(1);\n"
6826 "}\n";
6827
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006828 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6829 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12006830
6831 VkPipelineObj pipe(m_device);
6832 pipe.AddShader(&vs);
6833 pipe.AddShader(&fs);
6834
Chia-I Wu08accc62015-07-07 11:50:03 +08006835 /* set up CB 0, not written */
6836 pipe.AddColorAttachment();
6837 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12006838 /* FS writes CB 1, but we don't configure it */
6839
Chris Forbesf3fffaa2015-05-25 11:13:43 +12006840 VkDescriptorSetObj descriptorSet(m_device);
6841 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006842 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +12006843
Tony Barbour5781e8f2015-08-04 16:23:11 -06006844 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +12006845
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006846 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +12006847}
6848
Karl Schultz6addd812016-02-02 17:17:23 -07006849TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006851 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006852
Chris Forbesa36d69e2015-05-25 11:13:44 +12006853 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +12006854
6855 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006856 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12006857 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006858 "out gl_PerVertex {\n"
6859 " vec4 gl_Position;\n"
6860 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12006861 "void main(){\n"
6862 " gl_Position = vec4(1);\n"
6863 "}\n";
6864 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006865 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +12006866 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -07006867 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +12006868 "void main(){\n"
6869 " x = ivec4(1);\n"
6870 "}\n";
6871
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006872 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6873 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +12006874
6875 VkPipelineObj pipe(m_device);
6876 pipe.AddShader(&vs);
6877 pipe.AddShader(&fs);
6878
Chia-I Wu08accc62015-07-07 11:50:03 +08006879 /* set up CB 0; type is UNORM by default */
6880 pipe.AddColorAttachment();
6881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +12006882
Chris Forbesa36d69e2015-05-25 11:13:44 +12006883 VkDescriptorSetObj descriptorSet(m_device);
6884 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006885 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +12006886
Tony Barbour5781e8f2015-08-04 16:23:11 -06006887 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +12006888
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006889 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +12006890}
Chris Forbes7b1b8932015-06-05 14:43:36 +12006891
Karl Schultz6addd812016-02-02 17:17:23 -07006892TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006893 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006894 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006895
Chris Forbes556c76c2015-08-14 12:04:59 +12006896 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +12006897
6898 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006899 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12006900 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07006901 "out gl_PerVertex {\n"
6902 " vec4 gl_Position;\n"
6903 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12006904 "void main(){\n"
6905 " gl_Position = vec4(1);\n"
6906 "}\n";
6907 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +12006908 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +12006909 "\n"
6910 "layout(location=0) out vec4 x;\n"
6911 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6912 "void main(){\n"
6913 " x = vec4(bar.y);\n"
6914 "}\n";
6915
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006916 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6917 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +12006918
Chris Forbes556c76c2015-08-14 12:04:59 +12006919 VkPipelineObj pipe(m_device);
6920 pipe.AddShader(&vs);
6921 pipe.AddShader(&fs);
6922
6923 /* set up CB 0; type is UNORM by default */
6924 pipe.AddColorAttachment();
6925 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6926
6927 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006928 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +12006929
6930 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6931
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006932 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +12006933}
6934
Chris Forbes5c59e902016-02-26 16:56:09 +13006935TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
6936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6937 "not declared in layout");
6938
6939 ASSERT_NO_FATAL_FAILURE(InitState());
6940
6941 char const *vsSource =
6942 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13006943 "\n"
6944 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
6945 "out gl_PerVertex {\n"
6946 " vec4 gl_Position;\n"
6947 "};\n"
6948 "void main(){\n"
6949 " gl_Position = vec4(consts.x);\n"
6950 "}\n";
6951 char const *fsSource =
6952 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +13006953 "\n"
6954 "layout(location=0) out vec4 x;\n"
6955 "void main(){\n"
6956 " x = vec4(1);\n"
6957 "}\n";
6958
6959 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6960 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6961
6962 VkPipelineObj pipe(m_device);
6963 pipe.AddShader(&vs);
6964 pipe.AddShader(&fs);
6965
6966 /* set up CB 0; type is UNORM by default */
6967 pipe.AddColorAttachment();
6968 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6969
6970 VkDescriptorSetObj descriptorSet(m_device);
6971 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
6972
6973 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
6974
6975 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006976 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +13006977}
6978
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006979#endif // SHADER_CHECKER_TESTS
6980
6981#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -06006982TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -07006983 m_errorMonitor->SetDesiredFailureMsg(
6984 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006985 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006986
6987 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006988
6989 // Create an image
6990 VkImage image;
6991
Karl Schultz6addd812016-02-02 17:17:23 -07006992 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6993 const int32_t tex_width = 32;
6994 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06006995
6996 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006997 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6998 image_create_info.pNext = NULL;
6999 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7000 image_create_info.format = tex_format;
7001 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007002 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -07007003 image_create_info.extent.depth = 1;
7004 image_create_info.mipLevels = 1;
7005 image_create_info.arrayLayers = 1;
7006 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7007 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7008 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7009 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007010
7011 // Introduce error by sending down a bogus width extent
7012 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +08007013 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007014
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007015 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06007016}
7017
Mark Youngc48c4c12016-04-11 14:26:49 -06007018TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
7019 m_errorMonitor->SetDesiredFailureMsg(
7020 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7021 "CreateImage extents is 0 for at least one required dimension");
7022
7023 ASSERT_NO_FATAL_FAILURE(InitState());
7024
7025 // Create an image
7026 VkImage image;
7027
7028 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7029 const int32_t tex_width = 32;
7030 const int32_t tex_height = 32;
7031
7032 VkImageCreateInfo image_create_info = {};
7033 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7034 image_create_info.pNext = NULL;
7035 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7036 image_create_info.format = tex_format;
7037 image_create_info.extent.width = tex_width;
7038 image_create_info.extent.height = tex_height;
7039 image_create_info.extent.depth = 1;
7040 image_create_info.mipLevels = 1;
7041 image_create_info.arrayLayers = 1;
7042 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7043 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7044 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7045 image_create_info.flags = 0;
7046
7047 // Introduce error by sending down a bogus width extent
7048 image_create_info.extent.width = 0;
7049 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7050
7051 m_errorMonitor->VerifyFound();
7052}
7053
Karl Schultz6addd812016-02-02 17:17:23 -07007054TEST_F(VkLayerTest, UpdateBufferAlignment) {
7055 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mike Stroyana3082432015-09-25 13:39:21 -06007056
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007058 "dstOffset, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007059
Mike Stroyana3082432015-09-25 13:39:21 -06007060 ASSERT_NO_FATAL_FAILURE(InitState());
7061
7062 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7063 vk_testing::Buffer buffer;
7064 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7065
7066 BeginCommandBuffer();
7067 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007068 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007069 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007070
Mike Stroyana3082432015-09-25 13:39:21 -06007071 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007073 "dataSize, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007074
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007075 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007076 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007077 EndCommandBuffer();
7078}
7079
Karl Schultz6addd812016-02-02 17:17:23 -07007080TEST_F(VkLayerTest, FillBufferAlignment) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007082 "dstOffset, is not a multiple of 4");
Mike Stroyana3082432015-09-25 13:39:21 -06007083
7084 ASSERT_NO_FATAL_FAILURE(InitState());
7085
7086 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
7087 vk_testing::Buffer buffer;
7088 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
7089
7090 BeginCommandBuffer();
7091 // Introduce failure by using offset that is not multiple of 4
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007092 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007093 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007094
Mike Stroyana3082432015-09-25 13:39:21 -06007095 // Introduce failure by using size that is not multiple of 4
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007097 "size, is not a multiple of 4");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007098
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007099 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007100
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007101 m_errorMonitor->VerifyFound();
7102
Mike Stroyana3082432015-09-25 13:39:21 -06007103 EndCommandBuffer();
7104}
7105
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007106#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +12007107
Tobin Ehliscde08892015-09-22 10:11:37 -06007108#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -07007109TEST_F(VkLayerTest, InvalidImageView) {
7110 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -06007111
Karl Schultz6addd812016-02-02 17:17:23 -07007112 m_errorMonitor->SetDesiredFailureMsg(
7113 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007114 "vkCreateImageView called with baseMipLevel 10 ");
7115
Tobin Ehliscde08892015-09-22 10:11:37 -06007116 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -06007117
Mike Stroyana3082432015-09-25 13:39:21 -06007118 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -07007119 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -06007120
Karl Schultz6addd812016-02-02 17:17:23 -07007121 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7122 const int32_t tex_width = 32;
7123 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -06007124
7125 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007126 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7127 image_create_info.pNext = NULL;
7128 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7129 image_create_info.format = tex_format;
7130 image_create_info.extent.width = tex_width;
7131 image_create_info.extent.height = tex_height;
7132 image_create_info.extent.depth = 1;
7133 image_create_info.mipLevels = 1;
7134 image_create_info.arrayLayers = 1;
7135 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7136 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7137 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7138 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -06007139
Chia-I Wuf7458c52015-10-26 21:10:41 +08007140 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -06007141 ASSERT_VK_SUCCESS(err);
7142
7143 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007144 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7145 image_view_create_info.image = image;
7146 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7147 image_view_create_info.format = tex_format;
7148 image_view_create_info.subresourceRange.layerCount = 1;
7149 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
7150 image_view_create_info.subresourceRange.levelCount = 1;
7151 image_view_create_info.subresourceRange.aspectMask =
7152 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -06007153
7154 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007155 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7156 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -06007157
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007158 m_errorMonitor->VerifyFound();
Tobin Ehliscde08892015-09-22 10:11:37 -06007159}
Mike Stroyana3082432015-09-25 13:39:21 -06007160
Karl Schultz6addd812016-02-02 17:17:23 -07007161TEST_F(VkLayerTest, InvalidImageViewAspect) {
7162 VkResult err;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007163
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007165 "vkCreateImageView: Color image "
7166 "formats must have ONLY the "
7167 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007168
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007169 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007170
7171 // Create an image and try to create a view with an invalid aspectMask
Karl Schultz6addd812016-02-02 17:17:23 -07007172 VkImage image;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007173
Karl Schultz6addd812016-02-02 17:17:23 -07007174 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7175 const int32_t tex_width = 32;
7176 const int32_t tex_height = 32;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007177
7178 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007179 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7180 image_create_info.pNext = NULL;
7181 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7182 image_create_info.format = tex_format;
7183 image_create_info.extent.width = tex_width;
7184 image_create_info.extent.height = tex_height;
7185 image_create_info.extent.depth = 1;
7186 image_create_info.mipLevels = 1;
7187 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7188 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7189 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7190 image_create_info.flags = 0;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007191
Chia-I Wuf7458c52015-10-26 21:10:41 +08007192 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007193 ASSERT_VK_SUCCESS(err);
7194
7195 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007196 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7197 image_view_create_info.image = image;
7198 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7199 image_view_create_info.format = tex_format;
7200 image_view_create_info.subresourceRange.baseMipLevel = 0;
7201 image_view_create_info.subresourceRange.levelCount = 1;
7202 // Cause an error by setting an invalid image aspect
7203 image_view_create_info.subresourceRange.aspectMask =
7204 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007205
7206 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007207 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7208 &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007209
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007210 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06007211}
7212
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007213TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007214 VkResult err;
7215 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007216
Karl Schultz6addd812016-02-02 17:17:23 -07007217 m_errorMonitor->SetDesiredFailureMsg(
7218 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007219 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007220
Mike Stroyana3082432015-09-25 13:39:21 -06007221 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007222
7223 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007224 VkImage srcImage;
7225 VkImage dstImage;
7226 VkDeviceMemory srcMem;
7227 VkDeviceMemory destMem;
7228 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007229
7230 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007231 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7232 image_create_info.pNext = NULL;
7233 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7234 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7235 image_create_info.extent.width = 32;
7236 image_create_info.extent.height = 32;
7237 image_create_info.extent.depth = 1;
7238 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007239 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -07007240 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7241 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7242 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7243 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007244
Karl Schultz6addd812016-02-02 17:17:23 -07007245 err =
7246 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007247 ASSERT_VK_SUCCESS(err);
7248
Karl Schultz6addd812016-02-02 17:17:23 -07007249 err =
7250 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007251 ASSERT_VK_SUCCESS(err);
7252
7253 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007254 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007255 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7256 memAlloc.pNext = NULL;
7257 memAlloc.allocationSize = 0;
7258 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007259
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007260 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007261 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007262 pass =
7263 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007264 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007265 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007266 ASSERT_VK_SUCCESS(err);
7267
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007268 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007269 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007270 pass =
7271 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007272 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007273 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007274 ASSERT_VK_SUCCESS(err);
7275
7276 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7277 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007278 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007279 ASSERT_VK_SUCCESS(err);
7280
7281 BeginCommandBuffer();
7282 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007283 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007284 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007285 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007286 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -06007287 copyRegion.srcOffset.x = 0;
7288 copyRegion.srcOffset.y = 0;
7289 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007290 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007291 copyRegion.dstSubresource.mipLevel = 0;
7292 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007293 // Introduce failure by forcing the dst layerCount to differ from src
7294 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007295 copyRegion.dstOffset.x = 0;
7296 copyRegion.dstOffset.y = 0;
7297 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007298 copyRegion.extent.width = 1;
7299 copyRegion.extent.height = 1;
7300 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007301 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7302 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007303 EndCommandBuffer();
7304
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007305 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007306
Chia-I Wuf7458c52015-10-26 21:10:41 +08007307 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007308 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007309 vkFreeMemory(m_device->device(), srcMem, NULL);
7310 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007311}
7312
Karl Schultz6addd812016-02-02 17:17:23 -07007313TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -06007314 VkResult err;
7315 bool pass;
7316
7317 // Create color images with different format sizes and try to copy between them
7318 m_errorMonitor->SetDesiredFailureMsg(
7319 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7320 "vkCmdCopyImage called with unmatched source and dest image format sizes");
7321
7322 ASSERT_NO_FATAL_FAILURE(InitState());
7323
7324 // Create two images of different types and try to copy between them
7325 VkImage srcImage;
7326 VkImage dstImage;
7327 VkDeviceMemory srcMem;
7328 VkDeviceMemory destMem;
7329 VkMemoryRequirements memReqs;
7330
7331 VkImageCreateInfo image_create_info = {};
7332 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7333 image_create_info.pNext = NULL;
7334 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7335 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7336 image_create_info.extent.width = 32;
7337 image_create_info.extent.height = 32;
7338 image_create_info.extent.depth = 1;
7339 image_create_info.mipLevels = 1;
7340 image_create_info.arrayLayers = 1;
7341 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7342 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7343 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7344 image_create_info.flags = 0;
7345
7346 err =
7347 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
7348 ASSERT_VK_SUCCESS(err);
7349
7350 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7351 // Introduce failure by creating second image with a different-sized format.
7352 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
7353
7354 err =
7355 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
7356 ASSERT_VK_SUCCESS(err);
7357
7358 // Allocate memory
7359 VkMemoryAllocateInfo memAlloc = {};
7360 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7361 memAlloc.pNext = NULL;
7362 memAlloc.allocationSize = 0;
7363 memAlloc.memoryTypeIndex = 0;
7364
7365 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
7366 memAlloc.allocationSize = memReqs.size;
7367 pass =
7368 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7369 ASSERT_TRUE(pass);
7370 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
7371 ASSERT_VK_SUCCESS(err);
7372
7373 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
7374 memAlloc.allocationSize = memReqs.size;
7375 pass =
7376 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
7377 ASSERT_TRUE(pass);
7378 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
7379 ASSERT_VK_SUCCESS(err);
7380
7381 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7382 ASSERT_VK_SUCCESS(err);
7383 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
7384 ASSERT_VK_SUCCESS(err);
7385
7386 BeginCommandBuffer();
7387 VkImageCopy copyRegion;
7388 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7389 copyRegion.srcSubresource.mipLevel = 0;
7390 copyRegion.srcSubresource.baseArrayLayer = 0;
7391 copyRegion.srcSubresource.layerCount = 0;
7392 copyRegion.srcOffset.x = 0;
7393 copyRegion.srcOffset.y = 0;
7394 copyRegion.srcOffset.z = 0;
7395 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7396 copyRegion.dstSubresource.mipLevel = 0;
7397 copyRegion.dstSubresource.baseArrayLayer = 0;
7398 copyRegion.dstSubresource.layerCount = 0;
7399 copyRegion.dstOffset.x = 0;
7400 copyRegion.dstOffset.y = 0;
7401 copyRegion.dstOffset.z = 0;
7402 copyRegion.extent.width = 1;
7403 copyRegion.extent.height = 1;
7404 copyRegion.extent.depth = 1;
7405 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7406 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
7407 EndCommandBuffer();
7408
7409 m_errorMonitor->VerifyFound();
7410
7411 vkDestroyImage(m_device->device(), srcImage, NULL);
7412 vkDestroyImage(m_device->device(), dstImage, NULL);
7413 vkFreeMemory(m_device->device(), srcMem, NULL);
7414 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007415}
7416
Karl Schultz6addd812016-02-02 17:17:23 -07007417TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
7418 VkResult err;
7419 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007420
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007421 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007422 m_errorMonitor->SetDesiredFailureMsg(
7423 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007424 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007425
Mike Stroyana3082432015-09-25 13:39:21 -06007426 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007427
7428 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007429 VkImage srcImage;
7430 VkImage dstImage;
7431 VkDeviceMemory srcMem;
7432 VkDeviceMemory destMem;
7433 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007434
7435 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007436 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7437 image_create_info.pNext = NULL;
7438 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7439 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7440 image_create_info.extent.width = 32;
7441 image_create_info.extent.height = 32;
7442 image_create_info.extent.depth = 1;
7443 image_create_info.mipLevels = 1;
7444 image_create_info.arrayLayers = 1;
7445 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7446 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
7447 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7448 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007449
Karl Schultz6addd812016-02-02 17:17:23 -07007450 err =
7451 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007452 ASSERT_VK_SUCCESS(err);
7453
Karl Schultzbdb75952016-04-19 11:36:49 -06007454 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
7455
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007456 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -07007457 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -06007458 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
7459 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007460
Karl Schultz6addd812016-02-02 17:17:23 -07007461 err =
7462 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007463 ASSERT_VK_SUCCESS(err);
7464
7465 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007466 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007467 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7468 memAlloc.pNext = NULL;
7469 memAlloc.allocationSize = 0;
7470 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007471
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007472 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007473 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007474 pass =
7475 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007476 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007477 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007478 ASSERT_VK_SUCCESS(err);
7479
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007480 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007481 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007482 pass =
7483 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007484 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007485 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007486 ASSERT_VK_SUCCESS(err);
7487
7488 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7489 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007490 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007491 ASSERT_VK_SUCCESS(err);
7492
7493 BeginCommandBuffer();
7494 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007495 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007496 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007497 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007498 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007499 copyRegion.srcOffset.x = 0;
7500 copyRegion.srcOffset.y = 0;
7501 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007502 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007503 copyRegion.dstSubresource.mipLevel = 0;
7504 copyRegion.dstSubresource.baseArrayLayer = 0;
7505 copyRegion.dstSubresource.layerCount = 0;
7506 copyRegion.dstOffset.x = 0;
7507 copyRegion.dstOffset.y = 0;
7508 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007509 copyRegion.extent.width = 1;
7510 copyRegion.extent.height = 1;
7511 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007512 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7513 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007514 EndCommandBuffer();
7515
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007516 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007517
Chia-I Wuf7458c52015-10-26 21:10:41 +08007518 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007519 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007520 vkFreeMemory(m_device->device(), srcMem, NULL);
7521 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007522}
7523
Karl Schultz6addd812016-02-02 17:17:23 -07007524TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
7525 VkResult err;
7526 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007527
Karl Schultz6addd812016-02-02 17:17:23 -07007528 m_errorMonitor->SetDesiredFailureMsg(
7529 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007530 "vkCmdResolveImage called with source sample count less than 2.");
7531
Mike Stroyana3082432015-09-25 13:39:21 -06007532 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007533
7534 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07007535 VkImage srcImage;
7536 VkImage dstImage;
7537 VkDeviceMemory srcMem;
7538 VkDeviceMemory destMem;
7539 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007540
7541 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007542 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7543 image_create_info.pNext = NULL;
7544 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7545 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7546 image_create_info.extent.width = 32;
7547 image_create_info.extent.height = 1;
7548 image_create_info.extent.depth = 1;
7549 image_create_info.mipLevels = 1;
7550 image_create_info.arrayLayers = 1;
7551 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7552 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7553 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
7554 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007555
Karl Schultz6addd812016-02-02 17:17:23 -07007556 err =
7557 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007558 ASSERT_VK_SUCCESS(err);
7559
Karl Schultz6addd812016-02-02 17:17:23 -07007560 image_create_info.imageType = VK_IMAGE_TYPE_1D;
7561 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007562
Karl Schultz6addd812016-02-02 17:17:23 -07007563 err =
7564 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007565 ASSERT_VK_SUCCESS(err);
7566
7567 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007568 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007569 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7570 memAlloc.pNext = NULL;
7571 memAlloc.allocationSize = 0;
7572 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007573
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007574 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007575 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007576 pass =
7577 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007578 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007579 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007580 ASSERT_VK_SUCCESS(err);
7581
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007582 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007583 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007584 pass =
7585 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007586 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007587 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007588 ASSERT_VK_SUCCESS(err);
7589
7590 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7591 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007592 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007593 ASSERT_VK_SUCCESS(err);
7594
7595 BeginCommandBuffer();
7596 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07007597 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
7598 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06007599 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007600 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007601 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007602 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007603 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007604 resolveRegion.srcOffset.x = 0;
7605 resolveRegion.srcOffset.y = 0;
7606 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007607 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007608 resolveRegion.dstSubresource.mipLevel = 0;
7609 resolveRegion.dstSubresource.baseArrayLayer = 0;
7610 resolveRegion.dstSubresource.layerCount = 0;
7611 resolveRegion.dstOffset.x = 0;
7612 resolveRegion.dstOffset.y = 0;
7613 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007614 resolveRegion.extent.width = 1;
7615 resolveRegion.extent.height = 1;
7616 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007617 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7618 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007619 EndCommandBuffer();
7620
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007621 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007622
Chia-I Wuf7458c52015-10-26 21:10:41 +08007623 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007624 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007625 vkFreeMemory(m_device->device(), srcMem, NULL);
7626 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007627}
7628
Karl Schultz6addd812016-02-02 17:17:23 -07007629TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
7630 VkResult err;
7631 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007632
Karl Schultz6addd812016-02-02 17:17:23 -07007633 m_errorMonitor->SetDesiredFailureMsg(
7634 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007635 "vkCmdResolveImage called with dest sample count greater than 1.");
7636
Mike Stroyana3082432015-09-25 13:39:21 -06007637 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007638
7639 // Create two images of sample count 2 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -07007640 VkImage srcImage;
7641 VkImage dstImage;
7642 VkDeviceMemory srcMem;
7643 VkDeviceMemory destMem;
7644 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007645
7646 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007647 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7648 image_create_info.pNext = NULL;
7649 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7650 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7651 image_create_info.extent.width = 32;
7652 image_create_info.extent.height = 1;
7653 image_create_info.extent.depth = 1;
7654 image_create_info.mipLevels = 1;
7655 image_create_info.arrayLayers = 1;
7656 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
7657 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7658 // Note: Some implementations expect color attachment usage for any
7659 // multisample surface
7660 image_create_info.usage =
7661 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7662 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007663
Karl Schultz6addd812016-02-02 17:17:23 -07007664 err =
7665 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007666 ASSERT_VK_SUCCESS(err);
7667
Karl Schultz6addd812016-02-02 17:17:23 -07007668 image_create_info.imageType = VK_IMAGE_TYPE_1D;
7669 // Note: Some implementations expect color attachment usage for any
7670 // multisample surface
7671 image_create_info.usage =
7672 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007673
Karl Schultz6addd812016-02-02 17:17:23 -07007674 err =
7675 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007676 ASSERT_VK_SUCCESS(err);
7677
7678 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007679 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007680 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7681 memAlloc.pNext = NULL;
7682 memAlloc.allocationSize = 0;
7683 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007684
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007685 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007686 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007687 pass =
7688 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007689 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007690 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007691 ASSERT_VK_SUCCESS(err);
7692
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007693 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007694 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007695 pass =
7696 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007697 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007698 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007699 ASSERT_VK_SUCCESS(err);
7700
7701 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7702 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007703 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007704 ASSERT_VK_SUCCESS(err);
7705
7706 BeginCommandBuffer();
7707 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07007708 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
7709 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06007710 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007711 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007712 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007713 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007714 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007715 resolveRegion.srcOffset.x = 0;
7716 resolveRegion.srcOffset.y = 0;
7717 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007718 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007719 resolveRegion.dstSubresource.mipLevel = 0;
7720 resolveRegion.dstSubresource.baseArrayLayer = 0;
7721 resolveRegion.dstSubresource.layerCount = 0;
7722 resolveRegion.dstOffset.x = 0;
7723 resolveRegion.dstOffset.y = 0;
7724 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007725 resolveRegion.extent.width = 1;
7726 resolveRegion.extent.height = 1;
7727 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007728 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7729 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007730 EndCommandBuffer();
7731
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007732 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007733
Chia-I Wuf7458c52015-10-26 21:10:41 +08007734 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007735 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007736 vkFreeMemory(m_device->device(), srcMem, NULL);
7737 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007738}
7739
Karl Schultz6addd812016-02-02 17:17:23 -07007740TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
7741 VkResult err;
7742 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007743
Karl Schultz6addd812016-02-02 17:17:23 -07007744 m_errorMonitor->SetDesiredFailureMsg(
7745 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007746 "vkCmdResolveImage called with unmatched source and dest formats.");
7747
Mike Stroyana3082432015-09-25 13:39:21 -06007748 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007749
7750 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007751 VkImage srcImage;
7752 VkImage dstImage;
7753 VkDeviceMemory srcMem;
7754 VkDeviceMemory destMem;
7755 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007756
7757 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007758 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7759 image_create_info.pNext = NULL;
7760 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7761 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7762 image_create_info.extent.width = 32;
7763 image_create_info.extent.height = 1;
7764 image_create_info.extent.depth = 1;
7765 image_create_info.mipLevels = 1;
7766 image_create_info.arrayLayers = 1;
7767 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
7768 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7769 // Note: Some implementations expect color attachment usage for any
7770 // multisample surface
7771 image_create_info.usage =
7772 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7773 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007774
Karl Schultz6addd812016-02-02 17:17:23 -07007775 err =
7776 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007777 ASSERT_VK_SUCCESS(err);
7778
Karl Schultz6addd812016-02-02 17:17:23 -07007779 // Set format to something other than source image
7780 image_create_info.format = VK_FORMAT_R32_SFLOAT;
7781 // Note: Some implementations expect color attachment usage for any
7782 // multisample surface
7783 image_create_info.usage =
7784 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7785 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007786
Karl Schultz6addd812016-02-02 17:17:23 -07007787 err =
7788 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007789 ASSERT_VK_SUCCESS(err);
7790
7791 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007792 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007793 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7794 memAlloc.pNext = NULL;
7795 memAlloc.allocationSize = 0;
7796 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007797
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007798 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007799 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007800 pass =
7801 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007802 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007803 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007804 ASSERT_VK_SUCCESS(err);
7805
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007806 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007807 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007808 pass =
7809 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007810 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007811 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007812 ASSERT_VK_SUCCESS(err);
7813
7814 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7815 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007816 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007817 ASSERT_VK_SUCCESS(err);
7818
7819 BeginCommandBuffer();
7820 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07007821 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
7822 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06007823 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007824 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007825 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007826 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007827 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007828 resolveRegion.srcOffset.x = 0;
7829 resolveRegion.srcOffset.y = 0;
7830 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007831 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007832 resolveRegion.dstSubresource.mipLevel = 0;
7833 resolveRegion.dstSubresource.baseArrayLayer = 0;
7834 resolveRegion.dstSubresource.layerCount = 0;
7835 resolveRegion.dstOffset.x = 0;
7836 resolveRegion.dstOffset.y = 0;
7837 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007838 resolveRegion.extent.width = 1;
7839 resolveRegion.extent.height = 1;
7840 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007841 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7842 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007843 EndCommandBuffer();
7844
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007845 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007846
Chia-I Wuf7458c52015-10-26 21:10:41 +08007847 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007848 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007849 vkFreeMemory(m_device->device(), srcMem, NULL);
7850 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007851}
7852
Karl Schultz6addd812016-02-02 17:17:23 -07007853TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
7854 VkResult err;
7855 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -06007856
Karl Schultz6addd812016-02-02 17:17:23 -07007857 m_errorMonitor->SetDesiredFailureMsg(
7858 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007859 "vkCmdResolveImage called with unmatched source and dest image types.");
7860
Mike Stroyana3082432015-09-25 13:39:21 -06007861 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -06007862
7863 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -07007864 VkImage srcImage;
7865 VkImage dstImage;
7866 VkDeviceMemory srcMem;
7867 VkDeviceMemory destMem;
7868 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -06007869
7870 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007871 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7872 image_create_info.pNext = NULL;
7873 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7874 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
7875 image_create_info.extent.width = 32;
7876 image_create_info.extent.height = 1;
7877 image_create_info.extent.depth = 1;
7878 image_create_info.mipLevels = 1;
7879 image_create_info.arrayLayers = 1;
7880 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
7881 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7882 // Note: Some implementations expect color attachment usage for any
7883 // multisample surface
7884 image_create_info.usage =
7885 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7886 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007887
Karl Schultz6addd812016-02-02 17:17:23 -07007888 err =
7889 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007890 ASSERT_VK_SUCCESS(err);
7891
Karl Schultz6addd812016-02-02 17:17:23 -07007892 image_create_info.imageType = VK_IMAGE_TYPE_1D;
7893 // Note: Some implementations expect color attachment usage for any
7894 // multisample surface
7895 image_create_info.usage =
7896 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7897 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007898
Karl Schultz6addd812016-02-02 17:17:23 -07007899 err =
7900 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -06007901 ASSERT_VK_SUCCESS(err);
7902
7903 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007904 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007905 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7906 memAlloc.pNext = NULL;
7907 memAlloc.allocationSize = 0;
7908 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007909
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06007910 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007911 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007912 pass =
7913 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007914 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007915 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007916 ASSERT_VK_SUCCESS(err);
7917
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007918 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -06007919 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007920 pass =
7921 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06007922 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007923 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -06007924 ASSERT_VK_SUCCESS(err);
7925
7926 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
7927 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007928 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -06007929 ASSERT_VK_SUCCESS(err);
7930
7931 BeginCommandBuffer();
7932 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -07007933 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
7934 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -06007935 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007936 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -06007937 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06007938 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007939 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007940 resolveRegion.srcOffset.x = 0;
7941 resolveRegion.srcOffset.y = 0;
7942 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +08007943 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007944 resolveRegion.dstSubresource.mipLevel = 0;
7945 resolveRegion.dstSubresource.baseArrayLayer = 0;
7946 resolveRegion.dstSubresource.layerCount = 0;
7947 resolveRegion.dstOffset.x = 0;
7948 resolveRegion.dstOffset.y = 0;
7949 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -06007950 resolveRegion.extent.width = 1;
7951 resolveRegion.extent.height = 1;
7952 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007953 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
7954 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -06007955 EndCommandBuffer();
7956
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007957 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -06007958
Chia-I Wuf7458c52015-10-26 21:10:41 +08007959 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007960 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08007961 vkFreeMemory(m_device->device(), srcMem, NULL);
7962 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -06007963}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007964
Karl Schultz6addd812016-02-02 17:17:23 -07007965TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007966 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -07007967 // to using a DS format, then cause it to hit error due to COLOR_BIT not
7968 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007969 // The image format check comes 2nd in validation so we trigger it first,
7970 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -07007971 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007972
Karl Schultz6addd812016-02-02 17:17:23 -07007973 m_errorMonitor->SetDesiredFailureMsg(
7974 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007975 "Combination depth/stencil image formats can have only the ");
7976
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007977 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007978
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007979 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007980 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7981 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007982
7983 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007984 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7985 ds_pool_ci.pNext = NULL;
7986 ds_pool_ci.maxSets = 1;
7987 ds_pool_ci.poolSizeCount = 1;
7988 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007989
7990 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007991 err =
7992 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06007993 ASSERT_VK_SUCCESS(err);
7994
7995 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007996 dsl_binding.binding = 0;
7997 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7998 dsl_binding.descriptorCount = 1;
7999 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8000 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008001
8002 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008003 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8004 ds_layout_ci.pNext = NULL;
8005 ds_layout_ci.bindingCount = 1;
8006 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008007 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008008 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8009 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008010 ASSERT_VK_SUCCESS(err);
8011
8012 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008013 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008014 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008015 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008016 alloc_info.descriptorPool = ds_pool;
8017 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008018 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8019 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008020 ASSERT_VK_SUCCESS(err);
8021
Karl Schultz6addd812016-02-02 17:17:23 -07008022 VkImage image_bad;
8023 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008024 // One bad format and one good format for Color attachment
Karl Schultz6addd812016-02-02 17:17:23 -07008025 const VkFormat tex_format_bad = VK_FORMAT_D32_SFLOAT_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008026 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07008027 const int32_t tex_width = 32;
8028 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008029
8030 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008031 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8032 image_create_info.pNext = NULL;
8033 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8034 image_create_info.format = tex_format_bad;
8035 image_create_info.extent.width = tex_width;
8036 image_create_info.extent.height = tex_height;
8037 image_create_info.extent.depth = 1;
8038 image_create_info.mipLevels = 1;
8039 image_create_info.arrayLayers = 1;
8040 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8041 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8042 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
8043 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
8044 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008045
Karl Schultz6addd812016-02-02 17:17:23 -07008046 err =
8047 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008048 ASSERT_VK_SUCCESS(err);
8049 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -07008050 image_create_info.usage =
8051 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
8052 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
8053 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008054 ASSERT_VK_SUCCESS(err);
8055
8056 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008057 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8058 image_view_create_info.image = image_bad;
8059 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8060 image_view_create_info.format = tex_format_bad;
8061 image_view_create_info.subresourceRange.baseArrayLayer = 0;
8062 image_view_create_info.subresourceRange.baseMipLevel = 0;
8063 image_view_create_info.subresourceRange.layerCount = 1;
8064 image_view_create_info.subresourceRange.levelCount = 1;
8065 image_view_create_info.subresourceRange.aspectMask =
8066 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008067
8068 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008069 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8070 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008071
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008072 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008073
Chia-I Wuf7458c52015-10-26 21:10:41 +08008074 vkDestroyImage(m_device->device(), image_bad, NULL);
8075 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08008076 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8077 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06008078}
Tobin Ehliscde08892015-09-22 10:11:37 -06008079#endif // IMAGE_TESTS
8080
Tony Barbour300a6082015-04-07 13:44:53 -06008081int main(int argc, char **argv) {
8082 int result;
8083
Cody Northrop8e54a402016-03-08 22:25:52 -07008084#ifdef ANDROID
8085 int vulkanSupport = InitVulkan();
8086 if (vulkanSupport == 0)
8087 return 1;
8088#endif
8089
Tony Barbour300a6082015-04-07 13:44:53 -06008090 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -06008091 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -06008092
8093 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
8094
8095 result = RUN_ALL_TESTS();
8096
Tony Barbour6918cd52015-04-09 12:58:51 -06008097 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -06008098 return result;
8099}