blob: 21cfaf7d74853674f06d2f329a81bddc5609ef63 [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>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Karl Schultz6addd812016-02-02 17:17:23 -070021 */
Tony Barbour65c48b32015-11-17 10:02:56 -070022
Cody Northrop8e54a402016-03-08 22:25:52 -070023#ifdef ANDROID
24#include "vulkan_wrapper.h"
25#else
David Pinedo9316d3b2015-11-06 12:54:48 -070026#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070027#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060028
29#if defined(ANDROID) && defined(VALIDATION_APK)
30#include <android/log.h>
31#include <android_native_app_glue.h>
32#endif
33
Jon Ashburn7fa7e222016-02-02 12:08:10 -070034#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060035#include "test_common.h"
36#include "vk_layer_config.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060037#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060038#include "vkrenderframework.h"
39#include <limits.h>
40#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060041
Mark Lobodzinski3780e142015-05-14 15:08:13 -050042#define GLM_FORCE_RADIANS
43#include "glm/glm.hpp"
44#include <glm/gtc/matrix_transform.hpp>
45
Dustin Gravesffa90fa2016-05-06 11:20:38 -060046#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060047#define MEM_TRACKER_TESTS 1
48#define OBJ_TRACKER_TESTS 1
49#define DRAW_STATE_TESTS 1
50#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120051#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060052#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060053#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060054
Mark Lobodzinski3780e142015-05-14 15:08:13 -050055//--------------------------------------------------------------------------------------
56// Mesh and VertexFormat Data
57//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070058struct Vertex {
59 float posX, posY, posZ, posW; // Position data
60 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050061};
62
Karl Schultz6addd812016-02-02 17:17:23 -070063#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050064
65typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070066 BsoFailNone = 0x00000000,
67 BsoFailLineWidth = 0x00000001,
68 BsoFailDepthBias = 0x00000002,
69 BsoFailViewport = 0x00000004,
70 BsoFailScissor = 0x00000008,
71 BsoFailBlend = 0x00000010,
72 BsoFailDepthBounds = 0x00000020,
73 BsoFailStencilReadMask = 0x00000040,
74 BsoFailStencilWriteMask = 0x00000080,
75 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060076 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060077 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050078} BsoFailSelect;
79
80struct vktriangle_vs_uniform {
81 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070082 float mvp[4][4];
83 float position[3][4];
84 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050085};
86
Mark Lobodzinskice751c62016-09-08 10:45:35 -060087static const char bindStateVertShaderText[] = "#version 450\n"
88 "vec2 vertices[3];\n"
89 "out gl_PerVertex {\n"
90 " vec4 gl_Position;\n"
91 "};\n"
92 "void main() {\n"
93 " vertices[0] = vec2(-1.0, -1.0);\n"
94 " vertices[1] = vec2( 1.0, -1.0);\n"
95 " vertices[2] = vec2( 0.0, 1.0);\n"
96 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
97 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050098
Mark Lobodzinskice751c62016-09-08 10:45:35 -060099static const char bindStateFragShaderText[] = "#version 450\n"
100 "\n"
101 "layout(location = 0) out vec4 uFragColor;\n"
102 "void main(){\n"
103 " uFragColor = vec4(0,1,0,1);\n"
104 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500105
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600106static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
107 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
108 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600109
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600110// ErrorMonitor Usage:
111//
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600112// Call SetDesiredFailureMsg with: a string to be compared against all
113// encountered log messages, or a validation error enum identifying
114// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
115// will match all log messages. logMsg will return true for skipCall
116// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600117//
118// Call DesiredMsgFound to determine if the desired failure message
119// was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600120class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700121 public:
122 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600123 test_platform_thread_create_mutex(&m_mutex);
124 test_platform_thread_lock_mutex(&m_mutex);
Chris Forbes17756132016-09-16 14:36:39 +1200125 m_msgFlags = VK_DEBUG_REPORT_ERROR_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700126 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600127 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600128 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129
Dustin Graves48458142016-04-29 16:11:55 -0600130 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
131
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600132 // ErrorMonitor will look for an error message containing the specified string
Karl Schultz6addd812016-02-02 17:17:23 -0700133 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600134 // Also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600135 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600136 m_failure_message_strings.clear();
137 // If we are looking for a matching string, ignore any IDs
138 m_desired_message_ids.clear();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600139 m_otherMsgs.clear();
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600140 m_desired_message_strings.insert(msgString);
Karl Schultz6addd812016-02-02 17:17:23 -0700141 m_msgFound = VK_FALSE;
142 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600143 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600144 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600146 // ErrorMonitor will look for a message ID matching the specified one
147 void SetDesiredFailureMsg(VkFlags msgFlags, UNIQUE_VALIDATION_ERROR_CODE msg_id) {
148 // Also discard all collected messages to this point
149 test_platform_thread_lock_mutex(&m_mutex);
150 m_failure_message_strings.clear();
151 // If we are looking for IDs don't look for strings
152 m_desired_message_strings.clear();
153 m_otherMsgs.clear();
154 m_desired_message_ids.insert(msg_id);
155 m_msgFound = VK_FALSE;
156 m_msgFlags = msgFlags;
157 test_platform_thread_unlock_mutex(&m_mutex);
158 }
159
160 VkBool32 CheckForDesiredMsg(uint32_t message_code, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600162 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600163 if (m_bailout != NULL) {
164 *m_bailout = true;
165 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600166 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600167 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600168
169 for (auto desired_msg : m_desired_message_strings) {
Karl Schultz05cc4e32016-10-12 13:25:23 -0600170 if (desired_msg.length() == 0) {
171 // An empty desired_msg string "" indicates a positive test - not expecting an error.
172 // Return true to avoid calling layers/driver with this error.
173 // And don't erase the "" string, so it remains if another error is found.
174 result = VK_TRUE;
Tony Barbourae58dba2016-12-13 16:30:36 -0700175 found_expected = true;
176 m_msgFound = VK_TRUE;
177 m_failure_message_strings.insert(errorString);
Karl Schultz05cc4e32016-10-12 13:25:23 -0600178 } else if (errorString.find(desired_msg) != string::npos) {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600179 found_expected = true;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600180 m_failure_message_strings.insert(errorString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600181 m_msgFound = VK_TRUE;
182 result = VK_TRUE;
183 // We only want one match for each expected error so remove from set here
184 // Since we're about the break the loop it's ok to remove from set we're iterating over
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600185 m_desired_message_strings.erase(desired_msg);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600186 break;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600187 }
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600188 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600189 for (auto desired_id : m_desired_message_ids) {
190 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
191 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
192 // Return true to avoid calling layers/driver with this error.
193 result = VK_TRUE;
194 } else if (desired_id == message_code) {
195 // Double-check that the string matches the error enum
196 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
197 found_expected = true;
198 result = VK_TRUE;
199 m_msgFound = VK_TRUE;
200 m_desired_message_ids.erase(desired_id);
201 break;
202 } else {
203 // Treat this message as a regular unexpected error, but print a warning jic
204 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
205 errorString.c_str(), desired_id, validation_error_map[desired_id]);
206 }
207 }
208 }
209
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600210 if (!found_expected) {
Chris Forbes5b9442b2016-09-13 16:49:57 +1200211 printf("Unexpected: %s\n", msgString);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600212 m_otherMsgs.push_back(errorString);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600213 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600214 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600215 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600216 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600217
Karl Schultz6addd812016-02-02 17:17:23 -0700218 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600219
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600220 VkDebugReportFlagsEXT GetMessageFlags(void) { return m_msgFlags; }
221
Karl Schultz6addd812016-02-02 17:17:23 -0700222 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600223
Karl Schultz6addd812016-02-02 17:17:23 -0700224 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600225
Karl Schultz6addd812016-02-02 17:17:23 -0700226 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600227 vector<string> otherMsgs = GetOtherFailureMsgs();
Tony Barbour59b42282016-11-03 13:31:28 -0600228 if (otherMsgs.size()) {
229 cout << "Other error messages logged for this test were:" << endl;
230 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
231 cout << " " << *iter << endl;
232 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600233 }
234 }
235
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600236 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200237
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600238 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
239 void ExpectSuccess(VkDebugReportFlagsEXT message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
240 m_msgFlags = message_flag_mask;
241 // Match ANY message matching specified type
242 SetDesiredFailureMsg(message_flag_mask, "");
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200243 }
244
245 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600246 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200247 if (!DesiredMsgFound()) {
248 DumpFailureMsgs();
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600249 for (auto desired_msg : m_desired_message_strings) {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600250 FAIL() << "Did not receive expected error '" << desired_msg << "'";
251 }
Tony Barbour59b42282016-11-03 13:31:28 -0600252 for (auto desired_id : m_desired_message_ids) {
253 FAIL() << "Did not receive expected error '" << desired_id << "'";
254 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200255 }
256 }
257
258 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600259 // ExpectSuccess() configured us to match anything. Any error is a failure.
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200260 if (DesiredMsgFound()) {
261 DumpFailureMsgs();
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600262 for (auto msg : m_failure_message_strings) {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600263 FAIL() << "Expected to succeed but got error: " << msg;
264 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200265 }
266 }
267
Karl Schultz6addd812016-02-02 17:17:23 -0700268 private:
269 VkFlags m_msgFlags;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600270 std::unordered_set<uint32_t>m_desired_message_ids;
271 std::unordered_set<string> m_desired_message_strings;
272 std::unordered_set<string> m_failure_message_strings;
Karl Schultz6addd812016-02-02 17:17:23 -0700273 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600274 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700275 bool *m_bailout;
276 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600277};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500278
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600279static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
280 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
281 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600282 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
283 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600284 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600285 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600286 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600287}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500288
Karl Schultz6addd812016-02-02 17:17:23 -0700289class VkLayerTest : public VkRenderFramework {
290 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800291 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
292 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600293 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
294 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700295 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600296 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
297 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700298 }
Tony Barbour300a6082015-04-07 13:44:53 -0600299
Tony Barbourfe3351b2015-07-28 10:17:20 -0600300 /* Convenience functions that use built-in command buffer */
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600301 VkResult BeginCommandBuffer() { return BeginCommandBuffer(*m_commandBuffer); }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800302 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600303 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
304 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700305 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600306 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700307 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600308 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700309 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600310 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
311 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
312 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700313 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
314 }
315 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
316 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
317 }
318
319 protected:
320 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600321 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600322
323 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600324 std::vector<const char *> instance_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600325 std::vector<const char *> instance_extension_names;
326 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600327
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700328 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600329 /*
330 * Since CreateDbgMsgCallback is an instance level extension call
331 * any extension / layer that utilizes that feature also needs
332 * to be enabled at create instance time.
333 */
Karl Schultz6addd812016-02-02 17:17:23 -0700334 // Use Threading layer first to protect others from
335 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700336 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600337 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800338 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700339 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800340 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600341 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700342 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600343
Ian Elliott2c1daf52016-05-12 09:41:46 -0600344 if (m_enableWSI) {
345 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
346 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
347#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
348#if defined(VK_USE_PLATFORM_ANDROID_KHR)
349 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
350#endif // VK_USE_PLATFORM_ANDROID_KHR
351#if defined(VK_USE_PLATFORM_MIR_KHR)
352 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
353#endif // VK_USE_PLATFORM_MIR_KHR
354#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
355 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
356#endif // VK_USE_PLATFORM_WAYLAND_KHR
357#if defined(VK_USE_PLATFORM_WIN32_KHR)
358 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
359#endif // VK_USE_PLATFORM_WIN32_KHR
360#endif // NEED_TO_TEST_THIS_ON_PLATFORM
361#if defined(VK_USE_PLATFORM_XCB_KHR)
362 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
363#elif defined(VK_USE_PLATFORM_XLIB_KHR)
364 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
365#endif // VK_USE_PLATFORM_XLIB_KHR
366 }
367
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600368 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600369 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800370 this->app_info.pApplicationName = "layer_tests";
371 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600372 this->app_info.pEngineName = "unittest";
373 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600374 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600375
Tony Barbour15524c32015-04-29 17:34:29 -0600376 m_errorMonitor = new ErrorMonitor;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600377 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600378 }
379
380 virtual void TearDown() {
381 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600382 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600383 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600384 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600385
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600386 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600387};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500388
Karl Schultz6addd812016-02-02 17:17:23 -0700389VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600390 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600391
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800392 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600393
394 /*
395 * For render test all drawing happens in a single render pass
396 * on a single command buffer.
397 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200398 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800399 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600400 }
401
402 return result;
403}
404
Karl Schultz6addd812016-02-02 17:17:23 -0700405VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600406 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600407
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200408 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800409 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200410 }
Tony Barbour300a6082015-04-07 13:44:53 -0600411
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800412 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600413
414 return result;
415}
416
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600417void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500418 // Create identity matrix
419 int i;
420 struct vktriangle_vs_uniform data;
421
422 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700423 glm::mat4 View = glm::mat4(1.0f);
424 glm::mat4 Model = glm::mat4(1.0f);
425 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500426 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700427 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500428
429 memcpy(&data.mvp, &MVP[0][0], matrixSize);
430
Karl Schultz6addd812016-02-02 17:17:23 -0700431 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600432 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500433 };
434
Karl Schultz6addd812016-02-02 17:17:23 -0700435 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500436 data.position[i][0] = tri_data[i].posX;
437 data.position[i][1] = tri_data[i].posY;
438 data.position[i][2] = tri_data[i].posZ;
439 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700440 data.color[i][0] = tri_data[i].r;
441 data.color[i][1] = tri_data[i].g;
442 data.color[i][2] = tri_data[i].b;
443 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500444 }
445
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500446 ASSERT_NO_FATAL_FAILURE(InitViewport());
447
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200448 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
449 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500450
Karl Schultz6addd812016-02-02 17:17:23 -0700451 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600452 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453
454 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800455 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456 pipelineobj.AddShader(&vs);
457 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600458 if (failMask & BsoFailLineWidth) {
459 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600460 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600461 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600462 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
463 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600464 }
465 if (failMask & BsoFailDepthBias) {
466 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600467 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600468 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600469 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600470 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600471 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600472 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700473 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700474 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600475 if (failMask & BsoFailViewport) {
476 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
477 }
478 if (failMask & BsoFailScissor) {
479 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
480 }
481 if (failMask & BsoFailBlend) {
482 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600483 VkPipelineColorBlendAttachmentState att_state = {};
484 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
485 att_state.blendEnable = VK_TRUE;
486 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600487 }
488 if (failMask & BsoFailDepthBounds) {
489 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
490 }
491 if (failMask & BsoFailStencilReadMask) {
492 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
493 }
494 if (failMask & BsoFailStencilWriteMask) {
495 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
496 }
497 if (failMask & BsoFailStencilReference) {
498 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
499 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500500
501 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600502 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500503
504 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600505 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500506
Tony Barbourfe3351b2015-07-28 10:17:20 -0600507 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500508
509 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600510 if (failMask & BsoFailIndexBuffer) {
511 // Use DrawIndexed w/o an index buffer bound
512 DrawIndexed(3, 1, 0, 0, 0);
513 } else {
514 Draw(3, 1, 0, 0);
515 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500516
Mark Muellerd4914412016-06-13 17:52:06 -0600517 if (failMask & BsoFailCmdClearAttachments) {
518 VkClearAttachment color_attachment = {};
519 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
520 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
521 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
522
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600523 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600524 }
525
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500526 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600527 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500528
Tony Barbourfe3351b2015-07-28 10:17:20 -0600529 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500530}
531
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600532void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
533 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600535 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500536 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600537 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500538 }
539
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800540 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700541 // Make sure depthWriteEnable is set so that Depth fail test will work
542 // correctly
543 // Make sure stencilTestEnable is set so that Stencil fail test will work
544 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600545 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800546 stencil.failOp = VK_STENCIL_OP_KEEP;
547 stencil.passOp = VK_STENCIL_OP_KEEP;
548 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
549 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600550
551 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
552 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600553 ds_ci.pNext = NULL;
554 ds_ci.depthTestEnable = VK_FALSE;
555 ds_ci.depthWriteEnable = VK_TRUE;
556 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
557 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600558 if (failMask & BsoFailDepthBounds) {
559 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600560 ds_ci.maxDepthBounds = 0.0f;
561 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600562 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600563 ds_ci.stencilTestEnable = VK_TRUE;
564 ds_ci.front = stencil;
565 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600566
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600567 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600568 pipelineobj.SetViewport(m_viewports);
569 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800570 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600571 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600572 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800573 commandBuffer->BindPipeline(pipelineobj);
574 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500575}
576
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600577class VkPositiveLayerTest : public VkLayerTest {
578 public:
579 protected:
580};
581
Ian Elliott2c1daf52016-05-12 09:41:46 -0600582class VkWsiEnabledLayerTest : public VkLayerTest {
583 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600584 protected:
585 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600586};
587
Mark Muellerdfe37552016-07-07 14:47:42 -0600588class VkBufferTest {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600589 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600590 enum eTestEnFlags {
591 eDoubleDelete,
592 eInvalidDeviceOffset,
593 eInvalidMemoryOffset,
594 eBindNullBuffer,
595 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600596 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600597 };
598
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600599 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600600
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600601 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
602 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600603 return true;
604 }
605 VkDeviceSize offset_limit = 0;
606 if (eInvalidMemoryOffset == aTestFlag) {
607 VkBuffer vulkanBuffer;
608 VkBufferCreateInfo buffer_create_info = {};
609 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
610 buffer_create_info.size = 32;
611 buffer_create_info.usage = aBufferUsage;
612
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600613 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600614 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600615
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600616 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600617 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
618 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600619 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
620 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600621 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600622 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600623 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600624 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600625 }
626 if (eOffsetAlignment < offset_limit) {
627 return true;
628 }
629 return false;
630 }
631
632 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
634 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600635
636 if (eBindNullBuffer == aTestFlag) {
637 VulkanMemory = 0;
638 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
639 } else {
640 VkBufferCreateInfo buffer_create_info = {};
641 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
642 buffer_create_info.size = 32;
643 buffer_create_info.usage = aBufferUsage;
644
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600646
647 CreateCurrent = true;
648
649 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600650 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600651
652 VkMemoryAllocateInfo memory_allocate_info = {};
653 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
654 memory_allocate_info.allocationSize = memory_requirements.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600655 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
656 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600657 if (!pass) {
658 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
659 return;
660 }
661
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600662 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600663 AllocateCurrent = true;
664 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
666 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 BoundCurrent = true;
668
669 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
670 }
671 }
672
673 ~VkBufferTest() {
674 if (CreateCurrent) {
675 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
676 }
677 if (AllocateCurrent) {
678 if (InvalidDeleteEn) {
679 union {
680 VkDeviceMemory device_memory;
681 unsigned long long index_access;
682 } bad_index;
683
684 bad_index.device_memory = VulkanMemory;
685 bad_index.index_access++;
686
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600687 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 }
689 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
690 }
691 }
692
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600693 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600694
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600695 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600696
697 void TestDoubleDestroy() {
698 // Destroy the buffer but leave the flag set, which will cause
699 // the buffer to be destroyed again in the destructor.
700 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
701 }
702
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600703 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600704 bool AllocateCurrent;
705 bool BoundCurrent;
706 bool CreateCurrent;
707 bool InvalidDeleteEn;
708
709 VkBuffer VulkanBuffer;
710 VkDevice VulkanDevice;
711 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600712};
713
714class VkVerticesObj {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600715 public:
716 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600717 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 : BoundCurrent(false), AttributeCount(aAttributeCount), BindingCount(aBindingCount), BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600719 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600720 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
721 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600722 BindIdGenerator++; // NB: This can wrap w/misuse
723
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600724 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
725 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600726
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600727 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
728 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
729 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
730 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
731 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600732
733 unsigned i = 0;
734 do {
735 VertexInputAttributeDescription[i].binding = BindId;
736 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600737 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
738 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600739 i++;
740 } while (AttributeCount < i);
741
742 i = 0;
743 do {
744 VertexInputBindingDescription[i].binding = BindId;
745 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600746 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600747 i++;
748 } while (BindingCount < i);
749 }
750
751 ~VkVerticesObj() {
752 if (VertexInputAttributeDescription) {
753 delete[] VertexInputAttributeDescription;
754 }
755 if (VertexInputBindingDescription) {
756 delete[] VertexInputBindingDescription;
757 }
758 }
759
760 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600761 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
762 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600763 return true;
764 }
765
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600766 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600767 VkDeviceSize *offsetList;
768 unsigned offsetCount;
769
770 if (aOffsetCount) {
771 offsetList = aOffsetList;
772 offsetCount = aOffsetCount;
773 } else {
774 offsetList = new VkDeviceSize[1]();
775 offsetCount = 1;
776 }
777
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600778 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600779 BoundCurrent = true;
780
781 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600782 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600783 }
784 }
785
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600786 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600787 static uint32_t BindIdGenerator;
788
789 bool BoundCurrent;
790 unsigned AttributeCount;
791 unsigned BindingCount;
792 uint32_t BindId;
793
794 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
795 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
796 VkVertexInputBindingDescription *VertexInputBindingDescription;
797 VkConstantBufferObj VulkanMemoryBuffer;
798};
799
800uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500801// ********************************************************************************************************************
802// ********************************************************************************************************************
803// ********************************************************************************************************************
804// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600805#if PARAMETER_VALIDATION_TESTS
806TEST_F(VkLayerTest, RequiredParameter) {
807 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
808 "pointer, array, and array count parameters");
809
810 ASSERT_NO_FATAL_FAILURE(InitState());
811
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600813 // Specify NULL for a pointer to a handle
814 // Expected to trigger an error with
815 // parameter_validation::validate_required_pointer
816 vkGetPhysicalDeviceFeatures(gpu(), NULL);
817 m_errorMonitor->VerifyFound();
818
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
820 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600821 // Specify NULL for pointer to array count
822 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600823 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600824 m_errorMonitor->VerifyFound();
825
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600827 // Specify 0 for a required array count
828 // Expected to trigger an error with parameter_validation::validate_array
829 VkViewport view_port = {};
830 m_commandBuffer->SetViewport(0, 0, &view_port);
831 m_errorMonitor->VerifyFound();
832
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600834 // Specify NULL for a required array
835 // Expected to trigger an error with parameter_validation::validate_array
836 m_commandBuffer->SetViewport(0, 1, NULL);
837 m_errorMonitor->VerifyFound();
838
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600840 // Specify VK_NULL_HANDLE for a required handle
841 // Expected to trigger an error with
842 // parameter_validation::validate_required_handle
843 vkUnmapMemory(device(), VK_NULL_HANDLE);
844 m_errorMonitor->VerifyFound();
845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
847 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600848 // Specify VK_NULL_HANDLE for a required handle array entry
849 // Expected to trigger an error with
850 // parameter_validation::validate_required_handle_array
851 VkFence fence = VK_NULL_HANDLE;
852 vkResetFences(device(), 1, &fence);
853 m_errorMonitor->VerifyFound();
854
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600856 // Specify NULL for a required struct pointer
857 // Expected to trigger an error with
858 // parameter_validation::validate_struct_type
859 VkDeviceMemory memory = VK_NULL_HANDLE;
860 vkAllocateMemory(device(), NULL, NULL, &memory);
861 m_errorMonitor->VerifyFound();
862
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600864 // Specify 0 for a required VkFlags parameter
865 // Expected to trigger an error with parameter_validation::validate_flags
866 m_commandBuffer->SetStencilReference(0, 0);
867 m_errorMonitor->VerifyFound();
868
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600870 // Specify 0 for a required VkFlags array entry
871 // Expected to trigger an error with
872 // parameter_validation::validate_flags_array
873 VkSemaphore semaphore = VK_NULL_HANDLE;
874 VkPipelineStageFlags stageFlags = 0;
875 VkSubmitInfo submitInfo = {};
876 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
877 submitInfo.waitSemaphoreCount = 1;
878 submitInfo.pWaitSemaphores = &semaphore;
879 submitInfo.pWaitDstStageMask = &stageFlags;
880 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
881 m_errorMonitor->VerifyFound();
882}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600883
Dustin Gravesfce74c02016-05-10 11:42:58 -0600884TEST_F(VkLayerTest, ReservedParameter) {
885 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
886
887 ASSERT_NO_FATAL_FAILURE(InitState());
888
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600890 // Specify 0 for a reserved VkFlags parameter
891 // Expected to trigger an error with
892 // parameter_validation::validate_reserved_flags
893 VkEvent event_handle = VK_NULL_HANDLE;
894 VkEventCreateInfo event_info = {};
895 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
896 event_info.flags = 1;
897 vkCreateEvent(device(), &event_info, NULL, &event_handle);
898 m_errorMonitor->VerifyFound();
899}
900
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600901TEST_F(VkLayerTest, InvalidStructSType) {
902 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
903 "structure's sType field");
904
905 ASSERT_NO_FATAL_FAILURE(InitState());
906
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600908 // Zero struct memory, effectively setting sType to
909 // VK_STRUCTURE_TYPE_APPLICATION_INFO
910 // Expected to trigger an error with
911 // parameter_validation::validate_struct_type
912 VkMemoryAllocateInfo alloc_info = {};
913 VkDeviceMemory memory = VK_NULL_HANDLE;
914 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
915 m_errorMonitor->VerifyFound();
916
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600918 // Zero struct memory, effectively setting sType to
919 // VK_STRUCTURE_TYPE_APPLICATION_INFO
920 // Expected to trigger an error with
921 // parameter_validation::validate_struct_type_array
922 VkSubmitInfo submit_info = {};
923 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
924 m_errorMonitor->VerifyFound();
925}
926
927TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600928 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600929
930 ASSERT_NO_FATAL_FAILURE(InitState());
931
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600933 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600934 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600935 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600936 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600937 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600938 // Zero-initialization will provide the correct sType
939 VkApplicationInfo app_info = {};
940 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
941 event_alloc_info.pNext = &app_info;
942 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
943 m_errorMonitor->VerifyFound();
944
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
946 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600947 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
948 // a function that has allowed pNext structure types and specify
949 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600950 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600951 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600952 VkMemoryAllocateInfo memory_alloc_info = {};
953 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
954 memory_alloc_info.pNext = &app_info;
955 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600956 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600957}
Dustin Graves5d33d532016-05-09 16:21:12 -0600958
959TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600960 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600961
962 ASSERT_NO_FATAL_FAILURE(InitState());
963
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not fall within the begin..end "
965 "range of the core VkFormat "
966 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600967 // Specify an invalid VkFormat value
968 // Expected to trigger an error with
969 // parameter_validation::validate_ranged_enum
970 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600971 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600972 m_errorMonitor->VerifyFound();
973
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -0600975 // Specify an invalid VkFlags bitmask value
976 // Expected to trigger an error with parameter_validation::validate_flags
977 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600978 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
979 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600980 m_errorMonitor->VerifyFound();
981
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -0600983 // Specify an invalid VkFlags array entry
984 // Expected to trigger an error with
985 // parameter_validation::validate_flags_array
986 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600987 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -0600988 VkSubmitInfo submit_info = {};
989 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
990 submit_info.waitSemaphoreCount = 1;
991 submit_info.pWaitSemaphores = &semaphore;
992 submit_info.pWaitDstStageMask = &stage_flags;
993 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
994 m_errorMonitor->VerifyFound();
995
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -0600997 // Specify an invalid VkBool32 value
998 // Expected to trigger a warning with
999 // parameter_validation::validate_bool32
1000 VkSampler sampler = VK_NULL_HANDLE;
1001 VkSamplerCreateInfo sampler_info = {};
1002 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1003 sampler_info.pNext = NULL;
1004 sampler_info.magFilter = VK_FILTER_NEAREST;
1005 sampler_info.minFilter = VK_FILTER_NEAREST;
1006 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1007 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1008 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1009 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1010 sampler_info.mipLodBias = 1.0;
1011 sampler_info.maxAnisotropy = 1;
1012 sampler_info.compareEnable = VK_FALSE;
1013 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1014 sampler_info.minLod = 1.0;
1015 sampler_info.maxLod = 1.0;
1016 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1017 sampler_info.unnormalizedCoordinates = VK_FALSE;
1018 // Not VK_TRUE or VK_FALSE
1019 sampler_info.anisotropyEnable = 3;
1020 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1021 m_errorMonitor->VerifyFound();
1022}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001023
1024TEST_F(VkLayerTest, FailedReturnValue) {
1025 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1026
1027 ASSERT_NO_FATAL_FAILURE(InitState());
1028
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001029 // Find an unsupported image format
1030 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1031 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1032 VkFormat format = static_cast<VkFormat>(f);
1033 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001034 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001035 unsupported = format;
1036 break;
1037 }
1038 }
1039
1040 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1042 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001043 // Specify an unsupported VkFormat value to generate a
1044 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1045 // Expected to trigger a warning from
1046 // parameter_validation::validate_result
1047 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001048 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1049 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001050 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1051 m_errorMonitor->VerifyFound();
1052 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001053}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001054
1055TEST_F(VkLayerTest, UpdateBufferAlignment) {
1056 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001057 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001058
1059 ASSERT_NO_FATAL_FAILURE(InitState());
1060
1061 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1062 vk_testing::Buffer buffer;
1063 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1064
1065 BeginCommandBuffer();
1066 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001068 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1069 m_errorMonitor->VerifyFound();
1070
1071 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001073 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1074 m_errorMonitor->VerifyFound();
1075
1076 // Introduce failure by using dataSize that is < 0
1077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001078 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001079 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1080 m_errorMonitor->VerifyFound();
1081
1082 // Introduce failure by using dataSize that is > 65536
1083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001084 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001085 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1086 m_errorMonitor->VerifyFound();
1087
1088 EndCommandBuffer();
1089}
1090
1091TEST_F(VkLayerTest, FillBufferAlignment) {
1092 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1093
1094 ASSERT_NO_FATAL_FAILURE(InitState());
1095
1096 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1097 vk_testing::Buffer buffer;
1098 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1099
1100 BeginCommandBuffer();
1101
1102 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001104 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1105 m_errorMonitor->VerifyFound();
1106
1107 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001114 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1115 m_errorMonitor->VerifyFound();
1116
1117 EndCommandBuffer();
1118}
Dustin Graves40f35822016-06-23 11:12:53 -06001119
Cortd889ff92016-07-27 09:51:27 -07001120TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1121 VkResult err;
1122
1123 TEST_DESCRIPTION("Attempt to use a non-solid polygon fill mode in a "
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001124 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001125
1126 ASSERT_NO_FATAL_FAILURE(InitState());
1127 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1128
1129 std::vector<const char *> device_extension_names;
1130 auto features = m_device->phy().features();
1131 // Artificially disable support for non-solid fill modes
1132 features.fillModeNonSolid = false;
1133 // The sacrificial device object
1134 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1135
1136 VkRenderpassObj render_pass(&test_device);
1137
1138 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1139 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1140 pipeline_layout_ci.setLayoutCount = 0;
1141 pipeline_layout_ci.pSetLayouts = NULL;
1142
1143 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001144 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001145 ASSERT_VK_SUCCESS(err);
1146
1147 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1148 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1149 rs_ci.pNext = nullptr;
1150 rs_ci.lineWidth = 1.0f;
1151 rs_ci.rasterizerDiscardEnable = true;
1152
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001153 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1154 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001155
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001156 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001157 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1158 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001159 {
1160 VkPipelineObj pipe(&test_device);
1161 pipe.AddShader(&vs);
1162 pipe.AddShader(&fs);
1163 pipe.AddColorAttachment();
1164 // Introduce failure by setting unsupported polygon mode
1165 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1166 pipe.SetRasterization(&rs_ci);
1167 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1168 }
1169 m_errorMonitor->VerifyFound();
1170
1171 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1173 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001174 {
1175 VkPipelineObj pipe(&test_device);
1176 pipe.AddShader(&vs);
1177 pipe.AddShader(&fs);
1178 pipe.AddColorAttachment();
1179 // Introduce failure by setting unsupported polygon mode
1180 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1181 pipe.SetRasterization(&rs_ci);
1182 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1183 }
1184 m_errorMonitor->VerifyFound();
1185
Cortd889ff92016-07-27 09:51:27 -07001186 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1187}
1188
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001189#endif // PARAMETER_VALIDATION_TESTS
1190
Tobin Ehlis0788f522015-05-26 16:11:58 -06001191#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001192#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001193TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001194{
1195 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001196 VkFenceCreateInfo fenceInfo = {};
1197 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1198 fenceInfo.pNext = NULL;
1199 fenceInfo.flags = 0;
1200
Mike Weiblencce7ec72016-10-17 19:33:05 -06001201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001202
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001203 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001204
1205 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1206 vk_testing::Buffer buffer;
1207 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001208
Tony Barbourfe3351b2015-07-28 10:17:20 -06001209 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001210 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001211 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001212
1213 testFence.init(*m_device, fenceInfo);
1214
1215 // Bypass framework since it does the waits automatically
1216 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001217 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001218 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1219 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001220 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001221 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001222 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001223 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001224 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001225 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001226 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001227
1228 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001229 ASSERT_VK_SUCCESS( err );
1230
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001231 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001232 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001233
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001234 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001235}
1236
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001237TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001238{
1239 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001240 VkFenceCreateInfo fenceInfo = {};
1241 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1242 fenceInfo.pNext = NULL;
1243 fenceInfo.flags = 0;
1244
Mike Weiblencce7ec72016-10-17 19:33:05 -06001245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001246
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001247 ASSERT_NO_FATAL_FAILURE(InitState());
1248 ASSERT_NO_FATAL_FAILURE(InitViewport());
1249 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1250
Tony Barbourfe3351b2015-07-28 10:17:20 -06001251 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001252 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001253 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001254
1255 testFence.init(*m_device, fenceInfo);
1256
1257 // Bypass framework since it does the waits automatically
1258 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001259 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001260 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1261 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001262 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001263 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001264 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001265 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001266 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001267 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001268 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001269
1270 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001271 ASSERT_VK_SUCCESS( err );
1272
Jon Ashburnf19916e2016-01-11 13:12:43 -07001273 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001274 VkCommandBufferBeginInfo info = {};
1275 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1276 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001277 info.renderPass = VK_NULL_HANDLE;
1278 info.subpass = 0;
1279 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001280 info.occlusionQueryEnable = VK_FALSE;
1281 info.queryFlags = 0;
1282 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001283
1284 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001285 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001286
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001287 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001288}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001289#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001290
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001291TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1292 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1293
1294 ASSERT_NO_FATAL_FAILURE(InitState());
1295
1296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1297 VkBuffer buffer;
1298 VkBufferCreateInfo buf_info = {};
1299 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1300 buf_info.pNext = NULL;
1301 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1302 buf_info.size = 2048;
1303 buf_info.queueFamilyIndexCount = 0;
1304 buf_info.pQueueFamilyIndices = NULL;
1305 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1306 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1307 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1308 m_errorMonitor->VerifyFound();
1309
1310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1311 VkImage image;
1312 VkImageCreateInfo image_create_info = {};
1313 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1314 image_create_info.pNext = NULL;
1315 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1316 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1317 image_create_info.extent.width = 512;
1318 image_create_info.extent.height = 64;
1319 image_create_info.extent.depth = 1;
1320 image_create_info.mipLevels = 1;
1321 image_create_info.arrayLayers = 1;
1322 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1323 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1324 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1325 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1326 image_create_info.queueFamilyIndexCount = 0;
1327 image_create_info.pQueueFamilyIndices = NULL;
1328 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1329 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1330 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1331 m_errorMonitor->VerifyFound();
1332}
1333
Tobin Ehlisf11be982016-05-11 13:52:53 -06001334TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1335 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1336 "buffer and image to memory such that they will alias.");
1337 VkResult err;
1338 bool pass;
1339 ASSERT_NO_FATAL_FAILURE(InitState());
1340
Tobin Ehlis077ded32016-05-12 17:39:13 -06001341 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001342 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001343 VkImage image2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001344 VkDeviceMemory mem; // buffer will be bound first
1345 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001346 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001347
1348 VkBufferCreateInfo buf_info = {};
1349 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1350 buf_info.pNext = NULL;
1351 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1352 buf_info.size = 256;
1353 buf_info.queueFamilyIndexCount = 0;
1354 buf_info.pQueueFamilyIndices = NULL;
1355 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1356 buf_info.flags = 0;
1357 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1358 ASSERT_VK_SUCCESS(err);
1359
Tobin Ehlis077ded32016-05-12 17:39:13 -06001360 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001361
1362 VkImageCreateInfo image_create_info = {};
1363 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1364 image_create_info.pNext = NULL;
1365 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1366 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1367 image_create_info.extent.width = 64;
1368 image_create_info.extent.height = 64;
1369 image_create_info.extent.depth = 1;
1370 image_create_info.mipLevels = 1;
1371 image_create_info.arrayLayers = 1;
1372 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001373 // Image tiling must be optimal to trigger error when aliasing linear buffer
1374 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001375 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1376 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1377 image_create_info.queueFamilyIndexCount = 0;
1378 image_create_info.pQueueFamilyIndices = NULL;
1379 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1380 image_create_info.flags = 0;
1381
Tobin Ehlisf11be982016-05-11 13:52:53 -06001382 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1383 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001384 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1385 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001386
Tobin Ehlis077ded32016-05-12 17:39:13 -06001387 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1388
1389 VkMemoryAllocateInfo alloc_info = {};
1390 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1391 alloc_info.pNext = NULL;
1392 alloc_info.memoryTypeIndex = 0;
1393 // Ensure memory is big enough for both bindings
1394 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001395 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1396 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001397 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001398 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001399 vkDestroyImage(m_device->device(), image, NULL);
1400 return;
1401 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001402 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1403 ASSERT_VK_SUCCESS(err);
1404 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1405 ASSERT_VK_SUCCESS(err);
1406
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001408 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001409 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1410 m_errorMonitor->VerifyFound();
1411
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001412 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001413 // aliasing buffer2
1414 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1415 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001416 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1417 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001418 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001419 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001421 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001422 m_errorMonitor->VerifyFound();
1423
1424 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001425 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001426 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001427 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001428 vkFreeMemory(m_device->device(), mem, NULL);
1429 vkFreeMemory(m_device->device(), mem_img, NULL);
1430}
1431
Tobin Ehlis35372522016-05-12 08:32:31 -06001432TEST_F(VkLayerTest, InvalidMemoryMapping) {
1433 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1434 VkResult err;
1435 bool pass;
1436 ASSERT_NO_FATAL_FAILURE(InitState());
1437
1438 VkBuffer buffer;
1439 VkDeviceMemory mem;
1440 VkMemoryRequirements mem_reqs;
1441
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001442 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1443
Tobin Ehlis35372522016-05-12 08:32:31 -06001444 VkBufferCreateInfo buf_info = {};
1445 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1446 buf_info.pNext = NULL;
1447 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1448 buf_info.size = 256;
1449 buf_info.queueFamilyIndexCount = 0;
1450 buf_info.pQueueFamilyIndices = NULL;
1451 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1452 buf_info.flags = 0;
1453 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1454 ASSERT_VK_SUCCESS(err);
1455
1456 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1457 VkMemoryAllocateInfo alloc_info = {};
1458 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1459 alloc_info.pNext = NULL;
1460 alloc_info.memoryTypeIndex = 0;
1461
1462 // Ensure memory is big enough for both bindings
1463 static const VkDeviceSize allocation_size = 0x10000;
1464 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001465 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001466 if (!pass) {
1467 vkDestroyBuffer(m_device->device(), buffer, NULL);
1468 return;
1469 }
1470 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1471 ASSERT_VK_SUCCESS(err);
1472
1473 uint8_t *pData;
1474 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001476 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1477 m_errorMonitor->VerifyFound();
1478 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001479 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001480 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1482 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1483 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001484 m_errorMonitor->VerifyFound();
1485
1486 // Unmap the memory to avoid re-map error
1487 vkUnmapMemory(m_device->device(), mem);
1488 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1490 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1491 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001492 m_errorMonitor->VerifyFound();
1493 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1495 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001496 m_errorMonitor->VerifyFound();
1497 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001499 vkUnmapMemory(m_device->device(), mem);
1500 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001501
Tobin Ehlis35372522016-05-12 08:32:31 -06001502 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001503 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001504 ASSERT_VK_SUCCESS(err);
1505 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001506 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001507 mmr.memory = mem;
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001508 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001510 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1511 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001512
Tobin Ehlis35372522016-05-12 08:32:31 -06001513 // Now flush range that oversteps mapped range
1514 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001515 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001516 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001517 mmr.offset = atom_size;
1518 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1520 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1521 m_errorMonitor->VerifyFound();
1522
1523 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1524 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001525 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001526 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001527 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001528 mmr.size = VK_WHOLE_SIZE;
1529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001530 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1531 m_errorMonitor->VerifyFound();
1532
Tony Barboure3975eb2016-12-15 14:52:44 -07001533#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001534 // Some platforms have an atomsize of 1 which makes the test meaningless
1535 if (atom_size > 3) {
1536 // Now with an offset NOT a multiple of the device limit
1537 vkUnmapMemory(m_device->device(), mem);
1538 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1539 ASSERT_VK_SUCCESS(err);
1540 mmr.offset = 3; // Not a multiple of atom_size
1541 mmr.size = VK_WHOLE_SIZE;
1542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1543 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1544 m_errorMonitor->VerifyFound();
1545
1546 // Now with a size NOT a multiple of the device limit
1547 vkUnmapMemory(m_device->device(), mem);
1548 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1549 ASSERT_VK_SUCCESS(err);
1550 mmr.offset = atom_size;
1551 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1553 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1554 m_errorMonitor->VerifyFound();
1555 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001556#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001557 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1558 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001559 if (!pass) {
1560 vkFreeMemory(m_device->device(), mem, NULL);
1561 vkDestroyBuffer(m_device->device(), buffer, NULL);
1562 return;
1563 }
1564 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1565 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1566
1567 vkDestroyBuffer(m_device->device(), buffer, NULL);
1568 vkFreeMemory(m_device->device(), mem, NULL);
1569}
1570
Chris Forbes09368e42016-10-13 11:59:22 +13001571#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001572TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1573 VkResult err;
1574 bool pass;
1575
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001576 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1577 // following declaration (which is temporarily being moved below):
1578 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001579 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001580 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001581 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001582 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001583 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001584 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001585
1586 ASSERT_NO_FATAL_FAILURE(InitState());
1587
Ian Elliott3f06ce52016-04-29 14:46:21 -06001588#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1589#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1590 // Use the functions from the VK_KHR_android_surface extension without
1591 // enabling that extension:
1592
1593 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001594 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1596 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001597 pass = (err != VK_SUCCESS);
1598 ASSERT_TRUE(pass);
1599 m_errorMonitor->VerifyFound();
1600#endif // VK_USE_PLATFORM_ANDROID_KHR
1601
Ian Elliott3f06ce52016-04-29 14:46:21 -06001602#if defined(VK_USE_PLATFORM_MIR_KHR)
1603 // Use the functions from the VK_KHR_mir_surface extension without enabling
1604 // that extension:
1605
1606 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001607 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001609 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1610 pass = (err != VK_SUCCESS);
1611 ASSERT_TRUE(pass);
1612 m_errorMonitor->VerifyFound();
1613
1614 // Tell whether an mir_connection supports presentation:
1615 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1617 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001618 m_errorMonitor->VerifyFound();
1619#endif // VK_USE_PLATFORM_MIR_KHR
1620
Ian Elliott3f06ce52016-04-29 14:46:21 -06001621#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1622 // Use the functions from the VK_KHR_wayland_surface extension without
1623 // enabling that extension:
1624
1625 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001626 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1628 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001629 pass = (err != VK_SUCCESS);
1630 ASSERT_TRUE(pass);
1631 m_errorMonitor->VerifyFound();
1632
1633 // Tell whether an wayland_display supports presentation:
1634 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1636 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001637 m_errorMonitor->VerifyFound();
1638#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06001639#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001640
Ian Elliott3f06ce52016-04-29 14:46:21 -06001641#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001642 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1643 // TO NON-LINUX PLATFORMS:
1644 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001645 // Use the functions from the VK_KHR_win32_surface extension without
1646 // enabling that extension:
1647
1648 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001649 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1651 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001652 pass = (err != VK_SUCCESS);
1653 ASSERT_TRUE(pass);
1654 m_errorMonitor->VerifyFound();
1655
1656 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001658 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001659 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001660// Set this (for now, until all platforms are supported and tested):
1661#define NEED_TO_TEST_THIS_ON_PLATFORM
1662#endif // VK_USE_PLATFORM_WIN32_KHR
Tony Barbour2e7bd402016-11-14 14:46:33 -07001663#if defined(VK_USE_PLATFORM_XCB_KHR) || defined (VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001664 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1665 // TO NON-LINUX PLATFORMS:
1666 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001667#endif
1668#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001669 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1670 // that extension:
1671
1672 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001673 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001675 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1676 pass = (err != VK_SUCCESS);
1677 ASSERT_TRUE(pass);
1678 m_errorMonitor->VerifyFound();
1679
1680 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001681 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001682 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1684 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001685 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001686// Set this (for now, until all platforms are supported and tested):
1687#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001688#endif // VK_USE_PLATFORM_XCB_KHR
1689
Ian Elliott12630812016-04-29 14:35:43 -06001690#if defined(VK_USE_PLATFORM_XLIB_KHR)
1691 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1692 // that extension:
1693
1694 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001695 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001697 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1698 pass = (err != VK_SUCCESS);
1699 ASSERT_TRUE(pass);
1700 m_errorMonitor->VerifyFound();
1701
1702 // Tell whether an Xlib VisualID supports presentation:
1703 Display *dpy = NULL;
1704 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001706 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1707 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001708// Set this (for now, until all platforms are supported and tested):
1709#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06001710#endif // VK_USE_PLATFORM_XLIB_KHR
1711
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001712// Use the functions from the VK_KHR_surface extension without enabling
1713// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001714
Ian Elliott489eec02016-05-05 14:12:44 -06001715#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001716 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001718 vkDestroySurfaceKHR(instance(), surface, NULL);
1719 m_errorMonitor->VerifyFound();
1720
1721 // Check if surface supports presentation:
1722 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001724 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1725 pass = (err != VK_SUCCESS);
1726 ASSERT_TRUE(pass);
1727 m_errorMonitor->VerifyFound();
1728
1729 // Check surface capabilities:
1730 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1732 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001733 pass = (err != VK_SUCCESS);
1734 ASSERT_TRUE(pass);
1735 m_errorMonitor->VerifyFound();
1736
1737 // Check surface formats:
1738 uint32_t format_count = 0;
1739 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1741 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001742 pass = (err != VK_SUCCESS);
1743 ASSERT_TRUE(pass);
1744 m_errorMonitor->VerifyFound();
1745
1746 // Check surface present modes:
1747 uint32_t present_mode_count = 0;
1748 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001749 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1750 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001751 pass = (err != VK_SUCCESS);
1752 ASSERT_TRUE(pass);
1753 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001754#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001755
Ian Elliott1c32c772016-04-28 14:47:13 -06001756 // Use the functions from the VK_KHR_swapchain extension without enabling
1757 // that extension:
1758
1759 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001761 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1762 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001763 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001764 pass = (err != VK_SUCCESS);
1765 ASSERT_TRUE(pass);
1766 m_errorMonitor->VerifyFound();
1767
1768 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001769 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1770 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001771 pass = (err != VK_SUCCESS);
1772 ASSERT_TRUE(pass);
1773 m_errorMonitor->VerifyFound();
1774
Chris Forbeseb7d5502016-09-13 18:19:21 +12001775 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1776 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1777 VkFence fence;
1778 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1779
Ian Elliott1c32c772016-04-28 14:47:13 -06001780 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001782 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001783 pass = (err != VK_SUCCESS);
1784 ASSERT_TRUE(pass);
1785 m_errorMonitor->VerifyFound();
1786
Chris Forbeseb7d5502016-09-13 18:19:21 +12001787 vkDestroyFence(m_device->device(), fence, nullptr);
1788
Ian Elliott1c32c772016-04-28 14:47:13 -06001789 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001790 //
1791 // NOTE: Currently can't test this because a real swapchain is needed (as
1792 // opposed to the fake one we created) in order for the layer to lookup the
1793 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001794
1795 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001797 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1798 m_errorMonitor->VerifyFound();
1799}
Chris Forbes09368e42016-10-13 11:59:22 +13001800#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001801
Karl Schultz6addd812016-02-02 17:17:23 -07001802TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1803 VkResult err;
1804 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001805
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1807 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001808
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001809 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001810
1811 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001812 VkImage image;
1813 VkDeviceMemory mem;
1814 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001815
Karl Schultz6addd812016-02-02 17:17:23 -07001816 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1817 const int32_t tex_width = 32;
1818 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001819
Tony Barboureb254902015-07-15 12:50:33 -06001820 VkImageCreateInfo image_create_info = {};
1821 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001822 image_create_info.pNext = NULL;
1823 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1824 image_create_info.format = tex_format;
1825 image_create_info.extent.width = tex_width;
1826 image_create_info.extent.height = tex_height;
1827 image_create_info.extent.depth = 1;
1828 image_create_info.mipLevels = 1;
1829 image_create_info.arrayLayers = 1;
1830 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1831 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1832 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1833 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12001834 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001835
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001836 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001837 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001838 mem_alloc.pNext = NULL;
1839 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001840
Chia-I Wuf7458c52015-10-26 21:10:41 +08001841 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001842 ASSERT_VK_SUCCESS(err);
1843
Karl Schultz6addd812016-02-02 17:17:23 -07001844 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001845
Mark Lobodzinski23065352015-05-29 09:32:35 -05001846 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001847
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001848 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Karl Schultz6addd812016-02-02 17:17:23 -07001849 if (!pass) { // If we can't find any unmappable memory this test doesn't
1850 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001851 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001852 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001853 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001854
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001855 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001856 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001857 ASSERT_VK_SUCCESS(err);
1858
1859 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06001860 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001861 ASSERT_VK_SUCCESS(err);
1862
1863 // Map memory as if to initialize the image
1864 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001865 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001866
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001867 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001868
Chia-I Wuf7458c52015-10-26 21:10:41 +08001869 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06001870 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001871}
1872
Karl Schultz6addd812016-02-02 17:17:23 -07001873TEST_F(VkLayerTest, RebindMemory) {
1874 VkResult err;
1875 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001876
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001878
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001879 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001880
1881 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001882 VkImage image;
1883 VkDeviceMemory mem1;
1884 VkDeviceMemory mem2;
1885 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001886
Karl Schultz6addd812016-02-02 17:17:23 -07001887 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1888 const int32_t tex_width = 32;
1889 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001890
Tony Barboureb254902015-07-15 12:50:33 -06001891 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001892 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1893 image_create_info.pNext = NULL;
1894 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1895 image_create_info.format = tex_format;
1896 image_create_info.extent.width = tex_width;
1897 image_create_info.extent.height = tex_height;
1898 image_create_info.extent.depth = 1;
1899 image_create_info.mipLevels = 1;
1900 image_create_info.arrayLayers = 1;
1901 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1902 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1903 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1904 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001905
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001906 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001907 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1908 mem_alloc.pNext = NULL;
1909 mem_alloc.allocationSize = 0;
1910 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001911
Karl Schultz6addd812016-02-02 17:17:23 -07001912 // Introduce failure, do NOT set memProps to
1913 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001914 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001915 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001916 ASSERT_VK_SUCCESS(err);
1917
Karl Schultz6addd812016-02-02 17:17:23 -07001918 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001919
1920 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001921 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001922 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001923
1924 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001925 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001926 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001928 ASSERT_VK_SUCCESS(err);
1929
1930 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001931 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001932 ASSERT_VK_SUCCESS(err);
1933
Karl Schultz6addd812016-02-02 17:17:23 -07001934 // Introduce validation failure, try to bind a different memory object to
1935 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001936 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001937
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001938 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001939
Chia-I Wuf7458c52015-10-26 21:10:41 +08001940 vkDestroyImage(m_device->device(), image, NULL);
1941 vkFreeMemory(m_device->device(), mem1, NULL);
1942 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001943}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001944
Karl Schultz6addd812016-02-02 17:17:23 -07001945TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001946 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001947
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1949 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001950
1951 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001952 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1953 fenceInfo.pNext = NULL;
1954 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001955
Tony Barbour300a6082015-04-07 13:44:53 -06001956 ASSERT_NO_FATAL_FAILURE(InitState());
1957 ASSERT_NO_FATAL_FAILURE(InitViewport());
1958 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1959
Tony Barbourfe3351b2015-07-28 10:17:20 -06001960 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001961 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001962 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001963
1964 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001965
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001966 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001967 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1968 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001969 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001970 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001971 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001972 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001973 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001974 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001975 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001976
1977 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001978 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001979
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001980 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001981}
Chris Forbes4e44c912016-06-16 10:20:00 +12001982
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001983TEST_F(VkLayerTest, InvalidUsageBits) {
1984 TEST_DESCRIPTION("Specify wrong usage for image then create conflicting view of image "
1985 "Initialize buffer with wrong usage then perform copy expecting errors "
1986 "from both the image and the buffer (2 calls)");
1987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001988
1989 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesd2b5fe42016-11-28 18:00:00 +13001990
1991 auto format = VK_FORMAT_D24_UNORM_S8_UINT;
1992
Tony Barbourf92621a2016-05-02 14:28:12 -06001993 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06001994 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13001995 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001996 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001997
Tony Barbourf92621a2016-05-02 14:28:12 -06001998 VkImageView dsv;
1999 VkImageViewCreateInfo dsvci = {};
2000 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2001 dsvci.image = image.handle();
2002 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002003 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002004 dsvci.subresourceRange.layerCount = 1;
2005 dsvci.subresourceRange.baseMipLevel = 0;
2006 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002007 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002008
Tony Barbourf92621a2016-05-02 14:28:12 -06002009 // Create a view with depth / stencil aspect for image with different usage
2010 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002011
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002012 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002013
2014 // Initialize buffer with TRANSFER_DST usage
2015 vk_testing::Buffer buffer;
2016 VkMemoryPropertyFlags reqs = 0;
2017 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2018 VkBufferImageCopy region = {};
2019 region.bufferRowLength = 128;
2020 region.bufferImageHeight = 128;
2021 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2022 region.imageSubresource.layerCount = 1;
2023 region.imageExtent.height = 16;
2024 region.imageExtent.width = 16;
2025 region.imageExtent.depth = 1;
2026
Tony Barbourf92621a2016-05-02 14:28:12 -06002027 // Buffer usage not set to TRANSFER_SRC and image usage not set to
2028 // TRANSFER_DST
2029 BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002030
Chris Forbesda581202016-10-06 18:25:26 +13002031 // two separate errors from this call:
2032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2034
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002035 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2036 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002037 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002038}
Tony Barbour75d79f02016-08-30 09:39:07 -06002039
Tony Barbour75d79f02016-08-30 09:39:07 -06002040
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002041#endif // MEM_TRACKER_TESTS
2042
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06002043#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002044
2045TEST_F(VkLayerTest, LeakAnObject) {
2046 VkResult err;
2047
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002048 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002049
2050 // Note that we have to create a new device since destroying the
2051 // framework's device causes Teardown() to fail and just calling Teardown
2052 // will destroy the errorMonitor.
2053
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002055
2056 ASSERT_NO_FATAL_FAILURE(InitState());
2057
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002058 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002059 std::vector<VkDeviceQueueCreateInfo> queue_info;
2060 queue_info.reserve(queue_props.size());
2061 std::vector<std::vector<float>> queue_priorities;
2062 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2063 VkDeviceQueueCreateInfo qi = {};
2064 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2065 qi.pNext = NULL;
2066 qi.queueFamilyIndex = i;
2067 qi.queueCount = queue_props[i].queueCount;
2068 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2069 qi.pQueuePriorities = queue_priorities[i].data();
2070 queue_info.push_back(qi);
2071 }
2072
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002073 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002074
2075 // The sacrificial device object
2076 VkDevice testDevice;
2077 VkDeviceCreateInfo device_create_info = {};
2078 auto features = m_device->phy().features();
2079 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2080 device_create_info.pNext = NULL;
2081 device_create_info.queueCreateInfoCount = queue_info.size();
2082 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002083 device_create_info.enabledLayerCount = 0;
2084 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002085 device_create_info.pEnabledFeatures = &features;
2086 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2087 ASSERT_VK_SUCCESS(err);
2088
2089 VkFence fence;
2090 VkFenceCreateInfo fence_create_info = {};
2091 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2092 fence_create_info.pNext = NULL;
2093 fence_create_info.flags = 0;
2094 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2095 ASSERT_VK_SUCCESS(err);
2096
2097 // Induce failure by not calling vkDestroyFence
2098 vkDestroyDevice(testDevice, NULL);
2099 m_errorMonitor->VerifyFound();
2100}
2101
2102TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
2103
2104 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
2105 "attempt to delete them from another.");
2106
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002108
Cody Northropc31a84f2016-08-22 10:41:47 -06002109 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002110 VkCommandPool command_pool_one;
2111 VkCommandPool command_pool_two;
2112
2113 VkCommandPoolCreateInfo pool_create_info{};
2114 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2115 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2116 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2117
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002118 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002119
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002120 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002121
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002122 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002123 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002124 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002125 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002126 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002127 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002128 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002129
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002130 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002131
2132 m_errorMonitor->VerifyFound();
2133
2134 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2135 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2136}
2137
2138TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2139 VkResult err;
2140
2141 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002142 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002143
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002145
2146 ASSERT_NO_FATAL_FAILURE(InitState());
2147 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2148
2149 VkDescriptorPoolSize ds_type_count = {};
2150 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2151 ds_type_count.descriptorCount = 1;
2152
2153 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2154 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2155 ds_pool_ci.pNext = NULL;
2156 ds_pool_ci.flags = 0;
2157 ds_pool_ci.maxSets = 1;
2158 ds_pool_ci.poolSizeCount = 1;
2159 ds_pool_ci.pPoolSizes = &ds_type_count;
2160
2161 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002162 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002163 ASSERT_VK_SUCCESS(err);
2164
2165 // Create a second descriptor pool
2166 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002167 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002168 ASSERT_VK_SUCCESS(err);
2169
2170 VkDescriptorSetLayoutBinding dsl_binding = {};
2171 dsl_binding.binding = 0;
2172 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2173 dsl_binding.descriptorCount = 1;
2174 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2175 dsl_binding.pImmutableSamplers = NULL;
2176
2177 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2178 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2179 ds_layout_ci.pNext = NULL;
2180 ds_layout_ci.bindingCount = 1;
2181 ds_layout_ci.pBindings = &dsl_binding;
2182
2183 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002184 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002185 ASSERT_VK_SUCCESS(err);
2186
2187 VkDescriptorSet descriptorSet;
2188 VkDescriptorSetAllocateInfo alloc_info = {};
2189 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2190 alloc_info.descriptorSetCount = 1;
2191 alloc_info.descriptorPool = ds_pool_one;
2192 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002193 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002194 ASSERT_VK_SUCCESS(err);
2195
2196 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2197
2198 m_errorMonitor->VerifyFound();
2199
2200 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2201 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2202 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2203}
2204
2205TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002207
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002208 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002209
2210 ASSERT_NO_FATAL_FAILURE(InitState());
2211
2212 // Pass bogus handle into GetImageMemoryRequirements
2213 VkMemoryRequirements mem_reqs;
2214 uint64_t fakeImageHandle = 0xCADECADE;
2215 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2216
2217 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2218
2219 m_errorMonitor->VerifyFound();
2220}
2221
Karl Schultz6addd812016-02-02 17:17:23 -07002222TEST_F(VkLayerTest, PipelineNotBound) {
2223 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002224
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002225 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002226
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002228
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002229 ASSERT_NO_FATAL_FAILURE(InitState());
2230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002231
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002232 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002233 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2234 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002235
2236 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002237 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2238 ds_pool_ci.pNext = NULL;
2239 ds_pool_ci.maxSets = 1;
2240 ds_pool_ci.poolSizeCount = 1;
2241 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002242
2243 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002244 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002245 ASSERT_VK_SUCCESS(err);
2246
2247 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002248 dsl_binding.binding = 0;
2249 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2250 dsl_binding.descriptorCount = 1;
2251 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2252 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002253
2254 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002255 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2256 ds_layout_ci.pNext = NULL;
2257 ds_layout_ci.bindingCount = 1;
2258 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002259
2260 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002261 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002262 ASSERT_VK_SUCCESS(err);
2263
2264 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002265 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002266 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002267 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002268 alloc_info.descriptorPool = ds_pool;
2269 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002270 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002271 ASSERT_VK_SUCCESS(err);
2272
2273 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002274 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2275 pipeline_layout_ci.pNext = NULL;
2276 pipeline_layout_ci.setLayoutCount = 1;
2277 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002278
2279 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002280 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002281 ASSERT_VK_SUCCESS(err);
2282
Mark Youngad779052016-01-06 14:26:04 -07002283 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002284
2285 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002286 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002287
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002288 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002289
Chia-I Wuf7458c52015-10-26 21:10:41 +08002290 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2291 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2292 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002293}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002294
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002295TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2296 VkResult err;
2297
2298 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
2299 "during bind[Buffer|Image]Memory time");
2300
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002301 ASSERT_NO_FATAL_FAILURE(InitState());
2302
2303 // Create an image, allocate memory, set a bad typeIndex and then try to
2304 // bind it
2305 VkImage image;
2306 VkDeviceMemory mem;
2307 VkMemoryRequirements mem_reqs;
2308 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2309 const int32_t tex_width = 32;
2310 const int32_t tex_height = 32;
2311
2312 VkImageCreateInfo image_create_info = {};
2313 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2314 image_create_info.pNext = NULL;
2315 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2316 image_create_info.format = tex_format;
2317 image_create_info.extent.width = tex_width;
2318 image_create_info.extent.height = tex_height;
2319 image_create_info.extent.depth = 1;
2320 image_create_info.mipLevels = 1;
2321 image_create_info.arrayLayers = 1;
2322 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2323 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2324 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2325 image_create_info.flags = 0;
2326
2327 VkMemoryAllocateInfo mem_alloc = {};
2328 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2329 mem_alloc.pNext = NULL;
2330 mem_alloc.allocationSize = 0;
2331 mem_alloc.memoryTypeIndex = 0;
2332
2333 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2334 ASSERT_VK_SUCCESS(err);
2335
2336 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2337 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002338
2339 // Introduce Failure, select invalid TypeIndex
2340 VkPhysicalDeviceMemoryProperties memory_info;
2341
2342 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2343 unsigned int i;
2344 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2345 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2346 mem_alloc.memoryTypeIndex = i;
2347 break;
2348 }
2349 }
2350 if (i >= memory_info.memoryTypeCount) {
2351 printf("No invalid memory type index could be found; skipped.\n");
2352 vkDestroyImage(m_device->device(), image, NULL);
2353 return;
2354 }
2355
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002357
2358 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2359 ASSERT_VK_SUCCESS(err);
2360
2361 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2362 (void)err;
2363
2364 m_errorMonitor->VerifyFound();
2365
2366 vkDestroyImage(m_device->device(), image, NULL);
2367 vkFreeMemory(m_device->device(), mem, NULL);
2368}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002369
Karl Schultz6addd812016-02-02 17:17:23 -07002370TEST_F(VkLayerTest, BindInvalidMemory) {
2371 VkResult err;
2372 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002373
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002375
Tobin Ehlisec598302015-09-15 15:02:17 -06002376 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002377
2378 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002379 VkImage image;
2380 VkDeviceMemory mem;
2381 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002382
Karl Schultz6addd812016-02-02 17:17:23 -07002383 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2384 const int32_t tex_width = 32;
2385 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002386
2387 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002388 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2389 image_create_info.pNext = NULL;
2390 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2391 image_create_info.format = tex_format;
2392 image_create_info.extent.width = tex_width;
2393 image_create_info.extent.height = tex_height;
2394 image_create_info.extent.depth = 1;
2395 image_create_info.mipLevels = 1;
2396 image_create_info.arrayLayers = 1;
2397 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2398 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2399 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2400 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002401
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002402 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002403 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2404 mem_alloc.pNext = NULL;
2405 mem_alloc.allocationSize = 0;
2406 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002407
Chia-I Wuf7458c52015-10-26 21:10:41 +08002408 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002409 ASSERT_VK_SUCCESS(err);
2410
Karl Schultz6addd812016-02-02 17:17:23 -07002411 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002412
2413 mem_alloc.allocationSize = mem_reqs.size;
2414
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002415 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002416 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002417
2418 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002419 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002420 ASSERT_VK_SUCCESS(err);
2421
2422 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002423 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002424
2425 // Try to bind free memory that has been freed
2426 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2427 // This may very well return an error.
2428 (void)err;
2429
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002430 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002431
Chia-I Wuf7458c52015-10-26 21:10:41 +08002432 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002433}
2434
Karl Schultz6addd812016-02-02 17:17:23 -07002435TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2436 VkResult err;
2437 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002438
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002440
Tobin Ehlisec598302015-09-15 15:02:17 -06002441 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002442
Karl Schultz6addd812016-02-02 17:17:23 -07002443 // Create an image object, allocate memory, destroy the object and then try
2444 // to bind it
2445 VkImage image;
2446 VkDeviceMemory mem;
2447 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002448
Karl Schultz6addd812016-02-02 17:17:23 -07002449 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2450 const int32_t tex_width = 32;
2451 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002452
2453 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002454 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2455 image_create_info.pNext = NULL;
2456 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2457 image_create_info.format = tex_format;
2458 image_create_info.extent.width = tex_width;
2459 image_create_info.extent.height = tex_height;
2460 image_create_info.extent.depth = 1;
2461 image_create_info.mipLevels = 1;
2462 image_create_info.arrayLayers = 1;
2463 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2464 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2465 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2466 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002467
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002468 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002469 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2470 mem_alloc.pNext = NULL;
2471 mem_alloc.allocationSize = 0;
2472 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002473
Chia-I Wuf7458c52015-10-26 21:10:41 +08002474 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002475 ASSERT_VK_SUCCESS(err);
2476
Karl Schultz6addd812016-02-02 17:17:23 -07002477 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002478
2479 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002480 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002481 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002482
2483 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002484 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002485 ASSERT_VK_SUCCESS(err);
2486
2487 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002488 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002489 ASSERT_VK_SUCCESS(err);
2490
2491 // Now Try to bind memory to this destroyed object
2492 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2493 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002494 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002495
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002496 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002497
Chia-I Wuf7458c52015-10-26 21:10:41 +08002498 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002499}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002500
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002501#endif // OBJ_TRACKER_TESTS
2502
Tobin Ehlis0788f522015-05-26 16:11:58 -06002503#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002504
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002505TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
2506 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
2507
2508 ASSERT_NO_FATAL_FAILURE(InitState());
2509 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2510
2511 VkVertexInputBindingDescription input_binding;
2512 memset(&input_binding, 0, sizeof(input_binding));
2513
2514 VkVertexInputAttributeDescription input_attribs;
2515 memset(&input_attribs, 0, sizeof(input_attribs));
2516
2517 // Pick a really bad format for this purpose and make sure it should fail
2518 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
2519 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
2520 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
2521 printf("Format unsuitable for test; skipped.\n");
2522 return;
2523 }
2524
2525 input_attribs.location = 0;
2526 char const *vsSource = "#version 450\n"
2527 "\n"
2528 "out gl_PerVertex {\n"
2529 " vec4 gl_Position;\n"
2530 "};\n"
2531 "void main(){\n"
2532 " gl_Position = vec4(1);\n"
2533 "}\n";
2534 char const *fsSource = "#version 450\n"
2535 "\n"
2536 "layout(location=0) out vec4 color;\n"
2537 "void main(){\n"
2538 " color = vec4(1);\n"
2539 "}\n";
2540
2541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
2542 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2543 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2544
2545 VkPipelineObj pipe(m_device);
2546 pipe.AddColorAttachment();
2547 pipe.AddShader(&vs);
2548 pipe.AddShader(&fs);
2549
2550 pipe.AddVertexInputBindings(&input_binding, 1);
2551 pipe.AddVertexInputAttribs(&input_attribs, 1);
2552
2553 VkDescriptorSetObj descriptorSet(m_device);
2554 descriptorSet.AppendDummy();
2555 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
2556
2557 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
2558
2559 m_errorMonitor->VerifyFound();
2560}
2561
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002562TEST_F(VkLayerTest, ImageSampleCounts) {
2563
2564 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger "
2565 "validation errors.");
2566 ASSERT_NO_FATAL_FAILURE(InitState());
2567
2568 VkMemoryPropertyFlags reqs = 0;
2569 VkImageCreateInfo image_create_info = {};
2570 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2571 image_create_info.pNext = NULL;
2572 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2573 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
2574 image_create_info.extent.width = 256;
2575 image_create_info.extent.height = 256;
2576 image_create_info.extent.depth = 1;
2577 image_create_info.mipLevels = 1;
2578 image_create_info.arrayLayers = 1;
2579 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2580 image_create_info.flags = 0;
2581
2582 VkImageBlit blit_region = {};
2583 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2584 blit_region.srcSubresource.baseArrayLayer = 0;
2585 blit_region.srcSubresource.layerCount = 1;
2586 blit_region.srcSubresource.mipLevel = 0;
2587 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2588 blit_region.dstSubresource.baseArrayLayer = 0;
2589 blit_region.dstSubresource.layerCount = 1;
2590 blit_region.dstSubresource.mipLevel = 0;
2591
2592 // Create two images, the source with sampleCount = 2, and attempt to blit
2593 // between them
2594 {
2595 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002596 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002597 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002598 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002599 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002600 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002601 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002602 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002603 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2605 "of VK_SAMPLE_COUNT_2_BIT but "
2606 "must be VK_SAMPLE_COUNT_1_BIT");
2607 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2608 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002609 m_errorMonitor->VerifyFound();
2610 m_commandBuffer->EndCommandBuffer();
2611 }
2612
2613 // Create two images, the dest with sampleCount = 4, and attempt to blit
2614 // between them
2615 {
2616 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002617 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002618 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002619 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002620 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002621 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002622 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002623 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002624 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2626 "of VK_SAMPLE_COUNT_4_BIT but "
2627 "must be VK_SAMPLE_COUNT_1_BIT");
2628 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2629 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002630 m_errorMonitor->VerifyFound();
2631 m_commandBuffer->EndCommandBuffer();
2632 }
2633
2634 VkBufferImageCopy copy_region = {};
2635 copy_region.bufferRowLength = 128;
2636 copy_region.bufferImageHeight = 128;
2637 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2638 copy_region.imageSubresource.layerCount = 1;
2639 copy_region.imageExtent.height = 64;
2640 copy_region.imageExtent.width = 64;
2641 copy_region.imageExtent.depth = 1;
2642
2643 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
2644 // buffer to image
2645 {
2646 vk_testing::Buffer src_buffer;
2647 VkMemoryPropertyFlags reqs = 0;
2648 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
2649 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002650 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002651 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002652 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002653 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2655 "of VK_SAMPLE_COUNT_8_BIT but "
2656 "must be VK_SAMPLE_COUNT_1_BIT");
2657 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
2658 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002659 m_errorMonitor->VerifyFound();
2660 m_commandBuffer->EndCommandBuffer();
2661 }
2662
2663 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
2664 // image to buffer
2665 {
2666 vk_testing::Buffer dst_buffer;
2667 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
2668 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002669 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002670 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002671 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002672 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2674 "of VK_SAMPLE_COUNT_2_BIT but "
2675 "must be VK_SAMPLE_COUNT_1_BIT");
2676 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002677 dst_buffer.handle(), 1, &copy_region);
2678 m_errorMonitor->VerifyFound();
2679 m_commandBuffer->EndCommandBuffer();
2680 }
2681}
2682
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002683TEST_F(VkLayerTest, BlitImageFormats) {
2684
2685 // Image blit with mismatched formats
2686 const char * expected_message =
2687 "vkCmdBlitImage: If one of srcImage and dstImage images has signed/unsigned integer format,"
2688 " the other one must also have signed/unsigned integer format";
2689
2690 ASSERT_NO_FATAL_FAILURE(InitState());
2691
2692 VkImageObj src_image(m_device);
2693 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
2694 VkImageObj dst_image(m_device);
2695 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
2696 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06002697 dst_image2.init(64, 64, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002698
2699 VkImageBlit blitRegion = {};
2700 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2701 blitRegion.srcSubresource.baseArrayLayer = 0;
2702 blitRegion.srcSubresource.layerCount = 1;
2703 blitRegion.srcSubresource.mipLevel = 0;
2704 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2705 blitRegion.dstSubresource.baseArrayLayer = 0;
2706 blitRegion.dstSubresource.layerCount = 1;
2707 blitRegion.dstSubresource.mipLevel = 0;
2708
2709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, expected_message);
2710
2711 // Unsigned int vs not an int
2712 BeginCommandBuffer();
2713 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(),
2714 dst_image.layout(), 1, &blitRegion, VK_FILTER_NEAREST);
2715
2716 m_errorMonitor->VerifyFound();
2717
2718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, expected_message);
2719
2720 // Unsigned int vs signed int
2721 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(),
2722 dst_image2.layout(), 1, &blitRegion, VK_FILTER_NEAREST);
2723
2724 m_errorMonitor->VerifyFound();
2725
2726 EndCommandBuffer();
2727}
2728
2729
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002730TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
2731 VkResult err;
2732 bool pass;
2733
2734 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
2735 ASSERT_NO_FATAL_FAILURE(InitState());
2736
2737 // If w/d/h granularity is 1, test is not meaningful
2738 // TODO: When virtual device limits are available, create a set of limits for this test that
2739 // will always have a granularity of > 1 for w, h, and d
2740 auto index = m_device->graphics_queue_node_index_;
2741 auto queue_family_properties = m_device->phy().queue_properties();
2742
2743 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
2744 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
2745 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
2746 return;
2747 }
2748
2749 // Create two images of different types and try to copy between them
2750 VkImage srcImage;
2751 VkImage dstImage;
2752 VkDeviceMemory srcMem;
2753 VkDeviceMemory destMem;
2754 VkMemoryRequirements memReqs;
2755
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002756 VkImageCreateInfo image_create_info = {};
2757 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2758 image_create_info.pNext = NULL;
2759 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2760 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
2761 image_create_info.extent.width = 32;
2762 image_create_info.extent.height = 32;
2763 image_create_info.extent.depth = 1;
2764 image_create_info.mipLevels = 1;
2765 image_create_info.arrayLayers = 4;
2766 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2767 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2768 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2769 image_create_info.flags = 0;
2770
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002771 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002772 ASSERT_VK_SUCCESS(err);
2773
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002774 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002775 ASSERT_VK_SUCCESS(err);
2776
2777 // Allocate memory
2778 VkMemoryAllocateInfo memAlloc = {};
2779 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2780 memAlloc.pNext = NULL;
2781 memAlloc.allocationSize = 0;
2782 memAlloc.memoryTypeIndex = 0;
2783
2784 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
2785 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002786 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002787 ASSERT_TRUE(pass);
2788 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
2789 ASSERT_VK_SUCCESS(err);
2790
2791 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
2792 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002793 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002794 ASSERT_VK_SUCCESS(err);
2795 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
2796 ASSERT_VK_SUCCESS(err);
2797
2798 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
2799 ASSERT_VK_SUCCESS(err);
2800 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
2801 ASSERT_VK_SUCCESS(err);
2802
2803 BeginCommandBuffer();
2804 VkImageCopy copyRegion;
2805 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2806 copyRegion.srcSubresource.mipLevel = 0;
2807 copyRegion.srcSubresource.baseArrayLayer = 0;
2808 copyRegion.srcSubresource.layerCount = 1;
2809 copyRegion.srcOffset.x = 0;
2810 copyRegion.srcOffset.y = 0;
2811 copyRegion.srcOffset.z = 0;
2812 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2813 copyRegion.dstSubresource.mipLevel = 0;
2814 copyRegion.dstSubresource.baseArrayLayer = 0;
2815 copyRegion.dstSubresource.layerCount = 1;
2816 copyRegion.dstOffset.x = 0;
2817 copyRegion.dstOffset.y = 0;
2818 copyRegion.dstOffset.z = 0;
2819 copyRegion.extent.width = 1;
2820 copyRegion.extent.height = 1;
2821 copyRegion.extent.depth = 1;
2822
2823 // Introduce failure by setting srcOffset to a bad granularity value
2824 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2826 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002827 m_errorMonitor->VerifyFound();
2828
2829 // Introduce failure by setting extent to a bad granularity value
2830 copyRegion.srcOffset.y = 0;
2831 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2833 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002834 m_errorMonitor->VerifyFound();
2835
2836 // Now do some buffer/image copies
2837 vk_testing::Buffer buffer;
2838 VkMemoryPropertyFlags reqs = 0;
2839 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2840 VkBufferImageCopy region = {};
2841 region.bufferOffset = 0;
2842 region.bufferRowLength = 3;
2843 region.bufferImageHeight = 128;
2844 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2845 region.imageSubresource.layerCount = 1;
2846 region.imageExtent.height = 16;
2847 region.imageExtent.width = 16;
2848 region.imageExtent.depth = 1;
2849 region.imageOffset.x = 0;
2850 region.imageOffset.y = 0;
2851 region.imageOffset.z = 0;
2852
2853 // Introduce failure by setting bufferRowLength to a bad granularity value
2854 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2856 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2857 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002858 m_errorMonitor->VerifyFound();
2859 region.bufferRowLength = 128;
2860
2861 // Introduce failure by setting bufferOffset to a bad granularity value
2862 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2864 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
2865 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002866 m_errorMonitor->VerifyFound();
2867 region.bufferOffset = 0;
2868
2869 // Introduce failure by setting bufferImageHeight to a bad granularity value
2870 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2872 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
2873 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002874 m_errorMonitor->VerifyFound();
2875 region.bufferImageHeight = 128;
2876
2877 // Introduce failure by setting imageExtent to a bad granularity value
2878 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2880 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
2881 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002882 m_errorMonitor->VerifyFound();
2883 region.imageExtent.width = 16;
2884
2885 // Introduce failure by setting imageOffset to a bad granularity value
2886 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2888 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2889 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002890 m_errorMonitor->VerifyFound();
2891
2892 EndCommandBuffer();
2893
2894 vkDestroyImage(m_device->device(), srcImage, NULL);
2895 vkDestroyImage(m_device->device(), dstImage, NULL);
2896 vkFreeMemory(m_device->device(), srcMem, NULL);
2897 vkFreeMemory(m_device->device(), destMem, NULL);
2898}
2899
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002900TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002901 TEST_DESCRIPTION("Submit command buffer created using one queue family and "
2902 "attempt to submit them on a queue created in a different "
2903 "queue family.");
2904
Cody Northropc31a84f2016-08-22 10:41:47 -06002905 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002906 // This test is meaningless unless we have multiple queue families
2907 auto queue_family_properties = m_device->phy().queue_properties();
2908 if (queue_family_properties.size() < 2) {
2909 return;
2910 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002912 // Get safe index of another queue family
2913 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
2914 ASSERT_NO_FATAL_FAILURE(InitState());
2915 // Create a second queue using a different queue family
2916 VkQueue other_queue;
2917 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
2918
2919 // Record an empty cmd buffer
2920 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
2921 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2922 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
2923 vkEndCommandBuffer(m_commandBuffer->handle());
2924
2925 // And submit on the wrong queue
2926 VkSubmitInfo submit_info = {};
2927 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2928 submit_info.commandBufferCount = 1;
2929 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06002930 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002931
2932 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002933}
2934
Chris Forbes4c24a922016-11-16 08:59:10 +13002935TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
2936 ASSERT_NO_FATAL_FAILURE(InitState());
2937
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002938 // There are no attachments, but refer to attachment 0.
2939 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13002940 VkSubpassDescription subpasses[] = {
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002941 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr,
2942 nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13002943 };
2944
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002945 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
2946 nullptr,
2947 0,
2948 0,
2949 nullptr,
2950 1,
2951 subpasses,
2952 0,
2953 nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13002954 VkRenderPass rp;
2955
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002956 // "... must be less than the total number of attachments ..."
Chris Forbes4c24a922016-11-16 08:59:10 +13002957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002958 VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13002959 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
2960 m_errorMonitor->VerifyFound();
2961}
2962
Chris Forbesa58c4522016-09-28 15:19:39 +13002963TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
2964 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
2965 ASSERT_NO_FATAL_FAILURE(InitState());
2966
2967 // A renderpass with two subpasses, both writing the same attachment.
2968 VkAttachmentDescription attach[] = {
2969 { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
2970 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
2971 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
2972 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
2973 },
2974 };
2975 VkAttachmentReference ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
2976 VkSubpassDescription subpasses[] = {
2977 { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
2978 1, &ref, nullptr, nullptr, 0, nullptr },
2979 { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
2980 1, &ref, nullptr, nullptr, 0, nullptr },
2981 };
2982 VkSubpassDependency dep = {
2983 0, 1,
2984 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
2985 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
2986 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
2987 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
2988 VK_DEPENDENCY_BY_REGION_BIT
2989 };
2990 VkRenderPassCreateInfo rpci = {
2991 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
2992 0, 1, attach, 2, subpasses, 1, &dep
2993 };
2994 VkRenderPass rp;
2995 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
2996 ASSERT_VK_SUCCESS(err);
2997
2998 VkImageObj image(m_device);
2999 image.init_no_layout(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3000 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3001 VK_IMAGE_TILING_OPTIMAL, 0);
3002 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3003
3004 VkFramebufferCreateInfo fbci = {
3005 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3006 0, rp, 1, &imageView, 32, 32, 1
3007 };
3008 VkFramebuffer fb;
3009 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3010 ASSERT_VK_SUCCESS(err);
3011
3012 char const *vsSource =
3013 "#version 450\n"
3014 "void main() { gl_Position = vec4(1); }\n";
3015 char const *fsSource =
3016 "#version 450\n"
3017 "layout(location=0) out vec4 color;\n"
3018 "void main() { color = vec4(1); }\n";
3019
3020 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3021 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3022 VkPipelineObj pipe(m_device);
3023 pipe.AddColorAttachment();
3024 pipe.AddShader(&vs);
3025 pipe.AddShader(&fs);
3026 VkViewport view_port = {};
3027 m_viewports.push_back(view_port);
3028 pipe.SetViewport(m_viewports);
3029 VkRect2D rect = {};
3030 m_scissors.push_back(rect);
3031 pipe.SetScissor(m_scissors);
3032
3033 VkPipelineLayoutCreateInfo plci = {
3034 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
3035 0, 0, nullptr, 0, nullptr
3036 };
3037 VkPipelineLayout pl;
3038 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3039 ASSERT_VK_SUCCESS(err);
3040 pipe.CreateVKPipeline(pl, rp);
3041
3042 BeginCommandBuffer();
3043
3044 VkRenderPassBeginInfo rpbi = {
3045 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
3046 rp, fb, { { 0, 0, }, { 32, 32 } }, 0, nullptr
3047 };
3048
3049 // subtest 1: bind in the wrong subpass
3050 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3051 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
3052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3053 "built for subpass 0 but used in subpass 1");
3054 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3055 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3056 m_errorMonitor->VerifyFound();
3057
3058 vkCmdEndRenderPass(m_commandBuffer->handle());
3059
3060 // subtest 2: bind in correct subpass, then transition to next subpass
3061 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3062 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3063 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
3064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3065 "built for subpass 0 but used in subpass 1");
3066 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3067 m_errorMonitor->VerifyFound();
3068
3069 vkCmdEndRenderPass(m_commandBuffer->handle());
3070
3071 EndCommandBuffer();
3072
3073 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3074 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3075 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3076}
3077
Tony Barbour4e919972016-08-09 13:27:40 -06003078TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
3079 TEST_DESCRIPTION("Generate INVALID_RENDER_AREA error by beginning renderpass"
3080 "with extent outside of framebuffer");
3081 ASSERT_NO_FATAL_FAILURE(InitState());
3082 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3083
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot execute a render pass with renderArea "
3085 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003086
3087 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3088 m_renderPassBeginInfo.renderArea.extent.width = 257;
3089 m_renderPassBeginInfo.renderArea.extent.height = 257;
3090 BeginCommandBuffer();
3091 m_errorMonitor->VerifyFound();
3092}
3093
3094TEST_F(VkLayerTest, DisabledIndependentBlend) {
3095 TEST_DESCRIPTION("Generate INDEPENDENT_BLEND by disabling independent "
3096 "blend and then specifying different blend states for two "
3097 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003098 VkPhysicalDeviceFeatures features = {};
3099 features.independentBlend = VK_FALSE;
Cody Northropc31a84f2016-08-22 10:41:47 -06003100 ASSERT_NO_FATAL_FAILURE(InitState(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003101
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3103 "Invalid Pipeline CreateInfo: If independent blend feature not "
3104 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003105
Cody Northropc31a84f2016-08-22 10:41:47 -06003106 VkDescriptorSetObj descriptorSet(m_device);
3107 descriptorSet.AppendDummy();
3108 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003109
Cody Northropc31a84f2016-08-22 10:41:47 -06003110 VkPipelineObj pipeline(m_device);
3111 VkRenderpassObj renderpass(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003112 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003113 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003114
Cody Northropc31a84f2016-08-22 10:41:47 -06003115 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3116 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3117 att_state1.blendEnable = VK_TRUE;
3118 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3119 att_state2.blendEnable = VK_FALSE;
3120 pipeline.AddColorAttachment(0, &att_state1);
3121 pipeline.AddColorAttachment(1, &att_state2);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003122 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass.handle());
Cody Northropc31a84f2016-08-22 10:41:47 -06003123 m_errorMonitor->VerifyFound();
Tony Barbour4e919972016-08-09 13:27:40 -06003124}
3125
Chris Forbes26ec2122016-11-29 08:58:33 +13003126#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003127TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3128 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3129 "depth attachments in subpass");
Cody Northropc31a84f2016-08-22 10:41:47 -06003130 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour4e919972016-08-09 13:27:40 -06003131
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3133 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003134
3135 // Create a renderPass with a single color attachment
3136 VkAttachmentReference attach = {};
3137 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3138 VkSubpassDescription subpass = {};
3139 VkRenderPassCreateInfo rpci = {};
3140 rpci.subpassCount = 1;
3141 rpci.pSubpasses = &subpass;
3142 rpci.attachmentCount = 1;
3143 VkAttachmentDescription attach_desc = {};
3144 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3145 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3146 rpci.pAttachments = &attach_desc;
3147 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3148 VkRenderPass rp;
3149 subpass.pDepthStencilAttachment = &attach;
3150 subpass.pColorAttachments = NULL;
3151 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3152 m_errorMonitor->VerifyFound();
3153}
Chris Forbes26ec2122016-11-29 08:58:33 +13003154#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003155
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003156TEST_F(VkLayerTest, UnusedPreserveAttachment) {
3157 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
3158 "attachment reference of VK_ATTACHMENT_UNUSED");
3159
3160 ASSERT_NO_FATAL_FAILURE(InitState());
3161 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3162
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003164
3165 VkAttachmentReference color_attach = {};
3166 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3167 color_attach.attachment = 0;
3168 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3169 VkSubpassDescription subpass = {};
3170 subpass.colorAttachmentCount = 1;
3171 subpass.pColorAttachments = &color_attach;
3172 subpass.preserveAttachmentCount = 1;
3173 subpass.pPreserveAttachments = &preserve_attachment;
3174
3175 VkRenderPassCreateInfo rpci = {};
3176 rpci.subpassCount = 1;
3177 rpci.pSubpasses = &subpass;
3178 rpci.attachmentCount = 1;
3179 VkAttachmentDescription attach_desc = {};
3180 attach_desc.format = VK_FORMAT_UNDEFINED;
3181 rpci.pAttachments = &attach_desc;
3182 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3183 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003184 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003185
3186 m_errorMonitor->VerifyFound();
3187
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003188 if (result == VK_SUCCESS) {
3189 vkDestroyRenderPass(m_device->device(), rp, NULL);
3190 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003191}
3192
Chris Forbesc5389742016-06-29 11:49:23 +12003193TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12003194 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
3195 "when the source of a subpass multisample resolve "
3196 "does not have multiple samples.");
3197
Chris Forbesc5389742016-06-29 11:49:23 +12003198 ASSERT_NO_FATAL_FAILURE(InitState());
3199
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3201 "Subpass 0 requests multisample resolve from attachment 0 which has "
3202 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003203
3204 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003205 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3206 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3207 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3208 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3209 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3210 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003211 };
3212
3213 VkAttachmentReference color = {
3214 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3215 };
3216
3217 VkAttachmentReference resolve = {
3218 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3219 };
3220
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003221 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003222
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003223 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003224
3225 VkRenderPass rp;
3226 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3227
3228 m_errorMonitor->VerifyFound();
3229
3230 if (err == VK_SUCCESS)
3231 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3232}
3233
3234TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12003235 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
3236 "when a subpass multisample resolve operation is "
3237 "requested, and the destination of that resolve has "
3238 "multiple samples.");
3239
Chris Forbesc5389742016-06-29 11:49:23 +12003240 ASSERT_NO_FATAL_FAILURE(InitState());
3241
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3243 "Subpass 0 requests multisample resolve into attachment 1, which "
3244 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003245
3246 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003247 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3248 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3249 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3250 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3251 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3252 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003253 };
3254
3255 VkAttachmentReference color = {
3256 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3257 };
3258
3259 VkAttachmentReference resolve = {
3260 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3261 };
3262
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003263 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003264
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003265 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003266
3267 VkRenderPass rp;
3268 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3269
3270 m_errorMonitor->VerifyFound();
3271
3272 if (err == VK_SUCCESS)
3273 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3274}
3275
Chris Forbes3f128ef2016-06-29 14:58:53 +12003276TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12003277 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
3278 "when the color and depth attachments used by a subpass "
3279 "have inconsistent sample counts");
3280
Chris Forbes3f128ef2016-06-29 14:58:53 +12003281 ASSERT_NO_FATAL_FAILURE(InitState());
3282
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3284 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003285
3286 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003287 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3288 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3289 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3290 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3291 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3292 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003293 };
3294
3295 VkAttachmentReference color[] = {
3296 {
3297 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3298 },
3299 {
3300 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3301 },
3302 };
3303
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003304 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003305
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003306 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003307
3308 VkRenderPass rp;
3309 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3310
3311 m_errorMonitor->VerifyFound();
3312
3313 if (err == VK_SUCCESS)
3314 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3315}
3316
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003317TEST_F(VkLayerTest, FramebufferCreateErrors) {
3318 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
Mike Weiblencce7ec72016-10-17 19:33:05 -06003319 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003320 " 2. Use a color image as depthStencil attachment\n"
Mike Weiblencce7ec72016-10-17 19:33:05 -06003321 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3322 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3323 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3324 " 6. Framebuffer attachment where dimensions don't match\n"
3325 " 7. Framebuffer attachment w/o identity swizzle\n"
3326 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003327
3328 ASSERT_NO_FATAL_FAILURE(InitState());
3329 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3330
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3332 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
3333 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003334
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003335 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003336 VkAttachmentReference attach = {};
3337 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3338 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003339 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003340 VkRenderPassCreateInfo rpci = {};
3341 rpci.subpassCount = 1;
3342 rpci.pSubpasses = &subpass;
3343 rpci.attachmentCount = 1;
3344 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003345 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003346 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003347 rpci.pAttachments = &attach_desc;
3348 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3349 VkRenderPass rp;
3350 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3351 ASSERT_VK_SUCCESS(err);
3352
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003353 VkImageView ivs[2];
3354 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3355 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003356 VkFramebufferCreateInfo fb_info = {};
3357 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3358 fb_info.pNext = NULL;
3359 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003360 // Set mis-matching attachmentCount
3361 fb_info.attachmentCount = 2;
3362 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003363 fb_info.width = 100;
3364 fb_info.height = 100;
3365 fb_info.layers = 1;
3366
3367 VkFramebuffer fb;
3368 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3369
3370 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003371 if (err == VK_SUCCESS) {
3372 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3373 }
3374 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003375
3376 // Create a renderPass with a depth-stencil attachment created with
3377 // IMAGE_USAGE_COLOR_ATTACHMENT
3378 // Add our color attachment to pDepthStencilAttachment
3379 subpass.pDepthStencilAttachment = &attach;
3380 subpass.pColorAttachments = NULL;
3381 VkRenderPass rp_ds;
3382 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3383 ASSERT_VK_SUCCESS(err);
3384 // Set correct attachment count, but attachment has COLOR usage bit set
3385 fb_info.attachmentCount = 1;
3386 fb_info.renderPass = rp_ds;
3387
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003389 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3390
3391 m_errorMonitor->VerifyFound();
3392 if (err == VK_SUCCESS) {
3393 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3394 }
3395 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003396
3397 // Create new renderpass with alternate attachment format from fb
3398 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3399 subpass.pDepthStencilAttachment = NULL;
3400 subpass.pColorAttachments = &attach;
3401 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3402 ASSERT_VK_SUCCESS(err);
3403
3404 // Cause error due to mis-matched formats between rp & fb
3405 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3406 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3408 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003409 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3410
3411 m_errorMonitor->VerifyFound();
3412 if (err == VK_SUCCESS) {
3413 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3414 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003415 vkDestroyRenderPass(m_device->device(), rp, NULL);
3416
3417 // Create new renderpass with alternate sample count from fb
3418 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3419 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3420 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3421 ASSERT_VK_SUCCESS(err);
3422
3423 // Cause error due to mis-matched sample count between rp & fb
3424 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has VK_SAMPLE_COUNT_1_BIT samples "
3426 "that do not match the "
3427 "VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003428 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3429
3430 m_errorMonitor->VerifyFound();
3431 if (err == VK_SUCCESS) {
3432 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3433 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003434
3435 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003436
3437 // Create a custom imageView with non-1 mip levels
3438 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003439 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003440 ASSERT_TRUE(image.initialized());
3441
3442 VkImageView view;
3443 VkImageViewCreateInfo ivci = {};
3444 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3445 ivci.image = image.handle();
3446 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3447 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3448 ivci.subresourceRange.layerCount = 1;
3449 ivci.subresourceRange.baseMipLevel = 0;
3450 // Set level count 2 (only 1 is allowed for FB attachment)
3451 ivci.subresourceRange.levelCount = 2;
3452 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3453 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3454 ASSERT_VK_SUCCESS(err);
3455 // Re-create renderpass to have matching sample count
3456 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3457 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3458 ASSERT_VK_SUCCESS(err);
3459
3460 fb_info.renderPass = rp;
3461 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003463 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3464
3465 m_errorMonitor->VerifyFound();
3466 if (err == VK_SUCCESS) {
3467 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3468 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003469 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003470 // Update view to original color buffer and grow FB dimensions too big
3471 fb_info.pAttachments = ivs;
3472 fb_info.height = 1024;
3473 fb_info.width = 1024;
3474 fb_info.layers = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at "
3476 "least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003477 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3478
3479 m_errorMonitor->VerifyFound();
3480 if (err == VK_SUCCESS) {
3481 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3482 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003483 // Create view attachment with non-identity swizzle
3484 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3485 ivci.image = image.handle();
3486 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3487 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3488 ivci.subresourceRange.layerCount = 1;
3489 ivci.subresourceRange.baseMipLevel = 0;
3490 ivci.subresourceRange.levelCount = 1;
3491 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3492 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
3493 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
3494 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
3495 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
3496 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3497 ASSERT_VK_SUCCESS(err);
3498
3499 fb_info.pAttachments = &view;
3500 fb_info.height = 100;
3501 fb_info.width = 100;
3502 fb_info.layers = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has non-identy swizzle. All "
3504 "framebuffer attachments must have "
3505 "been created with the identity "
3506 "swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003507 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3508
3509 m_errorMonitor->VerifyFound();
3510 if (err == VK_SUCCESS) {
3511 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3512 }
3513 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003514 // Request fb that exceeds max dimensions
3515 // reset attachment to color attachment
3516 fb_info.pAttachments = ivs;
3517 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
3518 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
3519 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Requested VkFramebufferCreateInfo "
3521 "dimensions exceed physical device "
3522 "limits. ");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003523 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3524
3525 m_errorMonitor->VerifyFound();
3526 if (err == VK_SUCCESS) {
3527 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3528 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003529
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003530 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003531}
3532
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003533TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003534 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Depth Bias dynamic "
3535 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003536
Cody Northropc31a84f2016-08-22 10:41:47 -06003537 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003538 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
3540 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003541 m_errorMonitor->VerifyFound();
3542}
3543
3544TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003545 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Line Width dynamic "
3546 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003547
Cody Northropc31a84f2016-08-22 10:41:47 -06003548 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003549 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
3551 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003552 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003553}
3554
3555TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003556 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Viewport dynamic "
3557 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003558
Cody Northropc31a84f2016-08-22 10:41:47 -06003559 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003560 // Dynamic viewport state
Mike Weiblen95dd0f92016-10-19 12:28:27 -06003561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003562 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003563 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003564}
3565
3566TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003567 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Scissor dynamic "
3568 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003569
Cody Northropc31a84f2016-08-22 10:41:47 -06003570 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003571 // Dynamic scissor state
Mike Weiblen95dd0f92016-10-19 12:28:27 -06003572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003573 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003574 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003575}
3576
Cortd713fe82016-07-27 09:51:27 -07003577TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003578 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Blend Constants "
3579 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003580
3581 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003582 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003583 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3584 "Dynamic blend constants state not set for this command buffer");
3585 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06003586 m_errorMonitor->VerifyFound();
3587}
3588
3589TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003590 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Depth Bounds dynamic "
3591 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003592
3593 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003594 if (!m_device->phy().features().depthBounds) {
3595 printf("Device does not support depthBounds test; skipped.\n");
3596 return;
3597 }
3598 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003599 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3600 "Dynamic depth bounds state not set for this command buffer");
3601 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003602 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003603}
3604
3605TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003606 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Read dynamic "
3607 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003608
3609 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003610 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3612 "Dynamic stencil read mask state not set for this command buffer");
3613 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003614 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003615}
3616
3617TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003618 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Write dynamic"
3619 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003620
3621 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003622 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3624 "Dynamic stencil write mask state not set for this command buffer");
3625 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003626 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003627}
3628
3629TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003630 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Ref dynamic "
3631 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003632
3633 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003634 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3636 "Dynamic stencil reference state not set for this command buffer");
3637 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003638 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06003639}
3640
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06003641TEST_F(VkLayerTest, IndexBufferNotBound) {
3642 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003643
3644 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3646 "Index buffer object not bound to this command buffer when Indexed ");
3647 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06003648 m_errorMonitor->VerifyFound();
3649}
3650
Karl Schultz6addd812016-02-02 17:17:23 -07003651TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3653 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
3654 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003655
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003656 ASSERT_NO_FATAL_FAILURE(InitState());
3657 ASSERT_NO_FATAL_FAILURE(InitViewport());
3658 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3659
Karl Schultz6addd812016-02-02 17:17:23 -07003660 // We luck out b/c by default the framework creates CB w/ the
3661 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003662 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003663 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003664 EndCommandBuffer();
3665
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003666 // Bypass framework since it does the waits automatically
3667 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003668 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003669 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3670 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003671 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003672 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003673 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003674 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003675 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003676 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003677 submit_info.pSignalSemaphores = NULL;
3678
Chris Forbes40028e22016-06-13 09:59:34 +12003679 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07003680 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07003681 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003682
Karl Schultz6addd812016-02-02 17:17:23 -07003683 // Cause validation error by re-submitting cmd buffer that should only be
3684 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12003685 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07003686 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003687
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003688 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003689}
3690
Karl Schultz6addd812016-02-02 17:17:23 -07003691TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003692 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07003693 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003694
3695 ASSERT_NO_FATAL_FAILURE(InitState());
3696 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003697
Karl Schultz6addd812016-02-02 17:17:23 -07003698 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
3699 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003700 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003701 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003702 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003703
3704 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003705 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3706 ds_pool_ci.pNext = NULL;
3707 ds_pool_ci.flags = 0;
3708 ds_pool_ci.maxSets = 1;
3709 ds_pool_ci.poolSizeCount = 1;
3710 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003711
3712 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003713 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003714 ASSERT_VK_SUCCESS(err);
3715
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003716 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
3717 dsl_binding_samp.binding = 0;
3718 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3719 dsl_binding_samp.descriptorCount = 1;
3720 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
3721 dsl_binding_samp.pImmutableSamplers = NULL;
3722
3723 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3724 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3725 ds_layout_ci.pNext = NULL;
3726 ds_layout_ci.bindingCount = 1;
3727 ds_layout_ci.pBindings = &dsl_binding_samp;
3728
3729 VkDescriptorSetLayout ds_layout_samp;
3730 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
3731 ASSERT_VK_SUCCESS(err);
3732
3733 // Try to allocate 2 sets when pool only has 1 set
3734 VkDescriptorSet descriptor_sets[2];
3735 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
3736 VkDescriptorSetAllocateInfo alloc_info = {};
3737 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3738 alloc_info.descriptorSetCount = 2;
3739 alloc_info.descriptorPool = ds_pool;
3740 alloc_info.pSetLayouts = set_layouts;
3741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
3742 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
3743 m_errorMonitor->VerifyFound();
3744
3745 alloc_info.descriptorSetCount = 1;
3746 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003747 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003748 dsl_binding.binding = 0;
3749 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3750 dsl_binding.descriptorCount = 1;
3751 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3752 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003753
Karl Schultz6addd812016-02-02 17:17:23 -07003754 ds_layout_ci.bindingCount = 1;
3755 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003756
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003757 VkDescriptorSetLayout ds_layout_ub;
3758 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003759 ASSERT_VK_SUCCESS(err);
3760
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003761 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003762 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003763 alloc_info.pSetLayouts = &ds_layout_ub;
3764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
3765 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003766
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003767 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003768
Karl Schultz2825ab92016-12-02 08:23:14 -07003769 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003770 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08003771 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003772}
3773
Karl Schultz6addd812016-02-02 17:17:23 -07003774TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
3775 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06003776
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3778 "It is invalid to call vkFreeDescriptorSets() with a pool created "
3779 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003780
Tobin Ehlise735c692015-10-08 13:13:50 -06003781 ASSERT_NO_FATAL_FAILURE(InitState());
3782 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06003783
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003784 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003785 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3786 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06003787
3788 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003789 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3790 ds_pool_ci.pNext = NULL;
3791 ds_pool_ci.maxSets = 1;
3792 ds_pool_ci.poolSizeCount = 1;
3793 ds_pool_ci.flags = 0;
3794 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
3795 // app can only call vkResetDescriptorPool on this pool.;
3796 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06003797
3798 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003799 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06003800 ASSERT_VK_SUCCESS(err);
3801
3802 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003803 dsl_binding.binding = 0;
3804 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3805 dsl_binding.descriptorCount = 1;
3806 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3807 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06003808
3809 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003810 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3811 ds_layout_ci.pNext = NULL;
3812 ds_layout_ci.bindingCount = 1;
3813 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06003814
3815 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003816 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06003817 ASSERT_VK_SUCCESS(err);
3818
3819 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003820 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003821 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003822 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003823 alloc_info.descriptorPool = ds_pool;
3824 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003825 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06003826 ASSERT_VK_SUCCESS(err);
3827
3828 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003829 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06003830
Chia-I Wuf7458c52015-10-26 21:10:41 +08003831 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3832 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06003833}
3834
Karl Schultz6addd812016-02-02 17:17:23 -07003835TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003836 // Attempt to clear Descriptor Pool with bad object.
3837 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06003838
3839 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003841 uint64_t fake_pool_handle = 0xbaad6001;
3842 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
3843 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06003844 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003845}
3846
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003847TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003848 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
3849 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003850 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06003851 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003852
3853 uint64_t fake_set_handle = 0xbaad6001;
3854 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003855 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06003857
3858 ASSERT_NO_FATAL_FAILURE(InitState());
3859
3860 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
3861 layout_bindings[0].binding = 0;
3862 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3863 layout_bindings[0].descriptorCount = 1;
3864 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3865 layout_bindings[0].pImmutableSamplers = NULL;
3866
3867 VkDescriptorSetLayout descriptor_set_layout;
3868 VkDescriptorSetLayoutCreateInfo dslci = {};
3869 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3870 dslci.pNext = NULL;
3871 dslci.bindingCount = 1;
3872 dslci.pBindings = layout_bindings;
3873 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003874 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003875
3876 VkPipelineLayout pipeline_layout;
3877 VkPipelineLayoutCreateInfo plci = {};
3878 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3879 plci.pNext = NULL;
3880 plci.setLayoutCount = 1;
3881 plci.pSetLayouts = &descriptor_set_layout;
3882 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003883 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003884
3885 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003886 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
3887 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06003888 m_errorMonitor->VerifyFound();
3889 EndCommandBuffer();
3890 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
3891 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003892}
3893
Karl Schultz6addd812016-02-02 17:17:23 -07003894TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003895 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
3896 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003897 uint64_t fake_layout_handle = 0xbaad6001;
3898 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Cody Northropc31a84f2016-08-22 10:41:47 -06003900 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06003901 VkPipelineLayout pipeline_layout;
3902 VkPipelineLayoutCreateInfo plci = {};
3903 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3904 plci.pNext = NULL;
3905 plci.setLayoutCount = 1;
3906 plci.pSetLayouts = &bad_layout;
3907 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
3908
3909 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003910}
3911
Mark Muellerd4914412016-06-13 17:52:06 -06003912TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
3913 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
3914 "1) A uniform buffer update must have a valid buffer index."
3915 "2) When using an array of descriptors in a single WriteDescriptor,"
3916 " the descriptor types and stageflags must all be the same."
3917 "3) Immutable Sampler state must match across descriptors");
3918
3919 const char *invalid_BufferInfo_ErrorMessage =
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003920 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
3921 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
3922 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
3923 const char *stateFlag_ErrorMessage = "Attempting write update to descriptor set ";
3924 const char *immutable_ErrorMessage = "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06003925
Mark Muellerd4914412016-06-13 17:52:06 -06003926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
3927
3928 ASSERT_NO_FATAL_FAILURE(InitState());
3929 VkDescriptorPoolSize ds_type_count[4] = {};
3930 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3931 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07003932 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06003933 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07003934 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06003935 ds_type_count[2].descriptorCount = 1;
3936 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3937 ds_type_count[3].descriptorCount = 1;
3938
3939 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3940 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3941 ds_pool_ci.maxSets = 1;
3942 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
3943 ds_pool_ci.pPoolSizes = ds_type_count;
3944
3945 VkDescriptorPool ds_pool;
3946 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3947 ASSERT_VK_SUCCESS(err);
3948
Mark Muellerb9896722016-06-16 09:54:29 -06003949 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06003950 layout_binding[0].binding = 0;
3951 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3952 layout_binding[0].descriptorCount = 1;
3953 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3954 layout_binding[0].pImmutableSamplers = NULL;
3955
3956 layout_binding[1].binding = 1;
3957 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3958 layout_binding[1].descriptorCount = 1;
3959 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
3960 layout_binding[1].pImmutableSamplers = NULL;
3961
3962 VkSamplerCreateInfo sampler_ci = {};
3963 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3964 sampler_ci.pNext = NULL;
3965 sampler_ci.magFilter = VK_FILTER_NEAREST;
3966 sampler_ci.minFilter = VK_FILTER_NEAREST;
3967 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3968 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3969 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3970 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3971 sampler_ci.mipLodBias = 1.0;
3972 sampler_ci.anisotropyEnable = VK_FALSE;
3973 sampler_ci.maxAnisotropy = 1;
3974 sampler_ci.compareEnable = VK_FALSE;
3975 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3976 sampler_ci.minLod = 1.0;
3977 sampler_ci.maxLod = 1.0;
3978 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3979 sampler_ci.unnormalizedCoordinates = VK_FALSE;
3980 VkSampler sampler;
3981
3982 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
3983 ASSERT_VK_SUCCESS(err);
3984
3985 layout_binding[2].binding = 2;
3986 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3987 layout_binding[2].descriptorCount = 1;
3988 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
3989 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
3990
Mark Muellerd4914412016-06-13 17:52:06 -06003991 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3992 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3993 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
3994 ds_layout_ci.pBindings = layout_binding;
3995 VkDescriptorSetLayout ds_layout;
3996 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
3997 ASSERT_VK_SUCCESS(err);
3998
3999 VkDescriptorSetAllocateInfo alloc_info = {};
4000 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4001 alloc_info.descriptorSetCount = 1;
4002 alloc_info.descriptorPool = ds_pool;
4003 alloc_info.pSetLayouts = &ds_layout;
4004 VkDescriptorSet descriptorSet;
4005 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4006 ASSERT_VK_SUCCESS(err);
4007
4008 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4009 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4010 pipeline_layout_ci.pNext = NULL;
4011 pipeline_layout_ci.setLayoutCount = 1;
4012 pipeline_layout_ci.pSetLayouts = &ds_layout;
4013
4014 VkPipelineLayout pipeline_layout;
4015 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4016 ASSERT_VK_SUCCESS(err);
4017
Mark Mueller5c838ce2016-06-16 09:54:29 -06004018 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004019 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4020 descriptor_write.dstSet = descriptorSet;
4021 descriptor_write.dstBinding = 0;
4022 descriptor_write.descriptorCount = 1;
4023 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4024
Mark Mueller5c838ce2016-06-16 09:54:29 -06004025 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004026 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4027 m_errorMonitor->VerifyFound();
4028
4029 // Create a buffer to update the descriptor with
4030 uint32_t qfi = 0;
4031 VkBufferCreateInfo buffCI = {};
4032 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4033 buffCI.size = 1024;
4034 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4035 buffCI.queueFamilyIndexCount = 1;
4036 buffCI.pQueueFamilyIndices = &qfi;
4037
4038 VkBuffer dyub;
4039 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4040 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004041
Tony Barboure132c5f2016-12-12 11:50:20 -07004042 VkDeviceMemory mem;
4043 VkMemoryRequirements mem_reqs;
4044 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4045
4046 VkMemoryAllocateInfo mem_alloc_info = {};
4047 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4048 mem_alloc_info.allocationSize = mem_reqs.size;
4049 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4050 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4051 ASSERT_VK_SUCCESS(err);
4052
4053 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4054 ASSERT_VK_SUCCESS(err);
4055
4056 VkDescriptorBufferInfo buffInfo[2] = {};
4057 buffInfo[0].buffer = dyub;
4058 buffInfo[0].offset = 0;
4059 buffInfo[0].range = 1024;
4060 buffInfo[1].buffer = dyub;
4061 buffInfo[1].offset = 0;
4062 buffInfo[1].range = 1024;
4063 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004064 descriptor_write.descriptorCount = 2;
4065
Mark Mueller5c838ce2016-06-16 09:54:29 -06004066 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06004067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
4068 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4069 m_errorMonitor->VerifyFound();
4070
Mark Mueller5c838ce2016-06-16 09:54:29 -06004071 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4072 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004073 descriptor_write.dstBinding = 1;
4074 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004075
Mark Mueller5c838ce2016-06-16 09:54:29 -06004076 // Make pImageInfo index non-null to avoid complaints of it missing
4077 VkDescriptorImageInfo imageInfo = {};
4078 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4079 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
4081 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4082 m_errorMonitor->VerifyFound();
4083
Mark Muellerd4914412016-06-13 17:52:06 -06004084 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004085 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004086 vkDestroySampler(m_device->device(), sampler, NULL);
4087 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4088 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4089 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4090}
4091
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004092TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
4093 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4094 "due to a buffer dependency being destroyed.");
4095 ASSERT_NO_FATAL_FAILURE(InitState());
4096
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004097 VkBuffer buffer;
4098 VkDeviceMemory mem;
4099 VkMemoryRequirements mem_reqs;
4100
4101 VkBufferCreateInfo buf_info = {};
4102 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004103 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004104 buf_info.size = 256;
4105 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4106 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4107 ASSERT_VK_SUCCESS(err);
4108
4109 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4110
4111 VkMemoryAllocateInfo alloc_info = {};
4112 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4113 alloc_info.allocationSize = 256;
4114 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004115 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004116 if (!pass) {
4117 vkDestroyBuffer(m_device->device(), buffer, NULL);
4118 return;
4119 }
4120 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4121 ASSERT_VK_SUCCESS(err);
4122
4123 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4124 ASSERT_VK_SUCCESS(err);
4125
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004126 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004127 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004128 m_commandBuffer->EndCommandBuffer();
4129
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004131 // Destroy buffer dependency prior to submit to cause ERROR
4132 vkDestroyBuffer(m_device->device(), buffer, NULL);
4133
4134 VkSubmitInfo submit_info = {};
4135 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4136 submit_info.commandBufferCount = 1;
4137 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4138 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4139
4140 m_errorMonitor->VerifyFound();
4141 vkFreeMemory(m_device->handle(), mem, NULL);
4142}
4143
Tobin Ehlisea413442016-09-28 10:23:59 -06004144TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4145 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4146
4147 ASSERT_NO_FATAL_FAILURE(InitState());
4148 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4149
4150 VkDescriptorPoolSize ds_type_count;
4151 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4152 ds_type_count.descriptorCount = 1;
4153
4154 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4155 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4156 ds_pool_ci.maxSets = 1;
4157 ds_pool_ci.poolSizeCount = 1;
4158 ds_pool_ci.pPoolSizes = &ds_type_count;
4159
4160 VkDescriptorPool ds_pool;
4161 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4162 ASSERT_VK_SUCCESS(err);
4163
4164 VkDescriptorSetLayoutBinding layout_binding;
4165 layout_binding.binding = 0;
4166 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4167 layout_binding.descriptorCount = 1;
4168 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4169 layout_binding.pImmutableSamplers = NULL;
4170
4171 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4172 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4173 ds_layout_ci.bindingCount = 1;
4174 ds_layout_ci.pBindings = &layout_binding;
4175 VkDescriptorSetLayout ds_layout;
4176 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4177 ASSERT_VK_SUCCESS(err);
4178
4179 VkDescriptorSetAllocateInfo alloc_info = {};
4180 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4181 alloc_info.descriptorSetCount = 1;
4182 alloc_info.descriptorPool = ds_pool;
4183 alloc_info.pSetLayouts = &ds_layout;
4184 VkDescriptorSet descriptor_set;
4185 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4186 ASSERT_VK_SUCCESS(err);
4187
4188 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4189 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4190 pipeline_layout_ci.pNext = NULL;
4191 pipeline_layout_ci.setLayoutCount = 1;
4192 pipeline_layout_ci.pSetLayouts = &ds_layout;
4193
4194 VkPipelineLayout pipeline_layout;
4195 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4196 ASSERT_VK_SUCCESS(err);
4197
4198 VkBuffer buffer;
4199 uint32_t queue_family_index = 0;
4200 VkBufferCreateInfo buffer_create_info = {};
4201 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4202 buffer_create_info.size = 1024;
4203 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4204 buffer_create_info.queueFamilyIndexCount = 1;
4205 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4206
4207 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4208 ASSERT_VK_SUCCESS(err);
4209
4210 VkMemoryRequirements memory_reqs;
4211 VkDeviceMemory buffer_memory;
4212
4213 VkMemoryAllocateInfo memory_info = {};
4214 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4215 memory_info.allocationSize = 0;
4216 memory_info.memoryTypeIndex = 0;
4217
4218 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4219 memory_info.allocationSize = memory_reqs.size;
4220 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4221 ASSERT_TRUE(pass);
4222
4223 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4224 ASSERT_VK_SUCCESS(err);
4225 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4226 ASSERT_VK_SUCCESS(err);
4227
4228 VkBufferView view;
4229 VkBufferViewCreateInfo bvci = {};
4230 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4231 bvci.buffer = buffer;
4232 bvci.format = VK_FORMAT_R8_UNORM;
4233 bvci.range = VK_WHOLE_SIZE;
4234
4235 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4236 ASSERT_VK_SUCCESS(err);
4237
4238 VkWriteDescriptorSet descriptor_write = {};
4239 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4240 descriptor_write.dstSet = descriptor_set;
4241 descriptor_write.dstBinding = 0;
4242 descriptor_write.descriptorCount = 1;
4243 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4244 descriptor_write.pTexelBufferView = &view;
4245
4246 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4247
4248 char const *vsSource = "#version 450\n"
4249 "\n"
4250 "out gl_PerVertex { \n"
4251 " vec4 gl_Position;\n"
4252 "};\n"
4253 "void main(){\n"
4254 " gl_Position = vec4(1);\n"
4255 "}\n";
4256 char const *fsSource = "#version 450\n"
4257 "\n"
4258 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4259 "layout(location=0) out vec4 x;\n"
4260 "void main(){\n"
4261 " x = imageLoad(s, 0);\n"
4262 "}\n";
4263 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4264 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4265 VkPipelineObj pipe(m_device);
4266 pipe.AddShader(&vs);
4267 pipe.AddShader(&fs);
4268 pipe.AddColorAttachment();
4269 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4270
4271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted buffer view ");
4272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4273
4274 BeginCommandBuffer();
4275 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4276 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4277 VkRect2D scissor = {{0, 0}, {16, 16}};
4278 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4279 // Bind pipeline to cmd buffer
4280 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4281 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4282 &descriptor_set, 0, nullptr);
4283 Draw(1, 0, 0, 0);
4284 EndCommandBuffer();
4285
4286 // Delete BufferView in order to invalidate cmd buffer
4287 vkDestroyBufferView(m_device->device(), view, NULL);
4288 // Now attempt submit of cmd buffer
4289 VkSubmitInfo submit_info = {};
4290 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4291 submit_info.commandBufferCount = 1;
4292 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4293 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4294 m_errorMonitor->VerifyFound();
4295
4296 // Clean-up
4297 vkDestroyBuffer(m_device->device(), buffer, NULL);
4298 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4299 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4300 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4301 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4302}
4303
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004304TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
4305 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4306 "due to an image dependency being destroyed.");
4307 ASSERT_NO_FATAL_FAILURE(InitState());
4308
4309 VkImage image;
4310 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4311 VkImageCreateInfo image_create_info = {};
4312 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4313 image_create_info.pNext = NULL;
4314 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4315 image_create_info.format = tex_format;
4316 image_create_info.extent.width = 32;
4317 image_create_info.extent.height = 32;
4318 image_create_info.extent.depth = 1;
4319 image_create_info.mipLevels = 1;
4320 image_create_info.arrayLayers = 1;
4321 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4322 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004323 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004324 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004325 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004326 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004327 // Have to bind memory to image before recording cmd in cmd buffer using it
4328 VkMemoryRequirements mem_reqs;
4329 VkDeviceMemory image_mem;
4330 bool pass;
4331 VkMemoryAllocateInfo mem_alloc = {};
4332 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4333 mem_alloc.pNext = NULL;
4334 mem_alloc.memoryTypeIndex = 0;
4335 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4336 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004337 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004338 ASSERT_TRUE(pass);
4339 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4340 ASSERT_VK_SUCCESS(err);
4341 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4342 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004343
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004344 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004345 VkClearColorValue ccv;
4346 ccv.float32[0] = 1.0f;
4347 ccv.float32[1] = 1.0f;
4348 ccv.float32[2] = 1.0f;
4349 ccv.float32[3] = 1.0f;
4350 VkImageSubresourceRange isr = {};
4351 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004352 isr.baseArrayLayer = 0;
4353 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004354 isr.layerCount = 1;
4355 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004356 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004357 m_commandBuffer->EndCommandBuffer();
4358
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004359 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004360 // Destroy image dependency prior to submit to cause ERROR
4361 vkDestroyImage(m_device->device(), image, NULL);
4362
4363 VkSubmitInfo submit_info = {};
4364 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4365 submit_info.commandBufferCount = 1;
4366 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4367 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4368
4369 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004370 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004371}
4372
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004373TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
4374 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4375 "due to a framebuffer image dependency being destroyed.");
4376 VkFormatProperties format_properties;
4377 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004378 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4379 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004380 return;
4381 }
4382
4383 ASSERT_NO_FATAL_FAILURE(InitState());
4384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4385
4386 VkImageCreateInfo image_ci = {};
4387 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4388 image_ci.pNext = NULL;
4389 image_ci.imageType = VK_IMAGE_TYPE_2D;
4390 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4391 image_ci.extent.width = 32;
4392 image_ci.extent.height = 32;
4393 image_ci.extent.depth = 1;
4394 image_ci.mipLevels = 1;
4395 image_ci.arrayLayers = 1;
4396 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4397 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004398 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004399 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4400 image_ci.flags = 0;
4401 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004402 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004403
4404 VkMemoryRequirements memory_reqs;
4405 VkDeviceMemory image_memory;
4406 bool pass;
4407 VkMemoryAllocateInfo memory_info = {};
4408 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4409 memory_info.pNext = NULL;
4410 memory_info.allocationSize = 0;
4411 memory_info.memoryTypeIndex = 0;
4412 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4413 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004414 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004415 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004416 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004417 ASSERT_VK_SUCCESS(err);
4418 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4419 ASSERT_VK_SUCCESS(err);
4420
4421 VkImageViewCreateInfo ivci = {
4422 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4423 nullptr,
4424 0,
4425 image,
4426 VK_IMAGE_VIEW_TYPE_2D,
4427 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004428 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004429 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4430 };
4431 VkImageView view;
4432 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4433 ASSERT_VK_SUCCESS(err);
4434
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004435 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004436 VkFramebuffer fb;
4437 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4438 ASSERT_VK_SUCCESS(err);
4439
4440 // Just use default renderpass with our framebuffer
4441 m_renderPassBeginInfo.framebuffer = fb;
4442 // Create Null cmd buffer for submit
4443 BeginCommandBuffer();
4444 EndCommandBuffer();
4445 // Destroy image attached to framebuffer to invalidate cmd buffer
4446 vkDestroyImage(m_device->device(), image, NULL);
4447 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004449 QueueCommandBuffer(false);
4450 m_errorMonitor->VerifyFound();
4451
4452 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4453 vkDestroyImageView(m_device->device(), view, nullptr);
4454 vkFreeMemory(m_device->device(), image_memory, nullptr);
4455}
4456
Tobin Ehlisb329f992016-10-12 13:20:29 -06004457TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
4458 TEST_DESCRIPTION("Delete in-use framebuffer.");
4459 VkFormatProperties format_properties;
4460 VkResult err = VK_SUCCESS;
4461 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4462
4463 ASSERT_NO_FATAL_FAILURE(InitState());
4464 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4465
4466 VkImageObj image(m_device);
4467 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4468 ASSERT_TRUE(image.initialized());
4469 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
4470
4471 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4472 VkFramebuffer fb;
4473 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4474 ASSERT_VK_SUCCESS(err);
4475
4476 // Just use default renderpass with our framebuffer
4477 m_renderPassBeginInfo.framebuffer = fb;
4478 // Create Null cmd buffer for submit
4479 BeginCommandBuffer();
4480 EndCommandBuffer();
4481 // Submit cmd buffer to put it in-flight
4482 VkSubmitInfo submit_info = {};
4483 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4484 submit_info.commandBufferCount = 1;
4485 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4486 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4487 // Destroy framebuffer while in-flight
4488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete framebuffer 0x");
4489 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4490 m_errorMonitor->VerifyFound();
4491 // Wait for queue to complete so we can safely destroy everything
4492 vkQueueWaitIdle(m_device->m_queue);
4493 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4494}
4495
Tobin Ehlis88becd72016-09-21 14:33:41 -06004496TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
4497 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
4498 VkFormatProperties format_properties;
4499 VkResult err = VK_SUCCESS;
4500 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06004501
4502 ASSERT_NO_FATAL_FAILURE(InitState());
4503 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4504
4505 VkImageCreateInfo image_ci = {};
4506 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4507 image_ci.pNext = NULL;
4508 image_ci.imageType = VK_IMAGE_TYPE_2D;
4509 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4510 image_ci.extent.width = 256;
4511 image_ci.extent.height = 256;
4512 image_ci.extent.depth = 1;
4513 image_ci.mipLevels = 1;
4514 image_ci.arrayLayers = 1;
4515 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4516 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06004517 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06004518 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4519 image_ci.flags = 0;
4520 VkImage image;
4521 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
4522
4523 VkMemoryRequirements memory_reqs;
4524 VkDeviceMemory image_memory;
4525 bool pass;
4526 VkMemoryAllocateInfo memory_info = {};
4527 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4528 memory_info.pNext = NULL;
4529 memory_info.allocationSize = 0;
4530 memory_info.memoryTypeIndex = 0;
4531 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4532 memory_info.allocationSize = memory_reqs.size;
4533 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4534 ASSERT_TRUE(pass);
4535 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
4536 ASSERT_VK_SUCCESS(err);
4537 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4538 ASSERT_VK_SUCCESS(err);
4539
4540 VkImageViewCreateInfo ivci = {
4541 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4542 nullptr,
4543 0,
4544 image,
4545 VK_IMAGE_VIEW_TYPE_2D,
4546 VK_FORMAT_B8G8R8A8_UNORM,
4547 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
4548 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4549 };
4550 VkImageView view;
4551 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4552 ASSERT_VK_SUCCESS(err);
4553
4554 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4555 VkFramebuffer fb;
4556 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4557 ASSERT_VK_SUCCESS(err);
4558
4559 // Just use default renderpass with our framebuffer
4560 m_renderPassBeginInfo.framebuffer = fb;
4561 // Create Null cmd buffer for submit
4562 BeginCommandBuffer();
4563 EndCommandBuffer();
4564 // Submit cmd buffer to put it (and attached imageView) in-flight
4565 VkSubmitInfo submit_info = {};
4566 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4567 submit_info.commandBufferCount = 1;
4568 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4569 // Submit cmd buffer to put framebuffer and children in-flight
4570 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4571 // Destroy image attached to framebuffer while in-flight
4572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete image 0x");
4573 vkDestroyImage(m_device->device(), image, NULL);
4574 m_errorMonitor->VerifyFound();
4575 // Wait for queue to complete so we can safely destroy image and other objects
4576 vkQueueWaitIdle(m_device->m_queue);
4577 vkDestroyImage(m_device->device(), image, NULL);
4578 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4579 vkDestroyImageView(m_device->device(), view, nullptr);
4580 vkFreeMemory(m_device->device(), image_memory, nullptr);
4581}
4582
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06004583TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
4584 TEST_DESCRIPTION("Delete in-use renderPass.");
4585
4586 ASSERT_NO_FATAL_FAILURE(InitState());
4587 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4588
4589 // Create simple renderpass
4590 VkAttachmentReference attach = {};
4591 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4592 VkSubpassDescription subpass = {};
4593 subpass.pColorAttachments = &attach;
4594 VkRenderPassCreateInfo rpci = {};
4595 rpci.subpassCount = 1;
4596 rpci.pSubpasses = &subpass;
4597 rpci.attachmentCount = 1;
4598 VkAttachmentDescription attach_desc = {};
4599 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4600 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4601 rpci.pAttachments = &attach_desc;
4602 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4603 VkRenderPass rp;
4604 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4605 ASSERT_VK_SUCCESS(err);
4606
4607 // Create a pipeline that uses the given renderpass
4608 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4609 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4610
4611 VkPipelineLayout pipeline_layout;
4612 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4613 ASSERT_VK_SUCCESS(err);
4614
4615 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4616 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4617 vp_state_ci.viewportCount = 1;
4618 VkViewport vp = {}; // Just need dummy vp to point to
4619 vp_state_ci.pViewports = &vp;
4620 vp_state_ci.scissorCount = 1;
4621 VkRect2D scissors = {}; // Dummy scissors to point to
4622 vp_state_ci.pScissors = &scissors;
4623
4624 VkPipelineShaderStageCreateInfo shaderStages[2];
4625 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4626
4627 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
4628 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
4629 // but add it to be able to run on more devices
4630 shaderStages[0] = vs.GetStageCreateInfo();
4631 shaderStages[1] = fs.GetStageCreateInfo();
4632
4633 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4634 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4635
4636 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4637 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4638 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4639
4640 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4641 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4642 rs_ci.rasterizerDiscardEnable = true;
4643 rs_ci.lineWidth = 1.0f;
4644
4645 VkPipelineColorBlendAttachmentState att = {};
4646 att.blendEnable = VK_FALSE;
4647 att.colorWriteMask = 0xf;
4648
4649 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4650 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4651 cb_ci.attachmentCount = 1;
4652 cb_ci.pAttachments = &att;
4653
4654 VkGraphicsPipelineCreateInfo gp_ci = {};
4655 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4656 gp_ci.stageCount = 2;
4657 gp_ci.pStages = shaderStages;
4658 gp_ci.pVertexInputState = &vi_ci;
4659 gp_ci.pInputAssemblyState = &ia_ci;
4660 gp_ci.pViewportState = &vp_state_ci;
4661 gp_ci.pRasterizationState = &rs_ci;
4662 gp_ci.pColorBlendState = &cb_ci;
4663 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4664 gp_ci.layout = pipeline_layout;
4665 gp_ci.renderPass = rp;
4666
4667 VkPipelineCacheCreateInfo pc_ci = {};
4668 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4669
4670 VkPipeline pipeline;
4671 VkPipelineCache pipe_cache;
4672 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
4673 ASSERT_VK_SUCCESS(err);
4674
4675 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
4676 ASSERT_VK_SUCCESS(err);
4677 // Bind pipeline to cmd buffer, will also bind renderpass
4678 m_commandBuffer->BeginCommandBuffer();
4679 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4680 m_commandBuffer->EndCommandBuffer();
4681
4682 VkSubmitInfo submit_info = {};
4683 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4684 submit_info.commandBufferCount = 1;
4685 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4686 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4687
4688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
4689 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4690 m_errorMonitor->VerifyFound();
4691
4692 // Wait for queue to complete so we can safely destroy everything
4693 vkQueueWaitIdle(m_device->m_queue);
4694 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4695 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
4696 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
4697 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
4698}
4699
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004700TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004701 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004702 ASSERT_NO_FATAL_FAILURE(InitState());
4703
4704 VkImage image;
4705 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4706 VkImageCreateInfo image_create_info = {};
4707 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4708 image_create_info.pNext = NULL;
4709 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4710 image_create_info.format = tex_format;
4711 image_create_info.extent.width = 32;
4712 image_create_info.extent.height = 32;
4713 image_create_info.extent.depth = 1;
4714 image_create_info.mipLevels = 1;
4715 image_create_info.arrayLayers = 1;
4716 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4717 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004718 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004719 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004720 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004721 ASSERT_VK_SUCCESS(err);
4722 // Have to bind memory to image before recording cmd in cmd buffer using it
4723 VkMemoryRequirements mem_reqs;
4724 VkDeviceMemory image_mem;
4725 bool pass;
4726 VkMemoryAllocateInfo mem_alloc = {};
4727 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4728 mem_alloc.pNext = NULL;
4729 mem_alloc.memoryTypeIndex = 0;
4730 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4731 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004732 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004733 ASSERT_TRUE(pass);
4734 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4735 ASSERT_VK_SUCCESS(err);
4736
Tobin Ehlisfed999f2016-09-21 15:09:45 -06004737 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
4738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06004739 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004740
4741 m_commandBuffer->BeginCommandBuffer();
4742 VkClearColorValue ccv;
4743 ccv.float32[0] = 1.0f;
4744 ccv.float32[1] = 1.0f;
4745 ccv.float32[2] = 1.0f;
4746 ccv.float32[3] = 1.0f;
4747 VkImageSubresourceRange isr = {};
4748 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4749 isr.baseArrayLayer = 0;
4750 isr.baseMipLevel = 0;
4751 isr.layerCount = 1;
4752 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004753 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004754 m_commandBuffer->EndCommandBuffer();
4755
4756 m_errorMonitor->VerifyFound();
4757 vkDestroyImage(m_device->device(), image, NULL);
4758 vkFreeMemory(m_device->device(), image_mem, nullptr);
4759}
4760
4761TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004762 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004763 ASSERT_NO_FATAL_FAILURE(InitState());
4764
4765 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004766 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004767 VK_IMAGE_TILING_OPTIMAL, 0);
4768 ASSERT_TRUE(image.initialized());
4769
4770 VkBuffer buffer;
4771 VkDeviceMemory mem;
4772 VkMemoryRequirements mem_reqs;
4773
4774 VkBufferCreateInfo buf_info = {};
4775 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12004776 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004777 buf_info.size = 256;
4778 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4779 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4780 ASSERT_VK_SUCCESS(err);
4781
4782 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4783
4784 VkMemoryAllocateInfo alloc_info = {};
4785 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4786 alloc_info.allocationSize = 256;
4787 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004788 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004789 if (!pass) {
4790 vkDestroyBuffer(m_device->device(), buffer, NULL);
4791 return;
4792 }
4793 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4794 ASSERT_VK_SUCCESS(err);
4795
Tobin Ehlisfed999f2016-09-21 15:09:45 -06004796 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06004798 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004799 VkBufferImageCopy region = {};
4800 region.bufferRowLength = 128;
4801 region.bufferImageHeight = 128;
4802 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4803
4804 region.imageSubresource.layerCount = 1;
4805 region.imageExtent.height = 4;
4806 region.imageExtent.width = 4;
4807 region.imageExtent.depth = 1;
4808 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004809 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
4810 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004811 m_commandBuffer->EndCommandBuffer();
4812
4813 m_errorMonitor->VerifyFound();
4814
4815 vkDestroyBuffer(m_device->device(), buffer, NULL);
4816 vkFreeMemory(m_device->handle(), mem, NULL);
4817}
4818
Tobin Ehlis85940f52016-07-07 16:57:21 -06004819TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
4820 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4821 "due to an event dependency being destroyed.");
4822 ASSERT_NO_FATAL_FAILURE(InitState());
4823
4824 VkEvent event;
4825 VkEventCreateInfo evci = {};
4826 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4827 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
4828 ASSERT_VK_SUCCESS(result);
4829
4830 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004831 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06004832 m_commandBuffer->EndCommandBuffer();
4833
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06004835 // Destroy event dependency prior to submit to cause ERROR
4836 vkDestroyEvent(m_device->device(), event, NULL);
4837
4838 VkSubmitInfo submit_info = {};
4839 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4840 submit_info.commandBufferCount = 1;
4841 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4842 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4843
4844 m_errorMonitor->VerifyFound();
4845}
4846
Tobin Ehlisdbea7552016-07-08 14:33:31 -06004847TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
4848 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4849 "due to a query pool dependency being destroyed.");
4850 ASSERT_NO_FATAL_FAILURE(InitState());
4851
4852 VkQueryPool query_pool;
4853 VkQueryPoolCreateInfo qpci{};
4854 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
4855 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
4856 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004857 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06004858 ASSERT_VK_SUCCESS(result);
4859
4860 m_commandBuffer->BeginCommandBuffer();
4861 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
4862 m_commandBuffer->EndCommandBuffer();
4863
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06004865 // Destroy query pool dependency prior to submit to cause ERROR
4866 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
4867
4868 VkSubmitInfo submit_info = {};
4869 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4870 submit_info.commandBufferCount = 1;
4871 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4872 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4873
4874 m_errorMonitor->VerifyFound();
4875}
4876
Tobin Ehlis24130d92016-07-08 15:50:53 -06004877TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
4878 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4879 "due to a pipeline dependency being destroyed.");
4880 ASSERT_NO_FATAL_FAILURE(InitState());
4881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4882
4883 VkResult err;
4884
4885 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4886 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4887
4888 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004889 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004890 ASSERT_VK_SUCCESS(err);
4891
4892 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4893 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4894 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004895 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06004896 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004897 vp_state_ci.scissorCount = 1;
4898 VkRect2D scissors = {}; // Dummy scissors to point to
4899 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004900
4901 VkPipelineShaderStageCreateInfo shaderStages[2];
4902 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4903
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004904 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
4905 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
4906 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06004907 shaderStages[0] = vs.GetStageCreateInfo();
4908 shaderStages[1] = fs.GetStageCreateInfo();
4909
4910 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4911 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4912
4913 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4914 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4915 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4916
4917 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4918 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12004919 rs_ci.rasterizerDiscardEnable = true;
4920 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004921
4922 VkPipelineColorBlendAttachmentState att = {};
4923 att.blendEnable = VK_FALSE;
4924 att.colorWriteMask = 0xf;
4925
4926 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4927 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4928 cb_ci.attachmentCount = 1;
4929 cb_ci.pAttachments = &att;
4930
4931 VkGraphicsPipelineCreateInfo gp_ci = {};
4932 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4933 gp_ci.stageCount = 2;
4934 gp_ci.pStages = shaderStages;
4935 gp_ci.pVertexInputState = &vi_ci;
4936 gp_ci.pInputAssemblyState = &ia_ci;
4937 gp_ci.pViewportState = &vp_state_ci;
4938 gp_ci.pRasterizationState = &rs_ci;
4939 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004940 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4941 gp_ci.layout = pipeline_layout;
4942 gp_ci.renderPass = renderPass();
4943
4944 VkPipelineCacheCreateInfo pc_ci = {};
4945 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4946
4947 VkPipeline pipeline;
4948 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004949 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004950 ASSERT_VK_SUCCESS(err);
4951
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004952 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004953 ASSERT_VK_SUCCESS(err);
4954
4955 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004956 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004957 m_commandBuffer->EndCommandBuffer();
4958 // Now destroy pipeline in order to cause error when submitting
4959 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
4960
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06004962
4963 VkSubmitInfo submit_info = {};
4964 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4965 submit_info.commandBufferCount = 1;
4966 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4967 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4968
4969 m_errorMonitor->VerifyFound();
4970 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4971 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4972}
4973
Tobin Ehlis31289162016-08-17 14:57:58 -06004974TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
4975 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4976 "due to a bound descriptor set with a buffer dependency "
4977 "being destroyed.");
4978 ASSERT_NO_FATAL_FAILURE(InitState());
4979 ASSERT_NO_FATAL_FAILURE(InitViewport());
4980 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4981
4982 VkDescriptorPoolSize ds_type_count = {};
4983 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4984 ds_type_count.descriptorCount = 1;
4985
4986 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4987 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4988 ds_pool_ci.pNext = NULL;
4989 ds_pool_ci.maxSets = 1;
4990 ds_pool_ci.poolSizeCount = 1;
4991 ds_pool_ci.pPoolSizes = &ds_type_count;
4992
4993 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004994 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06004995 ASSERT_VK_SUCCESS(err);
4996
4997 VkDescriptorSetLayoutBinding dsl_binding = {};
4998 dsl_binding.binding = 0;
4999 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5000 dsl_binding.descriptorCount = 1;
5001 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5002 dsl_binding.pImmutableSamplers = NULL;
5003
5004 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5005 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5006 ds_layout_ci.pNext = NULL;
5007 ds_layout_ci.bindingCount = 1;
5008 ds_layout_ci.pBindings = &dsl_binding;
5009 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005010 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005011 ASSERT_VK_SUCCESS(err);
5012
5013 VkDescriptorSet descriptorSet;
5014 VkDescriptorSetAllocateInfo alloc_info = {};
5015 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5016 alloc_info.descriptorSetCount = 1;
5017 alloc_info.descriptorPool = ds_pool;
5018 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005019 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005020 ASSERT_VK_SUCCESS(err);
5021
5022 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5023 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5024 pipeline_layout_ci.pNext = NULL;
5025 pipeline_layout_ci.setLayoutCount = 1;
5026 pipeline_layout_ci.pSetLayouts = &ds_layout;
5027
5028 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005029 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005030 ASSERT_VK_SUCCESS(err);
5031
5032 // Create a buffer to update the descriptor with
5033 uint32_t qfi = 0;
5034 VkBufferCreateInfo buffCI = {};
5035 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5036 buffCI.size = 1024;
5037 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5038 buffCI.queueFamilyIndexCount = 1;
5039 buffCI.pQueueFamilyIndices = &qfi;
5040
5041 VkBuffer buffer;
5042 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5043 ASSERT_VK_SUCCESS(err);
5044 // Allocate memory and bind to buffer so we can make it to the appropriate
5045 // error
5046 VkMemoryAllocateInfo mem_alloc = {};
5047 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5048 mem_alloc.pNext = NULL;
5049 mem_alloc.allocationSize = 1024;
5050 mem_alloc.memoryTypeIndex = 0;
5051
5052 VkMemoryRequirements memReqs;
5053 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005054 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005055 if (!pass) {
5056 vkDestroyBuffer(m_device->device(), buffer, NULL);
5057 return;
5058 }
5059
5060 VkDeviceMemory mem;
5061 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5062 ASSERT_VK_SUCCESS(err);
5063 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5064 ASSERT_VK_SUCCESS(err);
5065 // Correctly update descriptor to avoid "NOT_UPDATED" error
5066 VkDescriptorBufferInfo buffInfo = {};
5067 buffInfo.buffer = buffer;
5068 buffInfo.offset = 0;
5069 buffInfo.range = 1024;
5070
5071 VkWriteDescriptorSet descriptor_write;
5072 memset(&descriptor_write, 0, sizeof(descriptor_write));
5073 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5074 descriptor_write.dstSet = descriptorSet;
5075 descriptor_write.dstBinding = 0;
5076 descriptor_write.descriptorCount = 1;
5077 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5078 descriptor_write.pBufferInfo = &buffInfo;
5079
5080 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5081
5082 // Create PSO to be used for draw-time errors below
5083 char const *vsSource = "#version 450\n"
5084 "\n"
5085 "out gl_PerVertex { \n"
5086 " vec4 gl_Position;\n"
5087 "};\n"
5088 "void main(){\n"
5089 " gl_Position = vec4(1);\n"
5090 "}\n";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005091 char const *fsSource = "#version 450\n"
5092 "\n"
5093 "layout(location=0) out vec4 x;\n"
5094 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5095 "void main(){\n"
5096 " x = vec4(bar.y);\n"
5097 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005098 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5099 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5100 VkPipelineObj pipe(m_device);
5101 pipe.AddShader(&vs);
5102 pipe.AddShader(&fs);
5103 pipe.AddColorAttachment();
5104 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5105
5106 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005107 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5108 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5109 &descriptorSet, 0, NULL);
Tobin Ehlis31289162016-08-17 14:57:58 -06005110 Draw(1, 0, 0, 0);
5111 EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005113 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5114 vkDestroyBuffer(m_device->device(), buffer, NULL);
5115 // Attempt to submit cmd buffer
5116 VkSubmitInfo submit_info = {};
5117 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5118 submit_info.commandBufferCount = 1;
5119 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5120 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5121 m_errorMonitor->VerifyFound();
5122 // Cleanup
5123 vkFreeMemory(m_device->device(), mem, NULL);
5124
5125 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5126 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5127 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5128}
5129
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005130TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
5131 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
5132 "due to a bound descriptor sets with a combined image "
5133 "sampler having their image, sampler, and descriptor set "
5134 "each respectively destroyed and then attempting to "
Mark Mueller917f6bc2016-08-30 10:57:19 -06005135 "submit associated cmd buffers. Attempt to destroy a "
5136 "DescriptorSet that is in use.");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005137 ASSERT_NO_FATAL_FAILURE(InitState());
5138 ASSERT_NO_FATAL_FAILURE(InitViewport());
5139 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5140
5141 VkDescriptorPoolSize ds_type_count = {};
5142 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5143 ds_type_count.descriptorCount = 1;
5144
5145 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5146 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5147 ds_pool_ci.pNext = NULL;
5148 ds_pool_ci.maxSets = 1;
5149 ds_pool_ci.poolSizeCount = 1;
5150 ds_pool_ci.pPoolSizes = &ds_type_count;
5151
5152 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005153 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005154 ASSERT_VK_SUCCESS(err);
5155
5156 VkDescriptorSetLayoutBinding dsl_binding = {};
5157 dsl_binding.binding = 0;
5158 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5159 dsl_binding.descriptorCount = 1;
5160 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5161 dsl_binding.pImmutableSamplers = NULL;
5162
5163 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5164 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5165 ds_layout_ci.pNext = NULL;
5166 ds_layout_ci.bindingCount = 1;
5167 ds_layout_ci.pBindings = &dsl_binding;
5168 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005169 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005170 ASSERT_VK_SUCCESS(err);
5171
5172 VkDescriptorSet descriptorSet;
5173 VkDescriptorSetAllocateInfo alloc_info = {};
5174 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5175 alloc_info.descriptorSetCount = 1;
5176 alloc_info.descriptorPool = ds_pool;
5177 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005178 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005179 ASSERT_VK_SUCCESS(err);
5180
5181 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5182 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5183 pipeline_layout_ci.pNext = NULL;
5184 pipeline_layout_ci.setLayoutCount = 1;
5185 pipeline_layout_ci.pSetLayouts = &ds_layout;
5186
5187 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005188 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005189 ASSERT_VK_SUCCESS(err);
5190
5191 // Create images to update the descriptor with
5192 VkImage image;
5193 VkImage image2;
5194 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5195 const int32_t tex_width = 32;
5196 const int32_t tex_height = 32;
5197 VkImageCreateInfo image_create_info = {};
5198 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5199 image_create_info.pNext = NULL;
5200 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5201 image_create_info.format = tex_format;
5202 image_create_info.extent.width = tex_width;
5203 image_create_info.extent.height = tex_height;
5204 image_create_info.extent.depth = 1;
5205 image_create_info.mipLevels = 1;
5206 image_create_info.arrayLayers = 1;
5207 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5208 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5209 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5210 image_create_info.flags = 0;
5211 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5212 ASSERT_VK_SUCCESS(err);
5213 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5214 ASSERT_VK_SUCCESS(err);
5215
5216 VkMemoryRequirements memory_reqs;
5217 VkDeviceMemory image_memory;
5218 bool pass;
5219 VkMemoryAllocateInfo memory_info = {};
5220 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5221 memory_info.pNext = NULL;
5222 memory_info.allocationSize = 0;
5223 memory_info.memoryTypeIndex = 0;
5224 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5225 // Allocate enough memory for both images
5226 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005227 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005228 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005229 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005230 ASSERT_VK_SUCCESS(err);
5231 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5232 ASSERT_VK_SUCCESS(err);
5233 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005234 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005235 ASSERT_VK_SUCCESS(err);
5236
5237 VkImageViewCreateInfo image_view_create_info = {};
5238 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5239 image_view_create_info.image = image;
5240 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5241 image_view_create_info.format = tex_format;
5242 image_view_create_info.subresourceRange.layerCount = 1;
5243 image_view_create_info.subresourceRange.baseMipLevel = 0;
5244 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005245 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005246
5247 VkImageView view;
5248 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005249 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005250 ASSERT_VK_SUCCESS(err);
5251 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005252 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005253 ASSERT_VK_SUCCESS(err);
5254 // Create Samplers
5255 VkSamplerCreateInfo sampler_ci = {};
5256 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5257 sampler_ci.pNext = NULL;
5258 sampler_ci.magFilter = VK_FILTER_NEAREST;
5259 sampler_ci.minFilter = VK_FILTER_NEAREST;
5260 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5261 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5262 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5263 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5264 sampler_ci.mipLodBias = 1.0;
5265 sampler_ci.anisotropyEnable = VK_FALSE;
5266 sampler_ci.maxAnisotropy = 1;
5267 sampler_ci.compareEnable = VK_FALSE;
5268 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5269 sampler_ci.minLod = 1.0;
5270 sampler_ci.maxLod = 1.0;
5271 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5272 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5273 VkSampler sampler;
5274 VkSampler sampler2;
5275 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5276 ASSERT_VK_SUCCESS(err);
5277 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5278 ASSERT_VK_SUCCESS(err);
5279 // Update descriptor with image and sampler
5280 VkDescriptorImageInfo img_info = {};
5281 img_info.sampler = sampler;
5282 img_info.imageView = view;
5283 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5284
5285 VkWriteDescriptorSet descriptor_write;
5286 memset(&descriptor_write, 0, sizeof(descriptor_write));
5287 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5288 descriptor_write.dstSet = descriptorSet;
5289 descriptor_write.dstBinding = 0;
5290 descriptor_write.descriptorCount = 1;
5291 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5292 descriptor_write.pImageInfo = &img_info;
5293
5294 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5295
5296 // Create PSO to be used for draw-time errors below
5297 char const *vsSource = "#version 450\n"
5298 "\n"
5299 "out gl_PerVertex { \n"
5300 " vec4 gl_Position;\n"
5301 "};\n"
5302 "void main(){\n"
5303 " gl_Position = vec4(1);\n"
5304 "}\n";
5305 char const *fsSource = "#version 450\n"
5306 "\n"
5307 "layout(set=0, binding=0) uniform sampler2D s;\n"
5308 "layout(location=0) out vec4 x;\n"
5309 "void main(){\n"
5310 " x = texture(s, vec2(1));\n"
5311 "}\n";
5312 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5313 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5314 VkPipelineObj pipe(m_device);
5315 pipe.AddShader(&vs);
5316 pipe.AddShader(&fs);
5317 pipe.AddColorAttachment();
5318 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5319
5320 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted sampler ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005322 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005323 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5324 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5325 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005326 Draw(1, 0, 0, 0);
5327 EndCommandBuffer();
5328 // Destroy sampler invalidates the cmd buffer, causing error on submit
5329 vkDestroySampler(m_device->device(), sampler, NULL);
5330 // Attempt to submit cmd buffer
5331 VkSubmitInfo submit_info = {};
5332 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5333 submit_info.commandBufferCount = 1;
5334 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5335 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5336 m_errorMonitor->VerifyFound();
5337 // Now re-update descriptor with valid sampler and delete image
5338 img_info.sampler = sampler2;
5339 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005341 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005342 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5343 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5344 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005345 Draw(1, 0, 0, 0);
5346 EndCommandBuffer();
5347 // Destroy image invalidates the cmd buffer, causing error on submit
5348 vkDestroyImage(m_device->device(), image, NULL);
5349 // Attempt to submit cmd buffer
5350 submit_info = {};
5351 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5352 submit_info.commandBufferCount = 1;
5353 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5354 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5355 m_errorMonitor->VerifyFound();
5356 // Now update descriptor to be valid, but then free descriptor
5357 img_info.imageView = view2;
5358 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005359 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005360 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005361 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5362 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5363 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005364 Draw(1, 0, 0, 0);
5365 EndCommandBuffer();
5366 // Destroy descriptor set invalidates the cb, causing error on submit
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005368 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06005369 m_errorMonitor->VerifyFound();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005370 // Attempt to submit cmd buffer
5371 submit_info = {};
5372 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5373 submit_info.commandBufferCount = 1;
5374 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5375 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5376 m_errorMonitor->VerifyFound();
5377 // Cleanup
5378 vkFreeMemory(m_device->device(), image_memory, NULL);
5379 vkDestroySampler(m_device->device(), sampler2, NULL);
5380 vkDestroyImage(m_device->device(), image2, NULL);
5381 vkDestroyImageView(m_device->device(), view, NULL);
5382 vkDestroyImageView(m_device->device(), view2, NULL);
5383 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5384 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5385 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5386}
5387
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005388TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
5389 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
5390 ASSERT_NO_FATAL_FAILURE(InitState());
5391 ASSERT_NO_FATAL_FAILURE(InitViewport());
5392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5393
5394 VkDescriptorPoolSize ds_type_count = {};
5395 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5396 ds_type_count.descriptorCount = 1;
5397
5398 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5399 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;
5404
5405 VkDescriptorPool ds_pool;
5406 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5407 ASSERT_VK_SUCCESS(err);
5408
5409 VkDescriptorSetLayoutBinding dsl_binding = {};
5410 dsl_binding.binding = 0;
5411 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5412 dsl_binding.descriptorCount = 1;
5413 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5414 dsl_binding.pImmutableSamplers = NULL;
5415
5416 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5417 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5418 ds_layout_ci.pNext = NULL;
5419 ds_layout_ci.bindingCount = 1;
5420 ds_layout_ci.pBindings = &dsl_binding;
5421 VkDescriptorSetLayout ds_layout;
5422 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5423 ASSERT_VK_SUCCESS(err);
5424
5425 VkDescriptorSet descriptor_set;
5426 VkDescriptorSetAllocateInfo alloc_info = {};
5427 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5428 alloc_info.descriptorSetCount = 1;
5429 alloc_info.descriptorPool = ds_pool;
5430 alloc_info.pSetLayouts = &ds_layout;
5431 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
5432 ASSERT_VK_SUCCESS(err);
5433
5434 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5435 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5436 pipeline_layout_ci.pNext = NULL;
5437 pipeline_layout_ci.setLayoutCount = 1;
5438 pipeline_layout_ci.pSetLayouts = &ds_layout;
5439
5440 VkPipelineLayout pipeline_layout;
5441 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5442 ASSERT_VK_SUCCESS(err);
5443
5444 // Create image to update the descriptor with
5445 VkImageObj image(m_device);
5446 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5447 ASSERT_TRUE(image.initialized());
5448
5449 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5450 // Create Sampler
5451 VkSamplerCreateInfo sampler_ci = {};
5452 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5453 sampler_ci.pNext = NULL;
5454 sampler_ci.magFilter = VK_FILTER_NEAREST;
5455 sampler_ci.minFilter = VK_FILTER_NEAREST;
5456 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5457 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5458 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5459 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5460 sampler_ci.mipLodBias = 1.0;
5461 sampler_ci.anisotropyEnable = VK_FALSE;
5462 sampler_ci.maxAnisotropy = 1;
5463 sampler_ci.compareEnable = VK_FALSE;
5464 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5465 sampler_ci.minLod = 1.0;
5466 sampler_ci.maxLod = 1.0;
5467 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5468 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5469 VkSampler sampler;
5470 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5471 ASSERT_VK_SUCCESS(err);
5472 // Update descriptor with image and sampler
5473 VkDescriptorImageInfo img_info = {};
5474 img_info.sampler = sampler;
5475 img_info.imageView = view;
5476 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5477
5478 VkWriteDescriptorSet descriptor_write;
5479 memset(&descriptor_write, 0, sizeof(descriptor_write));
5480 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5481 descriptor_write.dstSet = descriptor_set;
5482 descriptor_write.dstBinding = 0;
5483 descriptor_write.descriptorCount = 1;
5484 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5485 descriptor_write.pImageInfo = &img_info;
5486
5487 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5488
5489 // Create PSO to be used for draw-time errors below
5490 char const *vsSource = "#version 450\n"
5491 "\n"
5492 "out gl_PerVertex { \n"
5493 " vec4 gl_Position;\n"
5494 "};\n"
5495 "void main(){\n"
5496 " gl_Position = vec4(1);\n"
5497 "}\n";
5498 char const *fsSource = "#version 450\n"
5499 "\n"
5500 "layout(set=0, binding=0) uniform sampler2D s;\n"
5501 "layout(location=0) out vec4 x;\n"
5502 "void main(){\n"
5503 " x = texture(s, vec2(1));\n"
5504 "}\n";
5505 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5506 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5507 VkPipelineObj pipe(m_device);
5508 pipe.AddShader(&vs);
5509 pipe.AddShader(&fs);
5510 pipe.AddColorAttachment();
5511 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5512
5513 BeginCommandBuffer();
5514 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5515 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5516 &descriptor_set, 0, NULL);
5517 Draw(1, 0, 0, 0);
5518 EndCommandBuffer();
5519 // Submit cmd buffer to put pool in-flight
5520 VkSubmitInfo submit_info = {};
5521 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5522 submit_info.commandBufferCount = 1;
5523 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5524 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5525 // Destroy pool while in-flight, causing error
5526 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
5527 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5528 m_errorMonitor->VerifyFound();
5529 vkQueueWaitIdle(m_device->m_queue);
5530 // Cleanup
5531 vkDestroySampler(m_device->device(), sampler, NULL);
5532 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5533 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5534 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5535}
5536
Tobin Ehlis50a095d2016-09-21 17:32:49 -06005537TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
5538 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
5539 ASSERT_NO_FATAL_FAILURE(InitState());
5540 ASSERT_NO_FATAL_FAILURE(InitViewport());
5541 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5542
5543 VkDescriptorPoolSize ds_type_count = {};
5544 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5545 ds_type_count.descriptorCount = 1;
5546
5547 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5548 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5549 ds_pool_ci.pNext = NULL;
5550 ds_pool_ci.maxSets = 1;
5551 ds_pool_ci.poolSizeCount = 1;
5552 ds_pool_ci.pPoolSizes = &ds_type_count;
5553
5554 VkDescriptorPool ds_pool;
5555 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5556 ASSERT_VK_SUCCESS(err);
5557
5558 VkDescriptorSetLayoutBinding dsl_binding = {};
5559 dsl_binding.binding = 0;
5560 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5561 dsl_binding.descriptorCount = 1;
5562 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5563 dsl_binding.pImmutableSamplers = NULL;
5564
5565 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5566 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5567 ds_layout_ci.pNext = NULL;
5568 ds_layout_ci.bindingCount = 1;
5569 ds_layout_ci.pBindings = &dsl_binding;
5570 VkDescriptorSetLayout ds_layout;
5571 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5572 ASSERT_VK_SUCCESS(err);
5573
5574 VkDescriptorSet descriptorSet;
5575 VkDescriptorSetAllocateInfo alloc_info = {};
5576 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5577 alloc_info.descriptorSetCount = 1;
5578 alloc_info.descriptorPool = ds_pool;
5579 alloc_info.pSetLayouts = &ds_layout;
5580 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
5581 ASSERT_VK_SUCCESS(err);
5582
5583 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5584 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5585 pipeline_layout_ci.pNext = NULL;
5586 pipeline_layout_ci.setLayoutCount = 1;
5587 pipeline_layout_ci.pSetLayouts = &ds_layout;
5588
5589 VkPipelineLayout pipeline_layout;
5590 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5591 ASSERT_VK_SUCCESS(err);
5592
5593 // Create images to update the descriptor with
5594 VkImage image;
5595 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5596 const int32_t tex_width = 32;
5597 const int32_t tex_height = 32;
5598 VkImageCreateInfo image_create_info = {};
5599 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5600 image_create_info.pNext = NULL;
5601 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5602 image_create_info.format = tex_format;
5603 image_create_info.extent.width = tex_width;
5604 image_create_info.extent.height = tex_height;
5605 image_create_info.extent.depth = 1;
5606 image_create_info.mipLevels = 1;
5607 image_create_info.arrayLayers = 1;
5608 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5609 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5610 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5611 image_create_info.flags = 0;
5612 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5613 ASSERT_VK_SUCCESS(err);
5614 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
5615 VkMemoryRequirements memory_reqs;
5616 VkDeviceMemory image_memory;
5617 bool pass;
5618 VkMemoryAllocateInfo memory_info = {};
5619 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5620 memory_info.pNext = NULL;
5621 memory_info.allocationSize = 0;
5622 memory_info.memoryTypeIndex = 0;
5623 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5624 // Allocate enough memory for image
5625 memory_info.allocationSize = memory_reqs.size;
5626 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5627 ASSERT_TRUE(pass);
5628 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5629 ASSERT_VK_SUCCESS(err);
5630 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5631 ASSERT_VK_SUCCESS(err);
5632
5633 VkImageViewCreateInfo image_view_create_info = {};
5634 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5635 image_view_create_info.image = image;
5636 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5637 image_view_create_info.format = tex_format;
5638 image_view_create_info.subresourceRange.layerCount = 1;
5639 image_view_create_info.subresourceRange.baseMipLevel = 0;
5640 image_view_create_info.subresourceRange.levelCount = 1;
5641 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5642
5643 VkImageView view;
5644 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
5645 ASSERT_VK_SUCCESS(err);
5646 // Create Samplers
5647 VkSamplerCreateInfo sampler_ci = {};
5648 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5649 sampler_ci.pNext = NULL;
5650 sampler_ci.magFilter = VK_FILTER_NEAREST;
5651 sampler_ci.minFilter = VK_FILTER_NEAREST;
5652 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5653 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5654 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5655 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5656 sampler_ci.mipLodBias = 1.0;
5657 sampler_ci.anisotropyEnable = VK_FALSE;
5658 sampler_ci.maxAnisotropy = 1;
5659 sampler_ci.compareEnable = VK_FALSE;
5660 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5661 sampler_ci.minLod = 1.0;
5662 sampler_ci.maxLod = 1.0;
5663 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5664 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5665 VkSampler sampler;
5666 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5667 ASSERT_VK_SUCCESS(err);
5668 // Update descriptor with image and sampler
5669 VkDescriptorImageInfo img_info = {};
5670 img_info.sampler = sampler;
5671 img_info.imageView = view;
5672 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5673
5674 VkWriteDescriptorSet descriptor_write;
5675 memset(&descriptor_write, 0, sizeof(descriptor_write));
5676 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5677 descriptor_write.dstSet = descriptorSet;
5678 descriptor_write.dstBinding = 0;
5679 descriptor_write.descriptorCount = 1;
5680 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5681 descriptor_write.pImageInfo = &img_info;
5682 // Break memory binding and attempt update
5683 vkFreeMemory(m_device->device(), image_memory, nullptr);
5684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005685 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06005686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5687 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
5688 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5689 m_errorMonitor->VerifyFound();
5690 // Cleanup
5691 vkDestroyImage(m_device->device(), image, NULL);
5692 vkDestroySampler(m_device->device(), sampler, NULL);
5693 vkDestroyImageView(m_device->device(), view, NULL);
5694 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5695 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5696 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5697}
5698
Karl Schultz6addd812016-02-02 17:17:23 -07005699TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06005700 // Attempt to bind an invalid Pipeline to a valid Command Buffer
5701 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005702 // Create a valid cmd buffer
5703 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06005704 uint64_t fake_pipeline_handle = 0xbaad6001;
5705 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06005706 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005707 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5708
Karl Schultzf78bcdd2016-11-30 12:36:01 -07005709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Karl Schultzbdb75952016-04-19 11:36:49 -06005710 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005711 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06005712 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005713
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005714 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005716 Draw(1, 0, 0, 0);
5717 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005718
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005719 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005721 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005722 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
5723 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005724}
5725
Karl Schultz6addd812016-02-02 17:17:23 -07005726TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06005727 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07005728 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005729
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005731
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005732 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06005733 ASSERT_NO_FATAL_FAILURE(InitViewport());
5734 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005735 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005736 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5737 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005738
5739 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005740 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5741 ds_pool_ci.pNext = NULL;
5742 ds_pool_ci.maxSets = 1;
5743 ds_pool_ci.poolSizeCount = 1;
5744 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06005745
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005746 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005747 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005748 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005749
Tony Barboureb254902015-07-15 12:50:33 -06005750 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005751 dsl_binding.binding = 0;
5752 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5753 dsl_binding.descriptorCount = 1;
5754 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5755 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005756
Tony Barboureb254902015-07-15 12:50:33 -06005757 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005758 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5759 ds_layout_ci.pNext = NULL;
5760 ds_layout_ci.bindingCount = 1;
5761 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005762 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005763 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005764 ASSERT_VK_SUCCESS(err);
5765
5766 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005767 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005768 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005769 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005770 alloc_info.descriptorPool = ds_pool;
5771 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005772 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005773 ASSERT_VK_SUCCESS(err);
5774
Tony Barboureb254902015-07-15 12:50:33 -06005775 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005776 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5777 pipeline_layout_ci.pNext = NULL;
5778 pipeline_layout_ci.setLayoutCount = 1;
5779 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005780
5781 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005782 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005783 ASSERT_VK_SUCCESS(err);
5784
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005785 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005786 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005787 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005788 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005789
Tony Barbourc95e4ac2015-08-04 17:05:26 -06005790 VkPipelineObj pipe(m_device);
5791 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005792 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005793 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06005794 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005795
5796 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005797 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5798 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5799 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005800
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005801 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005802
Chia-I Wuf7458c52015-10-26 21:10:41 +08005803 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5804 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5805 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005806}
5807
Karl Schultz6addd812016-02-02 17:17:23 -07005808TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005809 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07005810 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005811
Karl Schultzf78bcdd2016-11-30 12:36:01 -07005812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005813
5814 ASSERT_NO_FATAL_FAILURE(InitState());
5815 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005816 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5817 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005818
5819 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005820 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5821 ds_pool_ci.pNext = NULL;
5822 ds_pool_ci.maxSets = 1;
5823 ds_pool_ci.poolSizeCount = 1;
5824 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005825
5826 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005827 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005828 ASSERT_VK_SUCCESS(err);
5829
5830 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005831 dsl_binding.binding = 0;
5832 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5833 dsl_binding.descriptorCount = 1;
5834 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5835 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005836
5837 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005838 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5839 ds_layout_ci.pNext = NULL;
5840 ds_layout_ci.bindingCount = 1;
5841 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005842 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005843 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005844 ASSERT_VK_SUCCESS(err);
5845
5846 VkDescriptorSet descriptorSet;
5847 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005848 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005849 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005850 alloc_info.descriptorPool = ds_pool;
5851 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005852 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005853 ASSERT_VK_SUCCESS(err);
5854
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005855 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005856 VkWriteDescriptorSet descriptor_write;
5857 memset(&descriptor_write, 0, sizeof(descriptor_write));
5858 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5859 descriptor_write.dstSet = descriptorSet;
5860 descriptor_write.dstBinding = 0;
5861 descriptor_write.descriptorCount = 1;
5862 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5863 descriptor_write.pTexelBufferView = &view;
5864
5865 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5866
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005867 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005868
5869 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5870 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5871}
5872
Mark Youngd339ba32016-05-30 13:28:35 -06005873TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005874 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06005875
5876 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005878 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06005879
5880 ASSERT_NO_FATAL_FAILURE(InitState());
5881
5882 // Create a buffer with no bound memory and then attempt to create
5883 // a buffer view.
5884 VkBufferCreateInfo buff_ci = {};
5885 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12005886 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06005887 buff_ci.size = 256;
5888 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5889 VkBuffer buffer;
5890 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
5891 ASSERT_VK_SUCCESS(err);
5892
5893 VkBufferViewCreateInfo buff_view_ci = {};
5894 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
5895 buff_view_ci.buffer = buffer;
5896 buff_view_ci.format = VK_FORMAT_R8_UNORM;
5897 buff_view_ci.range = VK_WHOLE_SIZE;
5898 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005899 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06005900
5901 m_errorMonitor->VerifyFound();
5902 vkDestroyBuffer(m_device->device(), buffer, NULL);
5903 // If last error is success, it still created the view, so delete it.
5904 if (err == VK_SUCCESS) {
5905 vkDestroyBufferView(m_device->device(), buff_view, NULL);
5906 }
5907}
5908
Karl Schultz6addd812016-02-02 17:17:23 -07005909TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
5910 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
5911 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07005912 // 1. No dynamicOffset supplied
5913 // 2. Too many dynamicOffsets supplied
5914 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07005915 VkResult err;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005916 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " requires 1 dynamicOffsets, but only "
5917 "0 dynamicOffsets are left in "
5918 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005919
5920 ASSERT_NO_FATAL_FAILURE(InitState());
5921 ASSERT_NO_FATAL_FAILURE(InitViewport());
5922 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5923
5924 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005925 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
5926 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005927
5928 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005929 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5930 ds_pool_ci.pNext = NULL;
5931 ds_pool_ci.maxSets = 1;
5932 ds_pool_ci.poolSizeCount = 1;
5933 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005934
5935 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005936 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005937 ASSERT_VK_SUCCESS(err);
5938
5939 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005940 dsl_binding.binding = 0;
5941 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
5942 dsl_binding.descriptorCount = 1;
5943 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5944 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005945
5946 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005947 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5948 ds_layout_ci.pNext = NULL;
5949 ds_layout_ci.bindingCount = 1;
5950 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005951 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005952 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005953 ASSERT_VK_SUCCESS(err);
5954
5955 VkDescriptorSet descriptorSet;
5956 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005957 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005958 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005959 alloc_info.descriptorPool = ds_pool;
5960 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005961 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005962 ASSERT_VK_SUCCESS(err);
5963
5964 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005965 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5966 pipeline_layout_ci.pNext = NULL;
5967 pipeline_layout_ci.setLayoutCount = 1;
5968 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005969
5970 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005971 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005972 ASSERT_VK_SUCCESS(err);
5973
5974 // Create a buffer to update the descriptor with
5975 uint32_t qfi = 0;
5976 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005977 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5978 buffCI.size = 1024;
5979 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5980 buffCI.queueFamilyIndexCount = 1;
5981 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005982
5983 VkBuffer dyub;
5984 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
5985 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005986 // Allocate memory and bind to buffer so we can make it to the appropriate
5987 // error
5988 VkMemoryAllocateInfo mem_alloc = {};
5989 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5990 mem_alloc.pNext = NULL;
5991 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12005992 mem_alloc.memoryTypeIndex = 0;
5993
5994 VkMemoryRequirements memReqs;
5995 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005996 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12005997 if (!pass) {
5998 vkDestroyBuffer(m_device->device(), dyub, NULL);
5999 return;
6000 }
6001
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006002 VkDeviceMemory mem;
6003 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6004 ASSERT_VK_SUCCESS(err);
6005 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6006 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006007 // Correctly update descriptor to avoid "NOT_UPDATED" error
6008 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006009 buffInfo.buffer = dyub;
6010 buffInfo.offset = 0;
6011 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006012
6013 VkWriteDescriptorSet descriptor_write;
6014 memset(&descriptor_write, 0, sizeof(descriptor_write));
6015 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6016 descriptor_write.dstSet = descriptorSet;
6017 descriptor_write.dstBinding = 0;
6018 descriptor_write.descriptorCount = 1;
6019 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6020 descriptor_write.pBufferInfo = &buffInfo;
6021
6022 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6023
6024 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006025 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6026 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006027 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006028 uint32_t pDynOff[2] = {512, 756};
6029 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6031 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6032 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6033 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006034 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006035 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " dynamic offset 512 combined with "
6037 "offset 0 and range 1024 that "
6038 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006039 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006040 char const *vsSource = "#version 450\n"
6041 "\n"
6042 "out gl_PerVertex { \n"
6043 " vec4 gl_Position;\n"
6044 "};\n"
6045 "void main(){\n"
6046 " gl_Position = vec4(1);\n"
6047 "}\n";
6048 char const *fsSource = "#version 450\n"
6049 "\n"
6050 "layout(location=0) out vec4 x;\n"
6051 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6052 "void main(){\n"
6053 " x = vec4(bar.y);\n"
6054 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006055 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6056 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6057 VkPipelineObj pipe(m_device);
6058 pipe.AddShader(&vs);
6059 pipe.AddShader(&fs);
6060 pipe.AddColorAttachment();
6061 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6062
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006063 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6064 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6065 VkRect2D scissor = {{0, 0}, {16, 16}};
6066 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6067
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006068 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006069 // This update should succeed, but offset size of 512 will overstep buffer
6070 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006071 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6072 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006073 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006074 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006075
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006076 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006077 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006078
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006079 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006080 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006081 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6082}
6083
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006084TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
6085 TEST_DESCRIPTION("Attempt to update a descriptor with a non-sparse buffer "
6086 "that doesn't have memory bound");
6087 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006089 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6091 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006092
6093 ASSERT_NO_FATAL_FAILURE(InitState());
6094 ASSERT_NO_FATAL_FAILURE(InitViewport());
6095 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6096
6097 VkDescriptorPoolSize ds_type_count = {};
6098 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6099 ds_type_count.descriptorCount = 1;
6100
6101 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6102 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6103 ds_pool_ci.pNext = NULL;
6104 ds_pool_ci.maxSets = 1;
6105 ds_pool_ci.poolSizeCount = 1;
6106 ds_pool_ci.pPoolSizes = &ds_type_count;
6107
6108 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006109 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006110 ASSERT_VK_SUCCESS(err);
6111
6112 VkDescriptorSetLayoutBinding dsl_binding = {};
6113 dsl_binding.binding = 0;
6114 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6115 dsl_binding.descriptorCount = 1;
6116 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6117 dsl_binding.pImmutableSamplers = NULL;
6118
6119 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6120 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6121 ds_layout_ci.pNext = NULL;
6122 ds_layout_ci.bindingCount = 1;
6123 ds_layout_ci.pBindings = &dsl_binding;
6124 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006125 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006126 ASSERT_VK_SUCCESS(err);
6127
6128 VkDescriptorSet descriptorSet;
6129 VkDescriptorSetAllocateInfo alloc_info = {};
6130 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6131 alloc_info.descriptorSetCount = 1;
6132 alloc_info.descriptorPool = ds_pool;
6133 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006134 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006135 ASSERT_VK_SUCCESS(err);
6136
6137 // Create a buffer to update the descriptor with
6138 uint32_t qfi = 0;
6139 VkBufferCreateInfo buffCI = {};
6140 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6141 buffCI.size = 1024;
6142 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6143 buffCI.queueFamilyIndexCount = 1;
6144 buffCI.pQueueFamilyIndices = &qfi;
6145
6146 VkBuffer dyub;
6147 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6148 ASSERT_VK_SUCCESS(err);
6149
6150 // Attempt to update descriptor without binding memory to it
6151 VkDescriptorBufferInfo buffInfo = {};
6152 buffInfo.buffer = dyub;
6153 buffInfo.offset = 0;
6154 buffInfo.range = 1024;
6155
6156 VkWriteDescriptorSet descriptor_write;
6157 memset(&descriptor_write, 0, sizeof(descriptor_write));
6158 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6159 descriptor_write.dstSet = descriptorSet;
6160 descriptor_write.dstBinding = 0;
6161 descriptor_write.descriptorCount = 1;
6162 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6163 descriptor_write.pBufferInfo = &buffInfo;
6164
6165 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6166 m_errorMonitor->VerifyFound();
6167
6168 vkDestroyBuffer(m_device->device(), dyub, NULL);
6169 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6170 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6171}
6172
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006173TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006174 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006175 ASSERT_NO_FATAL_FAILURE(InitState());
6176 ASSERT_NO_FATAL_FAILURE(InitViewport());
6177 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6178
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006179 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006180 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006181 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6182 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6183 pipeline_layout_ci.pushConstantRangeCount = 1;
6184 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6185
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006186 //
6187 // Check for invalid push constant ranges in pipeline layouts.
6188 //
6189 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006190 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006191 char const *msg;
6192 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006193
Karl Schultzc81037d2016-05-12 08:11:23 -06006194 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6195 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6196 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6197 "vkCreatePipelineLayout() call has push constants index 0 with "
6198 "size 0."},
6199 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6200 "vkCreatePipelineLayout() call has push constants index 0 with "
6201 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006202 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006203 "vkCreatePipelineLayout() call has push constants index 0 with "
6204 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006205 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006206 "vkCreatePipelineLayout() call has push constants index 0 with "
6207 "size 0."},
6208 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6209 "vkCreatePipelineLayout() call has push constants index 0 with "
6210 "offset 1. Offset must"},
6211 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6212 "vkCreatePipelineLayout() call has push constants index 0 "
6213 "with offset "},
6214 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6215 "vkCreatePipelineLayout() call has push constants "
6216 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006217 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006218 "vkCreatePipelineLayout() call has push constants index 0 "
6219 "with offset "},
6220 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6221 "vkCreatePipelineLayout() call has push "
6222 "constants index 0 with offset "},
6223 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6224 "vkCreatePipelineLayout() call has push "
6225 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006226 }};
6227
6228 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006229 for (const auto &iter : range_tests) {
6230 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6232 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006233 m_errorMonitor->VerifyFound();
6234 if (VK_SUCCESS == err) {
6235 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6236 }
6237 }
6238
6239 // Check for invalid stage flag
6240 pc_range.offset = 0;
6241 pc_range.size = 16;
6242 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006243 m_errorMonitor->SetDesiredFailureMsg(
6244 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6245 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006246 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006247 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006248 if (VK_SUCCESS == err) {
6249 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6250 }
6251
6252 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06006253 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006254 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006255 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006256 char const *msg;
6257 };
6258
Karl Schultzc81037d2016-05-12 08:11:23 -06006259 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006260 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6261 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6262 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6263 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6264 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006265 "vkCreatePipelineLayout() call has push constants with overlapping ranges:"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006266 {
6267 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6268 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6269 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6270 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6271 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006272 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 3:[12, 20), 4:[16, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006273 },
6274 {
6275 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6276 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6277 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6278 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6279 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006280 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 1:[12, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006281 },
6282 {
6283 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6284 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6285 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6286 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6287 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006288 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 3:[12, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006289 },
6290 {
6291 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6292 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
6293 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
6294 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
6295 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006296 "vkCreatePipelineLayout() call has push constants with overlapping ranges:",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006297 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006298
Karl Schultzc81037d2016-05-12 08:11:23 -06006299 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006300 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006301 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, iter.msg);
6303 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006304 m_errorMonitor->VerifyFound();
6305 if (VK_SUCCESS == err) {
6306 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6307 }
6308 }
6309
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006310 //
6311 // CmdPushConstants tests
6312 //
Karl Schultzc81037d2016-05-12 08:11:23 -06006313 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006314
6315 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006316 const std::array<PipelineLayoutTestCase, 11> cmd_range_tests = {{
6317 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "vkCmdPushConstants: parameter size must be greater than 0"},
Karl Schultzc81037d2016-05-12 08:11:23 -06006318 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6319 "vkCmdPushConstants() call has push constants with size 1. Size "
6320 "must be greater than zero and a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006321 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006322 "vkCmdPushConstants() call has push constants with size 1. Size "
6323 "must be greater than zero and a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006324 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006325 "vkCmdPushConstants() call has push constants with offset 1. "
6326 "Offset must be a multiple of 4."},
6327 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6328 "vkCmdPushConstants() call has push constants with offset 1. "
6329 "Offset must be a multiple of 4."},
6330 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6331 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6332 "0x1 not within flag-matching ranges in pipeline layout"},
6333 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
6334 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
6335 "0x1 not within flag-matching ranges in pipeline layout"},
6336 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
6337 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
6338 "0x1 not within flag-matching ranges in pipeline layout"},
6339 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
6340 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
6341 "0x1 not within flag-matching ranges in pipeline layout"},
6342 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6343 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
6344 "any of the ranges in pipeline layout"},
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006345 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06006346 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
6347 "any of the ranges in pipeline layout"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006348 }};
6349
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006350 BeginCommandBuffer();
6351
6352 // Setup ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006353 const VkPushConstantRange pc_range2[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006354 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006355 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006356 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006357 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006358 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006359 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006360 for (const auto &iter : cmd_range_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6362 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006363 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006364 m_errorMonitor->VerifyFound();
6365 }
6366
6367 // Check for invalid stage flag
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006369 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006370 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06006371 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006372
Karl Schultzc81037d2016-05-12 08:11:23 -06006373 // overlapping range tests with cmd
6374 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
6375 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6376 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6377 "0x1 not within flag-matching ranges in pipeline layout"},
6378 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6379 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
6380 "0x1 not within flag-matching ranges in pipeline layout"},
6381 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
6382 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
6383 "0x1 not within flag-matching ranges in pipeline layout"},
6384 }};
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006385 // Setup ranges: [0,16), [20,36), [36,44), [44,52), [80,92)
Karl Schultzc81037d2016-05-12 08:11:23 -06006386 const VkPushConstantRange pc_range3[] = {
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006387 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
6388 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12}, {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
Karl Schultzc81037d2016-05-12 08:11:23 -06006389 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006390 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range3) / sizeof(VkPushConstantRange);
Karl Schultzc81037d2016-05-12 08:11:23 -06006391 pipeline_layout_ci.pPushConstantRanges = pc_range3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006392 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzc81037d2016-05-12 08:11:23 -06006393 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006394 for (const auto &iter : cmd_overlap_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6396 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006397 iter.range.size, dummy_values);
6398 m_errorMonitor->VerifyFound();
6399 }
Karl Schultzc81037d2016-05-12 08:11:23 -06006400 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6401
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006402 EndCommandBuffer();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006403}
6404
Karl Schultz6addd812016-02-02 17:17:23 -07006405TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07006406 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07006407 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006408
6409 ASSERT_NO_FATAL_FAILURE(InitState());
6410 ASSERT_NO_FATAL_FAILURE(InitViewport());
6411 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6412
Mike Stroyanb8a61002016-06-20 16:00:28 -06006413 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
6414 VkImageTiling tiling;
6415 VkFormatProperties format_properties;
6416 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006417 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Mike Stroyanb8a61002016-06-20 16:00:28 -06006418 tiling = VK_IMAGE_TILING_LINEAR;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006419 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Mike Stroyanb8a61002016-06-20 16:00:28 -06006420 tiling = VK_IMAGE_TILING_OPTIMAL;
6421 } else {
6422 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
6423 "skipped.\n");
6424 return;
6425 }
6426
Tobin Ehlis559c6382015-11-05 09:52:49 -07006427 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
6428 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006429 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6430 ds_type_count[0].descriptorCount = 10;
6431 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6432 ds_type_count[1].descriptorCount = 2;
6433 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6434 ds_type_count[2].descriptorCount = 2;
6435 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6436 ds_type_count[3].descriptorCount = 5;
6437 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
6438 // type
6439 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6440 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
6441 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006442
6443 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006444 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6445 ds_pool_ci.pNext = NULL;
6446 ds_pool_ci.maxSets = 5;
6447 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
6448 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006449
6450 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006451 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006452 ASSERT_VK_SUCCESS(err);
6453
6454 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
6455 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006456 dsl_binding[0].binding = 0;
6457 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6458 dsl_binding[0].descriptorCount = 5;
6459 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6460 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006461
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006462 // Create layout identical to set0 layout but w/ different stageFlags
6463 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006464 dsl_fs_stage_only.binding = 0;
6465 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6466 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006467 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
6468 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07006469 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006470 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006471 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6472 ds_layout_ci.pNext = NULL;
6473 ds_layout_ci.bindingCount = 1;
6474 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006475 static const uint32_t NUM_LAYOUTS = 4;
6476 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006477 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006478 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
6479 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006480 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006481 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006482 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006483 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006484 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006485 dsl_binding[0].binding = 0;
6486 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006487 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006488 dsl_binding[1].binding = 1;
6489 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6490 dsl_binding[1].descriptorCount = 2;
6491 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6492 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006493 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006494 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006495 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006496 ASSERT_VK_SUCCESS(err);
6497 dsl_binding[0].binding = 0;
6498 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006499 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006500 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006501 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006502 ASSERT_VK_SUCCESS(err);
6503 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006504 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006505 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006506 ASSERT_VK_SUCCESS(err);
6507
6508 static const uint32_t NUM_SETS = 4;
6509 VkDescriptorSet descriptorSet[NUM_SETS] = {};
6510 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006511 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006512 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006513 alloc_info.descriptorPool = ds_pool;
6514 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006515 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006516 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006517 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006518 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006519 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006520 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006521 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006522
6523 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006524 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6525 pipeline_layout_ci.pNext = NULL;
6526 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
6527 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006528
6529 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006530 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006531 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006532 // Create pipelineLayout with only one setLayout
6533 pipeline_layout_ci.setLayoutCount = 1;
6534 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006535 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006536 ASSERT_VK_SUCCESS(err);
6537 // Create pipelineLayout with 2 descriptor setLayout at index 0
6538 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
6539 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006540 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006541 ASSERT_VK_SUCCESS(err);
6542 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
6543 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
6544 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006545 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006546 ASSERT_VK_SUCCESS(err);
6547 // Create pipelineLayout with UB type, but stageFlags for FS only
6548 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
6549 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006550 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006551 ASSERT_VK_SUCCESS(err);
6552 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
6553 VkDescriptorSetLayout pl_bad_s0[2] = {};
6554 pl_bad_s0[0] = ds_layout_fs_only;
6555 pl_bad_s0[1] = ds_layout[1];
6556 pipeline_layout_ci.setLayoutCount = 2;
6557 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
6558 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006559 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006560 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006561
6562 // Create a buffer to update the descriptor with
6563 uint32_t qfi = 0;
6564 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006565 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6566 buffCI.size = 1024;
6567 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6568 buffCI.queueFamilyIndexCount = 1;
6569 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006570
6571 VkBuffer dyub;
6572 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6573 ASSERT_VK_SUCCESS(err);
6574 // Correctly update descriptor to avoid "NOT_UPDATED" error
6575 static const uint32_t NUM_BUFFS = 5;
6576 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006577 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07006578 buffInfo[i].buffer = dyub;
6579 buffInfo[i].offset = 0;
6580 buffInfo[i].range = 1024;
6581 }
Karl Schultz6addd812016-02-02 17:17:23 -07006582 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07006583 const int32_t tex_width = 32;
6584 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006585 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006586 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6587 image_create_info.pNext = NULL;
6588 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6589 image_create_info.format = tex_format;
6590 image_create_info.extent.width = tex_width;
6591 image_create_info.extent.height = tex_height;
6592 image_create_info.extent.depth = 1;
6593 image_create_info.mipLevels = 1;
6594 image_create_info.arrayLayers = 1;
6595 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06006596 image_create_info.tiling = tiling;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006597 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07006598 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006599 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6600 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006601
Karl Schultz6addd812016-02-02 17:17:23 -07006602 VkMemoryRequirements memReqs;
6603 VkDeviceMemory imageMem;
6604 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006605 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006606 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6607 memAlloc.pNext = NULL;
6608 memAlloc.allocationSize = 0;
6609 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006610 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
6611 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006612 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006613 ASSERT_TRUE(pass);
6614 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
6615 ASSERT_VK_SUCCESS(err);
6616 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
6617 ASSERT_VK_SUCCESS(err);
6618
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006619 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006620 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6621 image_view_create_info.image = image;
6622 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6623 image_view_create_info.format = tex_format;
6624 image_view_create_info.subresourceRange.layerCount = 1;
6625 image_view_create_info.subresourceRange.baseMipLevel = 0;
6626 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006627 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006628
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006629 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006630 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006631 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006632 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006633 imageInfo[0].imageView = view;
6634 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6635 imageInfo[1].imageView = view;
6636 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006637 imageInfo[2].imageView = view;
Tobin Ehlisa1fccbc2016-10-10 14:54:43 -06006638 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006639 imageInfo[3].imageView = view;
Tobin Ehlisa1fccbc2016-10-10 14:54:43 -06006640 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006641
6642 static const uint32_t NUM_SET_UPDATES = 3;
6643 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
6644 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6645 descriptor_write[0].dstSet = descriptorSet[0];
6646 descriptor_write[0].dstBinding = 0;
6647 descriptor_write[0].descriptorCount = 5;
6648 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6649 descriptor_write[0].pBufferInfo = buffInfo;
6650 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6651 descriptor_write[1].dstSet = descriptorSet[1];
6652 descriptor_write[1].dstBinding = 0;
6653 descriptor_write[1].descriptorCount = 2;
6654 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6655 descriptor_write[1].pImageInfo = imageInfo;
6656 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6657 descriptor_write[2].dstSet = descriptorSet[1];
6658 descriptor_write[2].dstBinding = 1;
6659 descriptor_write[2].descriptorCount = 2;
6660 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006661 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006662
6663 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006664
Tobin Ehlis88452832015-12-03 09:40:56 -07006665 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006666 char const *vsSource = "#version 450\n"
6667 "\n"
6668 "out gl_PerVertex {\n"
6669 " vec4 gl_Position;\n"
6670 "};\n"
6671 "void main(){\n"
6672 " gl_Position = vec4(1);\n"
6673 "}\n";
6674 char const *fsSource = "#version 450\n"
6675 "\n"
6676 "layout(location=0) out vec4 x;\n"
6677 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6678 "void main(){\n"
6679 " x = vec4(bar.y);\n"
6680 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07006681 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6682 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006683 VkPipelineObj pipe(m_device);
6684 pipe.AddShader(&vs);
6685 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07006686 pipe.AddColorAttachment();
6687 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07006688
6689 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07006690
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006691 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006692 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
6693 // of PSO
6694 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
6695 // cmd_pipeline.c
6696 // due to the fact that cmd_alloc_dset_data() has not been called in
6697 // cmd_bind_graphics_pipeline()
6698 // TODO : Want to cause various binding incompatibility issues here to test
6699 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07006700 // First cause various verify_layout_compatibility() fails
6701 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006702 // verify_set_layout_compatibility fail cases:
6703 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006705 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
6706 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006707 m_errorMonitor->VerifyFound();
6708
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006709 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
6711 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
6712 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006713 m_errorMonitor->VerifyFound();
6714
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006715 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006716 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
6717 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
6719 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
6720 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006721 m_errorMonitor->VerifyFound();
6722
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006723 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
6724 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
6726 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
6727 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006728 m_errorMonitor->VerifyFound();
6729
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006730 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
6731 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6733 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
6734 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
6735 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006736 m_errorMonitor->VerifyFound();
6737
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006738 // Cause INFO messages due to disturbing previously bound Sets
6739 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006740 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6741 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006742 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
6744 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
6745 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006746 m_errorMonitor->VerifyFound();
6747
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006748 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6749 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006750 // 2. Disturb set after last bound set
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " newly bound as set #0 so set #1 and "
6752 "any subsequent sets were disturbed ");
6753 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
6754 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006755 m_errorMonitor->VerifyFound();
6756
Tobin Ehlis10fad692016-07-07 12:00:36 -06006757 // Now that we're done actively using the pipelineLayout that gfx pipeline
6758 // was created with, we should be able to delete it. Do that now to verify
6759 // that validation obeys pipelineLayout lifetime
6760 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
6761
Tobin Ehlis88452832015-12-03 09:40:56 -07006762 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07006763 // 1. Error due to not binding required set (we actually use same code as
6764 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006765 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6766 &descriptorSet[0], 0, NULL);
6767 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
6768 &descriptorSet[1], 0, NULL);
6769 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07006770 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006771 m_errorMonitor->VerifyFound();
6772
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006773 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006774 // 2. Error due to bound set not being compatible with PSO's
6775 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006776 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6777 &descriptorSet[0], 0, NULL);
6778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07006779 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006780 m_errorMonitor->VerifyFound();
6781
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006782 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07006783 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006784 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
6785 }
6786 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006787 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006788 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6789 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006790 vkFreeMemory(m_device->device(), imageMem, NULL);
6791 vkDestroyImage(m_device->device(), image, NULL);
6792 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006793}
Tobin Ehlis559c6382015-11-05 09:52:49 -07006794
Karl Schultz6addd812016-02-02 17:17:23 -07006795TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006796
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6798 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006799
6800 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006801 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006802 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006803 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006804
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006805 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006806}
6807
Karl Schultz6addd812016-02-02 17:17:23 -07006808TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
6809 VkResult err;
6810 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006811
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006813
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006814 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006815
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006816 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006817 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06006818 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006819 cmd.commandPool = m_commandPool;
6820 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006821 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06006822
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006823 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06006824 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006825
6826 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006827 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006828 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006829 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06006830 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006831 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006832 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006833
6834 // The error should be caught by validation of the BeginCommandBuffer call
6835 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
6836
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006837 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006838 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006839}
6840
Karl Schultz6addd812016-02-02 17:17:23 -07006841TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006842 // Cause error due to Begin while recording CB
6843 // Then cause 2 errors for attempting to reset CB w/o having
6844 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
6845 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06006846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006847
6848 ASSERT_NO_FATAL_FAILURE(InitState());
6849
6850 // Calls AllocateCommandBuffers
6851 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
6852
Karl Schultz6addd812016-02-02 17:17:23 -07006853 // Force the failure by setting the Renderpass and Framebuffer fields with
6854 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006855 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006856 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006857 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6858 cmd_buf_info.pNext = NULL;
6859 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006860 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006861
6862 // Begin CB to transition to recording state
6863 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
6864 // Can't re-begin. This should trigger error
6865 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006866 m_errorMonitor->VerifyFound();
6867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006869 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
6870 // Reset attempt will trigger error due to incorrect CommandPool state
6871 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006872 m_errorMonitor->VerifyFound();
6873
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006875 // Transition CB to RECORDED state
6876 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
6877 // Now attempting to Begin will implicitly reset, which triggers error
6878 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006879 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006880}
6881
Karl Schultz6addd812016-02-02 17:17:23 -07006882TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006883 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07006884 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006885
Mike Weiblencce7ec72016-10-17 19:33:05 -06006886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006887
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006888 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006889 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006890
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006891 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006892 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6893 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006894
6895 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006896 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6897 ds_pool_ci.pNext = NULL;
6898 ds_pool_ci.maxSets = 1;
6899 ds_pool_ci.poolSizeCount = 1;
6900 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006901
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006902 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006903 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006904 ASSERT_VK_SUCCESS(err);
6905
Tony Barboureb254902015-07-15 12:50:33 -06006906 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006907 dsl_binding.binding = 0;
6908 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6909 dsl_binding.descriptorCount = 1;
6910 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6911 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006912
Tony Barboureb254902015-07-15 12:50:33 -06006913 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006914 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6915 ds_layout_ci.pNext = NULL;
6916 ds_layout_ci.bindingCount = 1;
6917 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006918
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006919 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006920 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006921 ASSERT_VK_SUCCESS(err);
6922
6923 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006924 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006925 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006926 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006927 alloc_info.descriptorPool = ds_pool;
6928 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006929 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006930 ASSERT_VK_SUCCESS(err);
6931
Tony Barboureb254902015-07-15 12:50:33 -06006932 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006933 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6934 pipeline_layout_ci.setLayoutCount = 1;
6935 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006936
6937 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006938 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006939 ASSERT_VK_SUCCESS(err);
6940
Tobin Ehlise68360f2015-10-01 11:15:13 -06006941 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07006942 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06006943
6944 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006945 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
6946 vp_state_ci.scissorCount = 1;
6947 vp_state_ci.pScissors = &sc;
6948 vp_state_ci.viewportCount = 1;
6949 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06006950
Karl Schultzdfdb8d42016-03-08 10:30:21 -07006951 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
6952 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
6953 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
6954 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
6955 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
6956 rs_state_ci.depthClampEnable = VK_FALSE;
6957 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
6958 rs_state_ci.depthBiasEnable = VK_FALSE;
6959
Tony Barboureb254902015-07-15 12:50:33 -06006960 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006961 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
6962 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07006963 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07006964 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
6965 gp_ci.layout = pipeline_layout;
6966 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06006967
6968 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006969 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
6970 pc_ci.initialDataSize = 0;
6971 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006972
6973 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06006974 VkPipelineCache pipelineCache;
6975
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006976 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06006977 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006978 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006979
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006980 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006981
Chia-I Wuf7458c52015-10-26 21:10:41 +08006982 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6983 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6984 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6985 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006986}
Tobin Ehlis912df022015-09-17 08:46:18 -06006987/*// TODO : This test should be good, but needs Tess support in compiler to run
6988TEST_F(VkLayerTest, InvalidPatchControlPoints)
6989{
6990 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06006991 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006992
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006994 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
6995primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006996
Tobin Ehlis912df022015-09-17 08:46:18 -06006997 ASSERT_NO_FATAL_FAILURE(InitState());
6998 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06006999
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007000 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007001 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007002 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007003
7004 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7005 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7006 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007007 ds_pool_ci.poolSizeCount = 1;
7008 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007009
7010 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007011 err = vkCreateDescriptorPool(m_device->device(),
7012VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007013 ASSERT_VK_SUCCESS(err);
7014
7015 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007016 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007017 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007018 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007019 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7020 dsl_binding.pImmutableSamplers = NULL;
7021
7022 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007023 ds_layout_ci.sType =
7024VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007025 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007026 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007027 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007028
7029 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007030 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7031&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007032 ASSERT_VK_SUCCESS(err);
7033
7034 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007035 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7036VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007037 ASSERT_VK_SUCCESS(err);
7038
7039 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007040 pipeline_layout_ci.sType =
7041VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007042 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007043 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007044 pipeline_layout_ci.pSetLayouts = &ds_layout;
7045
7046 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007047 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7048&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007049 ASSERT_VK_SUCCESS(err);
7050
7051 VkPipelineShaderStageCreateInfo shaderStages[3];
7052 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7053
Karl Schultz6addd812016-02-02 17:17:23 -07007054 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7055this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007056 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007057 VkShaderObj
7058tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7059this);
7060 VkShaderObj
7061te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7062this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007063
Karl Schultz6addd812016-02-02 17:17:23 -07007064 shaderStages[0].sType =
7065VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007066 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007067 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007068 shaderStages[1].sType =
7069VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007070 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007071 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007072 shaderStages[2].sType =
7073VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007074 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007075 shaderStages[2].shader = te.handle();
7076
7077 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007078 iaCI.sType =
7079VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007080 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007081
7082 VkPipelineTessellationStateCreateInfo tsCI = {};
7083 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7084 tsCI.patchControlPoints = 0; // This will cause an error
7085
7086 VkGraphicsPipelineCreateInfo gp_ci = {};
7087 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7088 gp_ci.pNext = NULL;
7089 gp_ci.stageCount = 3;
7090 gp_ci.pStages = shaderStages;
7091 gp_ci.pVertexInputState = NULL;
7092 gp_ci.pInputAssemblyState = &iaCI;
7093 gp_ci.pTessellationState = &tsCI;
7094 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007095 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007096 gp_ci.pMultisampleState = NULL;
7097 gp_ci.pDepthStencilState = NULL;
7098 gp_ci.pColorBlendState = NULL;
7099 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7100 gp_ci.layout = pipeline_layout;
7101 gp_ci.renderPass = renderPass();
7102
7103 VkPipelineCacheCreateInfo pc_ci = {};
7104 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7105 pc_ci.pNext = NULL;
7106 pc_ci.initialSize = 0;
7107 pc_ci.initialData = 0;
7108 pc_ci.maxSize = 0;
7109
7110 VkPipeline pipeline;
7111 VkPipelineCache pipelineCache;
7112
Karl Schultz6addd812016-02-02 17:17:23 -07007113 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7114&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007115 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007116 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7117&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007118
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007119 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007120
Chia-I Wuf7458c52015-10-26 21:10:41 +08007121 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7122 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7123 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7124 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007125}
7126*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06007127// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07007128TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007129 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007130
Mark Lobodzinski6fcae552016-12-18 08:57:03 -07007131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007132
Tobin Ehlise68360f2015-10-01 11:15:13 -06007133 ASSERT_NO_FATAL_FAILURE(InitState());
7134 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007135
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007136 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007137 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7138 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007139
7140 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007141 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7142 ds_pool_ci.maxSets = 1;
7143 ds_pool_ci.poolSizeCount = 1;
7144 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007145
7146 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007147 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007148 ASSERT_VK_SUCCESS(err);
7149
7150 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007151 dsl_binding.binding = 0;
7152 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7153 dsl_binding.descriptorCount = 1;
7154 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007155
7156 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007157 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7158 ds_layout_ci.bindingCount = 1;
7159 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007160
7161 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007162 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007163 ASSERT_VK_SUCCESS(err);
7164
7165 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007166 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007167 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007168 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007169 alloc_info.descriptorPool = ds_pool;
7170 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007171 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007172 ASSERT_VK_SUCCESS(err);
7173
7174 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007175 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7176 pipeline_layout_ci.setLayoutCount = 1;
7177 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007178
7179 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007181 ASSERT_VK_SUCCESS(err);
7182
7183 VkViewport vp = {}; // Just need dummy vp to point to
7184
7185 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007186 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7187 vp_state_ci.scissorCount = 0;
7188 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
7189 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007190
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007191 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7192 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7193 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7194 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7195 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7196 rs_state_ci.depthClampEnable = VK_FALSE;
7197 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7198 rs_state_ci.depthBiasEnable = VK_FALSE;
7199
Cody Northropeb3a6c12015-10-05 14:44:45 -06007200 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007201 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007202
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007203 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7204 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
7205 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007206 shaderStages[0] = vs.GetStageCreateInfo();
7207 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007208
7209 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007210 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7211 gp_ci.stageCount = 2;
7212 gp_ci.pStages = shaderStages;
7213 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007214 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007215 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7216 gp_ci.layout = pipeline_layout;
7217 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007218
7219 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007220 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007221
7222 VkPipeline pipeline;
7223 VkPipelineCache pipelineCache;
7224
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007225 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007226 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007227 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007228
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007229 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007230
Chia-I Wuf7458c52015-10-26 21:10:41 +08007231 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7232 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7233 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7234 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007235}
Karl Schultz6addd812016-02-02 17:17:23 -07007236// Don't set viewport state in PSO. This is an error b/c we always need this
7237// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06007238// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007239TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06007240 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007241 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007242
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Gfx Pipeline pViewportState is null. Even if ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007244
Tobin Ehlise68360f2015-10-01 11:15:13 -06007245 ASSERT_NO_FATAL_FAILURE(InitState());
7246 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007247
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007248 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007249 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7250 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007251
7252 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007253 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7254 ds_pool_ci.maxSets = 1;
7255 ds_pool_ci.poolSizeCount = 1;
7256 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007257
7258 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007259 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007260 ASSERT_VK_SUCCESS(err);
7261
7262 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007263 dsl_binding.binding = 0;
7264 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7265 dsl_binding.descriptorCount = 1;
7266 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007267
7268 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007269 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7270 ds_layout_ci.bindingCount = 1;
7271 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007272
7273 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007274 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007275 ASSERT_VK_SUCCESS(err);
7276
7277 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007278 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007279 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007280 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007281 alloc_info.descriptorPool = ds_pool;
7282 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007283 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007284 ASSERT_VK_SUCCESS(err);
7285
7286 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007287 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7288 pipeline_layout_ci.setLayoutCount = 1;
7289 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007290
7291 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007292 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007293 ASSERT_VK_SUCCESS(err);
7294
7295 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7296 // Set scissor as dynamic to avoid second error
7297 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007298 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7299 dyn_state_ci.dynamicStateCount = 1;
7300 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007301
Cody Northropeb3a6c12015-10-05 14:44:45 -06007302 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007303 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007304
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007305 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7306 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
7307 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007308 shaderStages[0] = vs.GetStageCreateInfo();
7309 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007310
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007311 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7312 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7313 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7314 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7315 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7316 rs_state_ci.depthClampEnable = VK_FALSE;
7317 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7318 rs_state_ci.depthBiasEnable = VK_FALSE;
7319
Tobin Ehlise68360f2015-10-01 11:15:13 -06007320 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007321 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7322 gp_ci.stageCount = 2;
7323 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007324 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007325 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
7326 // should cause validation error
7327 gp_ci.pDynamicState = &dyn_state_ci;
7328 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7329 gp_ci.layout = pipeline_layout;
7330 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007331
7332 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007333 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007334
7335 VkPipeline pipeline;
7336 VkPipelineCache pipelineCache;
7337
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007338 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007339 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007340 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007341
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007342 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007343
Chia-I Wuf7458c52015-10-26 21:10:41 +08007344 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7345 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7346 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7347 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007348}
7349// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07007350// Then run second test where dynamic scissor count doesn't match PSO scissor
7351// count
7352TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7353 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007354
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7356 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007357
Tobin Ehlise68360f2015-10-01 11:15:13 -06007358 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007359
7360 if (!m_device->phy().features().multiViewport) {
7361 printf("Device does not support multiple viewports/scissors; skipped.\n");
7362 return;
7363 }
7364
Tobin Ehlise68360f2015-10-01 11:15:13 -06007365 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007366
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007367 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007368 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7369 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007370
7371 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007372 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7373 ds_pool_ci.maxSets = 1;
7374 ds_pool_ci.poolSizeCount = 1;
7375 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007376
7377 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007378 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007379 ASSERT_VK_SUCCESS(err);
7380
7381 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007382 dsl_binding.binding = 0;
7383 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7384 dsl_binding.descriptorCount = 1;
7385 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007386
7387 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007388 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7389 ds_layout_ci.bindingCount = 1;
7390 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007391
7392 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007393 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007394 ASSERT_VK_SUCCESS(err);
7395
7396 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007397 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007398 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007399 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007400 alloc_info.descriptorPool = ds_pool;
7401 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007402 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007403 ASSERT_VK_SUCCESS(err);
7404
7405 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007406 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7407 pipeline_layout_ci.setLayoutCount = 1;
7408 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007409
7410 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007411 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007412 ASSERT_VK_SUCCESS(err);
7413
7414 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007415 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7416 vp_state_ci.viewportCount = 1;
7417 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
7418 vp_state_ci.scissorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007419 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06007420
7421 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7422 // Set scissor as dynamic to avoid that error
7423 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007424 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7425 dyn_state_ci.dynamicStateCount = 1;
7426 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007427
Cody Northropeb3a6c12015-10-05 14:44:45 -06007428 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007429 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007430
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007431 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7432 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
7433 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007434 shaderStages[0] = vs.GetStageCreateInfo();
7435 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007436
Cody Northropf6622dc2015-10-06 10:33:21 -06007437 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7438 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7439 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007440 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007441 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007442 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007443 vi_ci.pVertexAttributeDescriptions = nullptr;
7444
7445 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7446 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7447 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7448
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007449 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007450 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06007451 rs_ci.pNext = nullptr;
7452
Mark Youngc89c6312016-03-31 16:03:20 -06007453 VkPipelineColorBlendAttachmentState att = {};
7454 att.blendEnable = VK_FALSE;
7455 att.colorWriteMask = 0xf;
7456
Cody Northropf6622dc2015-10-06 10:33:21 -06007457 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7458 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7459 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007460 cb_ci.attachmentCount = 1;
7461 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06007462
Tobin Ehlise68360f2015-10-01 11:15:13 -06007463 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007464 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7465 gp_ci.stageCount = 2;
7466 gp_ci.pStages = shaderStages;
7467 gp_ci.pVertexInputState = &vi_ci;
7468 gp_ci.pInputAssemblyState = &ia_ci;
7469 gp_ci.pViewportState = &vp_state_ci;
7470 gp_ci.pRasterizationState = &rs_ci;
7471 gp_ci.pColorBlendState = &cb_ci;
7472 gp_ci.pDynamicState = &dyn_state_ci;
7473 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7474 gp_ci.layout = pipeline_layout;
7475 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007476
7477 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007478 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007479
7480 VkPipeline pipeline;
7481 VkPipelineCache pipelineCache;
7482
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007483 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007484 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007485 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007486
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007487 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007488
Tobin Ehlisd332f282015-10-02 11:00:56 -06007489 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07007490 // First need to successfully create the PSO from above by setting
7491 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06007492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by pipeline state object, ");
Karl Schultz6addd812016-02-02 17:17:23 -07007493
7494 VkViewport vp = {}; // Just need dummy vp to point to
7495 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007496 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007497 ASSERT_VK_SUCCESS(err);
7498 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007499 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007500 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07007501 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007502 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07007503 Draw(1, 0, 0, 0);
7504
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007505 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007506
7507 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7508 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7509 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7510 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007511 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007512}
7513// Create PSO w/o non-zero scissorCount but no scissor data
7514// Then run second test where dynamic viewportCount doesn't match PSO
7515// viewportCount
7516TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
7517 VkResult err;
7518
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
Karl Schultz6addd812016-02-02 17:17:23 -07007520
7521 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007522
7523 if (!m_device->phy().features().multiViewport) {
7524 printf("Device does not support multiple viewports/scissors; skipped.\n");
7525 return;
7526 }
7527
Karl Schultz6addd812016-02-02 17:17:23 -07007528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7529
7530 VkDescriptorPoolSize ds_type_count = {};
7531 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7532 ds_type_count.descriptorCount = 1;
7533
7534 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7535 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7536 ds_pool_ci.maxSets = 1;
7537 ds_pool_ci.poolSizeCount = 1;
7538 ds_pool_ci.pPoolSizes = &ds_type_count;
7539
7540 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007541 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07007542 ASSERT_VK_SUCCESS(err);
7543
7544 VkDescriptorSetLayoutBinding dsl_binding = {};
7545 dsl_binding.binding = 0;
7546 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7547 dsl_binding.descriptorCount = 1;
7548 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7549
7550 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7551 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7552 ds_layout_ci.bindingCount = 1;
7553 ds_layout_ci.pBindings = &dsl_binding;
7554
7555 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007556 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07007557 ASSERT_VK_SUCCESS(err);
7558
7559 VkDescriptorSet descriptorSet;
7560 VkDescriptorSetAllocateInfo alloc_info = {};
7561 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7562 alloc_info.descriptorSetCount = 1;
7563 alloc_info.descriptorPool = ds_pool;
7564 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007565 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07007566 ASSERT_VK_SUCCESS(err);
7567
7568 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7569 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7570 pipeline_layout_ci.setLayoutCount = 1;
7571 pipeline_layout_ci.pSetLayouts = &ds_layout;
7572
7573 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007574 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07007575 ASSERT_VK_SUCCESS(err);
7576
7577 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7578 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7579 vp_state_ci.scissorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007580 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007581 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007582 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007583
7584 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
7585 // Set scissor as dynamic to avoid that error
7586 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7587 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7588 dyn_state_ci.dynamicStateCount = 1;
7589 dyn_state_ci.pDynamicStates = &vp_state;
7590
7591 VkPipelineShaderStageCreateInfo shaderStages[2];
7592 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7593
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007594 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7595 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
7596 // but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07007597 shaderStages[0] = vs.GetStageCreateInfo();
7598 shaderStages[1] = fs.GetStageCreateInfo();
7599
7600 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7601 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7602 vi_ci.pNext = nullptr;
7603 vi_ci.vertexBindingDescriptionCount = 0;
7604 vi_ci.pVertexBindingDescriptions = nullptr;
7605 vi_ci.vertexAttributeDescriptionCount = 0;
7606 vi_ci.pVertexAttributeDescriptions = nullptr;
7607
7608 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7609 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7610 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7611
7612 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7613 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7614 rs_ci.pNext = nullptr;
7615
Mark Youngc89c6312016-03-31 16:03:20 -06007616 VkPipelineColorBlendAttachmentState att = {};
7617 att.blendEnable = VK_FALSE;
7618 att.colorWriteMask = 0xf;
7619
Karl Schultz6addd812016-02-02 17:17:23 -07007620 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7621 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7622 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007623 cb_ci.attachmentCount = 1;
7624 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07007625
7626 VkGraphicsPipelineCreateInfo gp_ci = {};
7627 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7628 gp_ci.stageCount = 2;
7629 gp_ci.pStages = shaderStages;
7630 gp_ci.pVertexInputState = &vi_ci;
7631 gp_ci.pInputAssemblyState = &ia_ci;
7632 gp_ci.pViewportState = &vp_state_ci;
7633 gp_ci.pRasterizationState = &rs_ci;
7634 gp_ci.pColorBlendState = &cb_ci;
7635 gp_ci.pDynamicState = &dyn_state_ci;
7636 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7637 gp_ci.layout = pipeline_layout;
7638 gp_ci.renderPass = renderPass();
7639
7640 VkPipelineCacheCreateInfo pc_ci = {};
7641 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7642
7643 VkPipeline pipeline;
7644 VkPipelineCache pipelineCache;
7645
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007646 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07007647 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007648 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007649
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007650 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007651
7652 // Now hit second fail case where we set scissor w/ different count than PSO
7653 // First need to successfully create the PSO from above by setting
7654 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06007655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007656
Tobin Ehlisd332f282015-10-02 11:00:56 -06007657 VkRect2D sc = {}; // Just need dummy vp to point to
7658 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007659 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007660 ASSERT_VK_SUCCESS(err);
7661 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007662 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007663 VkViewport viewports[1] = {}; // don't care about data
Tobin Ehlisd332f282015-10-02 11:00:56 -06007664 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007665 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007666 Draw(1, 0, 0, 0);
7667
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007668 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007669
Chia-I Wuf7458c52015-10-26 21:10:41 +08007670 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7671 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7672 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7673 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007674 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007675}
7676
Mark Young7394fdd2016-03-31 14:56:43 -06007677TEST_F(VkLayerTest, PSOLineWidthInvalid) {
7678 VkResult err;
7679
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007680 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06007681
7682 ASSERT_NO_FATAL_FAILURE(InitState());
7683 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7684
7685 VkDescriptorPoolSize ds_type_count = {};
7686 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7687 ds_type_count.descriptorCount = 1;
7688
7689 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7690 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7691 ds_pool_ci.maxSets = 1;
7692 ds_pool_ci.poolSizeCount = 1;
7693 ds_pool_ci.pPoolSizes = &ds_type_count;
7694
7695 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007696 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06007697 ASSERT_VK_SUCCESS(err);
7698
7699 VkDescriptorSetLayoutBinding dsl_binding = {};
7700 dsl_binding.binding = 0;
7701 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7702 dsl_binding.descriptorCount = 1;
7703 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7704
7705 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7706 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7707 ds_layout_ci.bindingCount = 1;
7708 ds_layout_ci.pBindings = &dsl_binding;
7709
7710 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007711 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06007712 ASSERT_VK_SUCCESS(err);
7713
7714 VkDescriptorSet descriptorSet;
7715 VkDescriptorSetAllocateInfo alloc_info = {};
7716 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7717 alloc_info.descriptorSetCount = 1;
7718 alloc_info.descriptorPool = ds_pool;
7719 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007720 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06007721 ASSERT_VK_SUCCESS(err);
7722
7723 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7724 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7725 pipeline_layout_ci.setLayoutCount = 1;
7726 pipeline_layout_ci.pSetLayouts = &ds_layout;
7727
7728 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007729 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06007730 ASSERT_VK_SUCCESS(err);
7731
7732 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7733 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7734 vp_state_ci.scissorCount = 1;
7735 vp_state_ci.pScissors = NULL;
7736 vp_state_ci.viewportCount = 1;
7737 vp_state_ci.pViewports = NULL;
7738
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007739 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06007740 // Set scissor as dynamic to avoid that error
7741 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7742 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7743 dyn_state_ci.dynamicStateCount = 2;
7744 dyn_state_ci.pDynamicStates = dynamic_states;
7745
7746 VkPipelineShaderStageCreateInfo shaderStages[2];
7747 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7748
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007749 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7750 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Young7394fdd2016-03-31 14:56:43 -06007751 this); // TODO - We shouldn't need a fragment shader
7752 // but add it to be able to run on more devices
7753 shaderStages[0] = vs.GetStageCreateInfo();
7754 shaderStages[1] = fs.GetStageCreateInfo();
7755
7756 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7757 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7758 vi_ci.pNext = nullptr;
7759 vi_ci.vertexBindingDescriptionCount = 0;
7760 vi_ci.pVertexBindingDescriptions = nullptr;
7761 vi_ci.vertexAttributeDescriptionCount = 0;
7762 vi_ci.pVertexAttributeDescriptions = nullptr;
7763
7764 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7765 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7766 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7767
7768 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7769 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7770 rs_ci.pNext = nullptr;
7771
Mark Young47107952016-05-02 15:59:55 -06007772 // Check too low (line width of -1.0f).
7773 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06007774
7775 VkPipelineColorBlendAttachmentState att = {};
7776 att.blendEnable = VK_FALSE;
7777 att.colorWriteMask = 0xf;
7778
7779 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7780 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7781 cb_ci.pNext = nullptr;
7782 cb_ci.attachmentCount = 1;
7783 cb_ci.pAttachments = &att;
7784
7785 VkGraphicsPipelineCreateInfo gp_ci = {};
7786 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7787 gp_ci.stageCount = 2;
7788 gp_ci.pStages = shaderStages;
7789 gp_ci.pVertexInputState = &vi_ci;
7790 gp_ci.pInputAssemblyState = &ia_ci;
7791 gp_ci.pViewportState = &vp_state_ci;
7792 gp_ci.pRasterizationState = &rs_ci;
7793 gp_ci.pColorBlendState = &cb_ci;
7794 gp_ci.pDynamicState = &dyn_state_ci;
7795 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7796 gp_ci.layout = pipeline_layout;
7797 gp_ci.renderPass = renderPass();
7798
7799 VkPipelineCacheCreateInfo pc_ci = {};
7800 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7801
7802 VkPipeline pipeline;
7803 VkPipelineCache pipelineCache;
7804
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007805 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007806 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007807 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007808
7809 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06007810 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007811
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06007813
7814 // Check too high (line width of 65536.0f).
7815 rs_ci.lineWidth = 65536.0f;
7816
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007817 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007818 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007819 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007820
7821 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06007822 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007823
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06007825
7826 dyn_state_ci.dynamicStateCount = 3;
7827
7828 rs_ci.lineWidth = 1.0f;
7829
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007830 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007831 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007832 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007833 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007834 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007835
7836 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06007837 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06007838 m_errorMonitor->VerifyFound();
7839
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06007841
7842 // Check too high with dynamic setting.
7843 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
7844 m_errorMonitor->VerifyFound();
7845 EndCommandBuffer();
7846
7847 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7848 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7849 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7850 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007851 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007852}
7853
Karl Schultz6addd812016-02-02 17:17:23 -07007854TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007855 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7857 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007858
7859 ASSERT_NO_FATAL_FAILURE(InitState());
7860 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007861
Tony Barbourfe3351b2015-07-28 10:17:20 -06007862 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007863 // Don't care about RenderPass handle b/c error should be flagged before
7864 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007865 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007866
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007867 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007868}
7869
Karl Schultz6addd812016-02-02 17:17:23 -07007870TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007871 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7873 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007874
7875 ASSERT_NO_FATAL_FAILURE(InitState());
7876 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007877
Tony Barbourfe3351b2015-07-28 10:17:20 -06007878 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007879 // Just create a dummy Renderpass that's non-NULL so we can get to the
7880 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007881 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007882
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007883 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007884}
7885
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007886TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
7887 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
7888 "the number of renderPass attachments that use loadOp"
7889 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
7890
7891 ASSERT_NO_FATAL_FAILURE(InitState());
7892 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7893
7894 // Create a renderPass with a single attachment that uses loadOp CLEAR
7895 VkAttachmentReference attach = {};
7896 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7897 VkSubpassDescription subpass = {};
7898 subpass.inputAttachmentCount = 1;
7899 subpass.pInputAttachments = &attach;
7900 VkRenderPassCreateInfo rpci = {};
7901 rpci.subpassCount = 1;
7902 rpci.pSubpasses = &subpass;
7903 rpci.attachmentCount = 1;
7904 VkAttachmentDescription attach_desc = {};
7905 attach_desc.format = VK_FORMAT_UNDEFINED;
7906 // Set loadOp to CLEAR
7907 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7908 rpci.pAttachments = &attach_desc;
7909 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
7910 VkRenderPass rp;
7911 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7912
7913 VkCommandBufferInheritanceInfo hinfo = {};
7914 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7915 hinfo.renderPass = VK_NULL_HANDLE;
7916 hinfo.subpass = 0;
7917 hinfo.framebuffer = VK_NULL_HANDLE;
7918 hinfo.occlusionQueryEnable = VK_FALSE;
7919 hinfo.queryFlags = 0;
7920 hinfo.pipelineStatistics = 0;
7921 VkCommandBufferBeginInfo info = {};
7922 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
7923 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7924 info.pInheritanceInfo = &hinfo;
7925
7926 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
7927 VkRenderPassBeginInfo rp_begin = {};
7928 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
7929 rp_begin.pNext = NULL;
7930 rp_begin.renderPass = renderPass();
7931 rp_begin.framebuffer = framebuffer();
7932 rp_begin.clearValueCount = 0; // Should be 1
7933
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has a clearValueCount of 0 but "
7935 "there must be at least 1 entries in "
7936 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007937
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007938 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007939
7940 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06007941
7942 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007943}
7944
Slawomir Cygan0808f392016-11-28 17:53:23 +01007945TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
7946 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is greater than"
7947 "the number of renderPass attachments that use loadOp"
7948 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
7949
7950 ASSERT_NO_FATAL_FAILURE(InitState());
7951 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7952
7953 // Create a renderPass with a single attachment that uses loadOp CLEAR
7954 VkAttachmentReference attach = {};
7955 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7956 VkSubpassDescription subpass = {};
7957 subpass.inputAttachmentCount = 1;
7958 subpass.pInputAttachments = &attach;
7959 VkRenderPassCreateInfo rpci = {};
7960 rpci.subpassCount = 1;
7961 rpci.pSubpasses = &subpass;
7962 rpci.attachmentCount = 1;
7963 VkAttachmentDescription attach_desc = {};
7964 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
7965 // Set loadOp to CLEAR
7966 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7967 rpci.pAttachments = &attach_desc;
7968 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
7969 VkRenderPass rp;
7970 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7971
7972 VkCommandBufferBeginInfo info = {};
7973 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
7974 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7975
7976 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
7977 VkRenderPassBeginInfo rp_begin = {};
7978 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
7979 rp_begin.pNext = NULL;
7980 rp_begin.renderPass = renderPass();
7981 rp_begin.framebuffer = framebuffer();
7982 rp_begin.clearValueCount = 2; // Should be 1
7983
7984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " has a clearValueCount of"
7985 " 2 but only first 1 entries in pClearValues array are used");
7986
7987 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
7988
7989 m_errorMonitor->VerifyFound();
7990
7991 vkDestroyRenderPass(m_device->device(), rp, NULL);
7992}
7993
7994
Cody Northrop3bb4d962016-05-09 16:15:57 -06007995TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
7996
7997 TEST_DESCRIPTION("End a command buffer with an active render pass");
7998
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8000 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008001
8002 ASSERT_NO_FATAL_FAILURE(InitState());
8003 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8004
8005 // The framework's BeginCommandBuffer calls CreateRenderPass
8006 BeginCommandBuffer();
8007
8008 // Call directly into vkEndCommandBuffer instead of the
8009 // the framework's EndCommandBuffer, which inserts a
8010 // vkEndRenderPass
8011 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
8012
8013 m_errorMonitor->VerifyFound();
8014
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008015 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8016 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008017}
8018
Karl Schultz6addd812016-02-02 17:17:23 -07008019TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008020 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008021 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8022 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008023
8024 ASSERT_NO_FATAL_FAILURE(InitState());
8025 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008026
8027 // Renderpass is started here
8028 BeginCommandBuffer();
8029
8030 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008031 vk_testing::Buffer dstBuffer;
8032 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008033
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008034 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008035
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008036 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008037}
8038
Karl Schultz6addd812016-02-02 17:17:23 -07008039TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008040 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8042 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008043
8044 ASSERT_NO_FATAL_FAILURE(InitState());
8045 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008046
8047 // Renderpass is started here
8048 BeginCommandBuffer();
8049
8050 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008051 vk_testing::Buffer dstBuffer;
8052 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008053
Karl Schultz6addd812016-02-02 17:17:23 -07008054 VkDeviceSize dstOffset = 0;
8055 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06008056 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008057
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008058 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008059
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008060 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008061}
8062
Karl Schultz6addd812016-02-02 17:17:23 -07008063TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008064 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8066 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008067
8068 ASSERT_NO_FATAL_FAILURE(InitState());
8069 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008070
8071 // Renderpass is started here
8072 BeginCommandBuffer();
8073
Michael Lentine0a369f62016-02-03 16:51:46 -06008074 VkClearColorValue clear_color;
8075 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008076 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8077 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8078 const int32_t tex_width = 32;
8079 const int32_t tex_height = 32;
8080 VkImageCreateInfo image_create_info = {};
8081 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8082 image_create_info.pNext = NULL;
8083 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8084 image_create_info.format = tex_format;
8085 image_create_info.extent.width = tex_width;
8086 image_create_info.extent.height = tex_height;
8087 image_create_info.extent.depth = 1;
8088 image_create_info.mipLevels = 1;
8089 image_create_info.arrayLayers = 1;
8090 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8091 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8092 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008093
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008094 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008095 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008096
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008097 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008098
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008099 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008100
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008101 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008102}
8103
Karl Schultz6addd812016-02-02 17:17:23 -07008104TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008105 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008106 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8107 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008108
8109 ASSERT_NO_FATAL_FAILURE(InitState());
8110 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008111
8112 // Renderpass is started here
8113 BeginCommandBuffer();
8114
8115 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008116 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008117 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8118 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8119 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8120 image_create_info.extent.width = 64;
8121 image_create_info.extent.height = 64;
8122 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8123 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008124
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008125 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008126 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008127
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008128 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008129
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008130 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
8131 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008132
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008133 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008134}
8135
Karl Schultz6addd812016-02-02 17:17:23 -07008136TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008137 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008138 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008139
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearAttachments(): This call "
8141 "must be issued inside an active "
8142 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008143
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008144 ASSERT_NO_FATAL_FAILURE(InitState());
8145 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008146
8147 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008148 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008149 ASSERT_VK_SUCCESS(err);
8150
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008151 VkClearAttachment color_attachment;
8152 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8153 color_attachment.clearValue.color.float32[0] = 0;
8154 color_attachment.clearValue.color.float32[1] = 0;
8155 color_attachment.clearValue.color.float32[2] = 0;
8156 color_attachment.clearValue.color.float32[3] = 0;
8157 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008158 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008159 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008160
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008161 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008162}
8163
Chris Forbes3b97e932016-09-07 11:29:24 +12008164TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
8165 TEST_DESCRIPTION("Test that an error is produced when CmdNextSubpass is "
8166 "called too many times in a renderpass instance");
8167
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdNextSubpass(): Attempted to advance "
8169 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008170
8171 ASSERT_NO_FATAL_FAILURE(InitState());
8172 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8173
8174 BeginCommandBuffer();
8175
8176 // error here.
8177 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8178 m_errorMonitor->VerifyFound();
8179
8180 EndCommandBuffer();
8181}
8182
Chris Forbes6d624702016-09-07 13:57:05 +12008183TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
8184 TEST_DESCRIPTION("Test that an error is produced when CmdEndRenderPass is "
8185 "called before the final subpass has been reached");
8186
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdEndRenderPass(): Called before reaching "
8188 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008189
8190 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008191 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8192 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008193
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008194 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008195
8196 VkRenderPass rp;
8197 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8198 ASSERT_VK_SUCCESS(err);
8199
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008200 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008201
8202 VkFramebuffer fb;
8203 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8204 ASSERT_VK_SUCCESS(err);
8205
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008206 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008207
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008208 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {16, 16}}, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008209
8210 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8211
8212 // Error here.
8213 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8214 m_errorMonitor->VerifyFound();
8215
8216 // Clean up.
8217 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8218 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8219}
8220
Karl Schultz9e66a292016-04-21 15:57:51 -06008221TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8222 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8224 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008225
8226 ASSERT_NO_FATAL_FAILURE(InitState());
8227 BeginCommandBuffer();
8228
8229 VkBufferMemoryBarrier buf_barrier = {};
8230 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8231 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8232 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8233 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8234 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8235 buf_barrier.buffer = VK_NULL_HANDLE;
8236 buf_barrier.offset = 0;
8237 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008238 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8239 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008240
8241 m_errorMonitor->VerifyFound();
8242}
8243
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008244TEST_F(VkLayerTest, InvalidBarriers) {
8245 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8246
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008248
8249 ASSERT_NO_FATAL_FAILURE(InitState());
8250 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8251
8252 VkMemoryBarrier mem_barrier = {};
8253 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8254 mem_barrier.pNext = NULL;
8255 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8256 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8257 BeginCommandBuffer();
8258 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008259 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008260 &mem_barrier, 0, nullptr, 0, nullptr);
8261 m_errorMonitor->VerifyFound();
8262
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008264 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008265 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008266 ASSERT_TRUE(image.initialized());
8267 VkImageMemoryBarrier img_barrier = {};
8268 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8269 img_barrier.pNext = NULL;
8270 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8271 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8272 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8273 // New layout can't be UNDEFINED
8274 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8275 img_barrier.image = image.handle();
8276 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8277 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8278 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8279 img_barrier.subresourceRange.baseArrayLayer = 0;
8280 img_barrier.subresourceRange.baseMipLevel = 0;
8281 img_barrier.subresourceRange.layerCount = 1;
8282 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008283 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8284 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008285 m_errorMonitor->VerifyFound();
8286 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8287
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the "
8289 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008290 // baseArrayLayer + layerCount must be <= image's arrayLayers
8291 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008292 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8293 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008294 m_errorMonitor->VerifyFound();
8295 img_barrier.subresourceRange.baseArrayLayer = 0;
8296
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008297 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008298 // baseMipLevel + levelCount must be <= image's mipLevels
8299 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008300 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8301 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008302 m_errorMonitor->VerifyFound();
8303 img_barrier.subresourceRange.baseMipLevel = 0;
8304
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer Barriers cannot be used during a render pass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008306 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008307 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8308 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008309 VkBufferMemoryBarrier buf_barrier = {};
8310 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8311 buf_barrier.pNext = NULL;
8312 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8313 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8314 buf_barrier.buffer = buffer.handle();
8315 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8316 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8317 buf_barrier.offset = 0;
8318 buf_barrier.size = VK_WHOLE_SIZE;
8319 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008320 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8321 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008322 m_errorMonitor->VerifyFound();
8323 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8324
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008326 buf_barrier.offset = 257;
8327 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008328 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8329 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008330 m_errorMonitor->VerifyFound();
8331 buf_barrier.offset = 0;
8332
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008334 buf_barrier.size = 257;
8335 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008336 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8337 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008338 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008339
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008340 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008341 m_errorMonitor->SetDesiredFailureMsg(
8342 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8343 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
8344 m_errorMonitor->SetDesiredFailureMsg(
8345 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8346 "Depth/stencil image formats must have at least one of VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008347 VkDepthStencilObj ds_image(m_device);
8348 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
8349 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06008350 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
8351 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008352 img_barrier.image = ds_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008353 // Use of COLOR aspect on DS image is error
8354 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008355 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8356 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008357 m_errorMonitor->VerifyFound();
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008358 // Now test depth-only
8359 VkFormatProperties format_props;
8360
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008361 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
8362 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008363 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8364 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
8365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8366 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008367 VkDepthStencilObj d_image(m_device);
8368 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
8369 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008370 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008371 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008372 img_barrier.image = d_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008373 // Use of COLOR aspect on depth image is error
8374 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008375 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8376 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008377 m_errorMonitor->VerifyFound();
8378 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008379 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
8380 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008381 // Now test stencil-only
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8383 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008384 VkDepthStencilObj s_image(m_device);
8385 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
8386 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008387 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008388 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008389 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008390 // Use of COLOR aspect on depth image is error
8391 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008392 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8393 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008394 m_errorMonitor->VerifyFound();
8395 }
8396 // Finally test color
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008397 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8398 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
8399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8400 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008401 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008402 c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008403 ASSERT_TRUE(c_image.initialized());
8404 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8405 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
8406 img_barrier.image = c_image.handle();
8407 // Set aspect to depth (non-color)
8408 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008409 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8410 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008411 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008412
8413 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
8414
8415 // Create command pool with incompatible queueflags
8416 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
8417 uint32_t queue_family_index = UINT32_MAX;
8418 for (uint32_t i = 0; i < queue_props.size(); i++) {
8419 if ((queue_props[i].queueFlags & VK_QUEUE_COMPUTE_BIT) == 0) {
8420 queue_family_index = i;
8421 break;
8422 }
8423 }
8424 if (queue_family_index == UINT32_MAX) {
8425 printf("No non-compute queue found; skipped.\n");
8426 return;
8427 }
8428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
8429
8430 VkCommandPool command_pool;
8431 VkCommandPoolCreateInfo pool_create_info{};
8432 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
8433 pool_create_info.queueFamilyIndex = queue_family_index;
8434 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
8435 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
8436
8437 // Allocate a command buffer
8438 VkCommandBuffer bad_command_buffer;
8439 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
8440 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
8441 command_buffer_allocate_info.commandPool = command_pool;
8442 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
8443 command_buffer_allocate_info.commandBufferCount = 1;
8444 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
8445
8446 VkCommandBufferBeginInfo cbbi = {};
8447 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8448 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
8449 buf_barrier.offset = 0;
8450 buf_barrier.size = VK_WHOLE_SIZE;
8451 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
8452 &buf_barrier, 0, nullptr);
8453 m_errorMonitor->VerifyFound();
8454
8455 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
8456 vkEndCommandBuffer(bad_command_buffer);
8457 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
8458 printf("The non-compute queue does not support graphics; skipped.\n");
8459 return;
8460 }
8461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
8462 VkEvent event;
8463 VkEventCreateInfo event_create_info{};
8464 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
8465 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
8466 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
8467 nullptr, 0, nullptr);
8468 m_errorMonitor->VerifyFound();
8469
8470 vkEndCommandBuffer(bad_command_buffer);
8471 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008472}
8473
Tony Barbour18ba25c2016-09-29 13:42:40 -06008474TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
8475 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
8476
8477 m_errorMonitor->SetDesiredFailureMsg(
8478 VK_DEBUG_REPORT_WARNING_BIT_EXT,
8479 "must have required access bit");
8480 ASSERT_NO_FATAL_FAILURE(InitState());
8481 VkImageObj image(m_device);
Tony Barbour256c80a2016-10-05 13:23:46 -06008482 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06008483 ASSERT_TRUE(image.initialized());
8484
8485 VkImageMemoryBarrier barrier = {};
8486 VkImageSubresourceRange range;
8487 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8488 barrier.srcAccessMask = 0;
8489 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
8490 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
8491 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8492 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8493 barrier.image = image.handle();
8494 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8495 range.baseMipLevel = 0;
8496 range.levelCount = 1;
8497 range.baseArrayLayer = 0;
8498 range.layerCount = 1;
8499 barrier.subresourceRange = range;
8500 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
8501 cmdbuf.BeginCommandBuffer();
8502 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
8503 &barrier);
8504 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8505 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
8506 barrier.srcAccessMask = 0;
8507 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
8508 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
8509 &barrier);
8510
8511 m_errorMonitor->VerifyFound();
8512}
8513
Karl Schultz6addd812016-02-02 17:17:23 -07008514TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008515 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008516 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008517
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008519
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008520 ASSERT_NO_FATAL_FAILURE(InitState());
8521 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008522 uint32_t qfi = 0;
8523 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008524 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8525 buffCI.size = 1024;
8526 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8527 buffCI.queueFamilyIndexCount = 1;
8528 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008529
8530 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008531 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008532 ASSERT_VK_SUCCESS(err);
8533
8534 BeginCommandBuffer();
8535 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008536 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8537 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008538 // Should error before calling to driver so don't care about actual data
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008539 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7, VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008540
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008541 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008542
Chia-I Wuf7458c52015-10-26 21:10:41 +08008543 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008544}
8545
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008546TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
8547 // Create an out-of-range queueFamilyIndex
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8549 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
8550 "of the indices specified when the device was created, via the "
8551 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008552
8553 ASSERT_NO_FATAL_FAILURE(InitState());
8554 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8555 VkBufferCreateInfo buffCI = {};
8556 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8557 buffCI.size = 1024;
8558 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8559 buffCI.queueFamilyIndexCount = 1;
8560 // Introduce failure by specifying invalid queue_family_index
8561 uint32_t qfi = 777;
8562 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06008563 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008564
8565 VkBuffer ib;
8566 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
8567
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008568 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008569 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008570}
8571
Karl Schultz6addd812016-02-02 17:17:23 -07008572TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -06008573TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer"
Tobin Ehlis0c94db02016-07-19 10:49:32 -06008574 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008575
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008576 ASSERT_NO_FATAL_FAILURE(InitState());
8577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008578
Chris Forbesf29a84f2016-10-06 18:39:28 +13008579 // An empty primary command buffer
8580 VkCommandBufferObj cb(m_device, m_commandPool);
8581 cb.BeginCommandBuffer();
8582 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06008583
Chris Forbesf29a84f2016-10-06 18:39:28 +13008584 m_commandBuffer->BeginCommandBuffer();
8585 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
8586 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008587
Chris Forbesf29a84f2016-10-06 18:39:28 +13008588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
8589 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008590 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008591}
8592
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008593TEST_F(VkLayerTest, DSUsageBitsErrors) {
8594 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
8595 "that do not have correct usage bits sets.");
8596 VkResult err;
8597
8598 ASSERT_NO_FATAL_FAILURE(InitState());
8599 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8600 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8601 ds_type_count[i].type = VkDescriptorType(i);
8602 ds_type_count[i].descriptorCount = 1;
8603 }
8604 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8605 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8606 ds_pool_ci.pNext = NULL;
8607 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8608 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8609 ds_pool_ci.pPoolSizes = ds_type_count;
8610
8611 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008612 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008613 ASSERT_VK_SUCCESS(err);
8614
8615 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008616 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008617 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8618 dsl_binding[i].binding = 0;
8619 dsl_binding[i].descriptorType = VkDescriptorType(i);
8620 dsl_binding[i].descriptorCount = 1;
8621 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
8622 dsl_binding[i].pImmutableSamplers = NULL;
8623 }
8624
8625 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8626 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8627 ds_layout_ci.pNext = NULL;
8628 ds_layout_ci.bindingCount = 1;
8629 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
8630 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8631 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008632 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008633 ASSERT_VK_SUCCESS(err);
8634 }
8635 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8636 VkDescriptorSetAllocateInfo alloc_info = {};
8637 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8638 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8639 alloc_info.descriptorPool = ds_pool;
8640 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008641 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008642 ASSERT_VK_SUCCESS(err);
8643
8644 // Create a buffer & bufferView to be used for invalid updates
8645 VkBufferCreateInfo buff_ci = {};
8646 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8647 // This usage is not valid for any descriptor type
8648 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
8649 buff_ci.size = 256;
8650 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8651 VkBuffer buffer;
8652 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
8653 ASSERT_VK_SUCCESS(err);
8654
8655 VkBufferViewCreateInfo buff_view_ci = {};
8656 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
8657 buff_view_ci.buffer = buffer;
8658 buff_view_ci.format = VK_FORMAT_R8_UNORM;
8659 buff_view_ci.range = VK_WHOLE_SIZE;
8660 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008661 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008662 ASSERT_VK_SUCCESS(err);
8663
8664 // Create an image to be used for invalid updates
8665 VkImageCreateInfo image_ci = {};
8666 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8667 image_ci.imageType = VK_IMAGE_TYPE_2D;
8668 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
8669 image_ci.extent.width = 64;
8670 image_ci.extent.height = 64;
8671 image_ci.extent.depth = 1;
8672 image_ci.mipLevels = 1;
8673 image_ci.arrayLayers = 1;
8674 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
8675 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
8676 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
8677 // This usage is not valid for any descriptor type
8678 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8679 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8680 VkImage image;
8681 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
8682 ASSERT_VK_SUCCESS(err);
8683 // Bind memory to image
8684 VkMemoryRequirements mem_reqs;
8685 VkDeviceMemory image_mem;
8686 bool pass;
8687 VkMemoryAllocateInfo mem_alloc = {};
8688 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8689 mem_alloc.pNext = NULL;
8690 mem_alloc.allocationSize = 0;
8691 mem_alloc.memoryTypeIndex = 0;
8692 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
8693 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008694 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008695 ASSERT_TRUE(pass);
8696 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
8697 ASSERT_VK_SUCCESS(err);
8698 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
8699 ASSERT_VK_SUCCESS(err);
8700 // Now create view for image
8701 VkImageViewCreateInfo image_view_ci = {};
8702 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8703 image_view_ci.image = image;
8704 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
8705 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
8706 image_view_ci.subresourceRange.layerCount = 1;
8707 image_view_ci.subresourceRange.baseArrayLayer = 0;
8708 image_view_ci.subresourceRange.levelCount = 1;
8709 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8710 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008711 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008712 ASSERT_VK_SUCCESS(err);
8713
8714 VkDescriptorBufferInfo buff_info = {};
8715 buff_info.buffer = buffer;
8716 VkDescriptorImageInfo img_info = {};
8717 img_info.imageView = image_view;
8718 VkWriteDescriptorSet descriptor_write = {};
8719 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8720 descriptor_write.dstBinding = 0;
8721 descriptor_write.descriptorCount = 1;
8722 descriptor_write.pTexelBufferView = &buff_view;
8723 descriptor_write.pBufferInfo = &buff_info;
8724 descriptor_write.pImageInfo = &img_info;
8725
8726 // These error messages align with VkDescriptorType struct
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008727 const char *error_msgs[] = {"", // placeholder, no error for SAMPLER descriptor
8728 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
8729 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
8730 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
8731 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
8732 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
8733 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
8734 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
8735 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
8736 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
8737 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008738 // Start loop at 1 as SAMPLER desc type has no usage bit error
8739 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8740 descriptor_write.descriptorType = VkDescriptorType(i);
8741 descriptor_write.dstSet = descriptor_sets[i];
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msgs[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008743
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008744 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008745
8746 m_errorMonitor->VerifyFound();
8747 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
8748 }
8749 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
8750 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008751 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008752 vkDestroyImageView(m_device->device(), image_view, NULL);
8753 vkDestroyBuffer(m_device->device(), buffer, NULL);
8754 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008755 vkFreeDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008756 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8757}
8758
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008759TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008760 TEST_DESCRIPTION("Attempt to update buffer descriptor set that has incorrect "
8761 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
8762 "1. offset value greater than buffer size\n"
8763 "2. range value of 0\n"
8764 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008765 VkResult err;
8766
8767 ASSERT_NO_FATAL_FAILURE(InitState());
8768 VkDescriptorPoolSize ds_type_count = {};
8769 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8770 ds_type_count.descriptorCount = 1;
8771
8772 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8773 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8774 ds_pool_ci.pNext = NULL;
8775 ds_pool_ci.maxSets = 1;
8776 ds_pool_ci.poolSizeCount = 1;
8777 ds_pool_ci.pPoolSizes = &ds_type_count;
8778
8779 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008780 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008781 ASSERT_VK_SUCCESS(err);
8782
8783 // Create layout with single uniform buffer descriptor
8784 VkDescriptorSetLayoutBinding dsl_binding = {};
8785 dsl_binding.binding = 0;
8786 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8787 dsl_binding.descriptorCount = 1;
8788 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8789 dsl_binding.pImmutableSamplers = NULL;
8790
8791 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8792 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8793 ds_layout_ci.pNext = NULL;
8794 ds_layout_ci.bindingCount = 1;
8795 ds_layout_ci.pBindings = &dsl_binding;
8796 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008797 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008798 ASSERT_VK_SUCCESS(err);
8799
8800 VkDescriptorSet descriptor_set = {};
8801 VkDescriptorSetAllocateInfo alloc_info = {};
8802 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8803 alloc_info.descriptorSetCount = 1;
8804 alloc_info.descriptorPool = ds_pool;
8805 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008806 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008807 ASSERT_VK_SUCCESS(err);
8808
8809 // Create a buffer to be used for invalid updates
8810 VkBufferCreateInfo buff_ci = {};
8811 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8812 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8813 buff_ci.size = 256;
8814 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8815 VkBuffer buffer;
8816 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
8817 ASSERT_VK_SUCCESS(err);
8818 // Have to bind memory to buffer before descriptor update
8819 VkMemoryAllocateInfo mem_alloc = {};
8820 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8821 mem_alloc.pNext = NULL;
8822 mem_alloc.allocationSize = 256;
8823 mem_alloc.memoryTypeIndex = 0;
8824
8825 VkMemoryRequirements mem_reqs;
8826 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008827 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008828 if (!pass) {
8829 vkDestroyBuffer(m_device->device(), buffer, NULL);
8830 return;
8831 }
8832
8833 VkDeviceMemory mem;
8834 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
8835 ASSERT_VK_SUCCESS(err);
8836 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
8837 ASSERT_VK_SUCCESS(err);
8838
8839 VkDescriptorBufferInfo buff_info = {};
8840 buff_info.buffer = buffer;
8841 // First make offset 1 larger than buffer size
8842 buff_info.offset = 257;
8843 buff_info.range = VK_WHOLE_SIZE;
8844 VkWriteDescriptorSet descriptor_write = {};
8845 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8846 descriptor_write.dstBinding = 0;
8847 descriptor_write.descriptorCount = 1;
8848 descriptor_write.pTexelBufferView = nullptr;
8849 descriptor_write.pBufferInfo = &buff_info;
8850 descriptor_write.pImageInfo = nullptr;
8851
8852 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8853 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " offset of 257 is greater than buffer ");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008855
8856 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8857
8858 m_errorMonitor->VerifyFound();
8859 // Now cause error due to range of 0
8860 buff_info.offset = 0;
8861 buff_info.range = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8863 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008864
8865 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8866
8867 m_errorMonitor->VerifyFound();
8868 // Now cause error due to range exceeding buffer size - offset
8869 buff_info.offset = 128;
8870 buff_info.range = 200;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " range is 200 which is greater than buffer size ");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008872
8873 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8874
8875 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06008876 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008877 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8878 vkDestroyBuffer(m_device->device(), buffer, NULL);
8879 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
8880 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8881}
8882
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008883TEST_F(VkLayerTest, DSAspectBitsErrors) {
8884 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
8885 // are set, but could expand this test to hit more cases.
8886 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
8887 "that do not have correct aspect bits sets.");
8888 VkResult err;
8889
8890 ASSERT_NO_FATAL_FAILURE(InitState());
8891 VkDescriptorPoolSize ds_type_count = {};
8892 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8893 ds_type_count.descriptorCount = 1;
8894
8895 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8896 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8897 ds_pool_ci.pNext = NULL;
8898 ds_pool_ci.maxSets = 5;
8899 ds_pool_ci.poolSizeCount = 1;
8900 ds_pool_ci.pPoolSizes = &ds_type_count;
8901
8902 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008903 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008904 ASSERT_VK_SUCCESS(err);
8905
8906 VkDescriptorSetLayoutBinding dsl_binding = {};
8907 dsl_binding.binding = 0;
8908 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8909 dsl_binding.descriptorCount = 1;
8910 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8911 dsl_binding.pImmutableSamplers = NULL;
8912
8913 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8914 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8915 ds_layout_ci.pNext = NULL;
8916 ds_layout_ci.bindingCount = 1;
8917 ds_layout_ci.pBindings = &dsl_binding;
8918 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008919 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008920 ASSERT_VK_SUCCESS(err);
8921
8922 VkDescriptorSet descriptor_set = {};
8923 VkDescriptorSetAllocateInfo alloc_info = {};
8924 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8925 alloc_info.descriptorSetCount = 1;
8926 alloc_info.descriptorPool = ds_pool;
8927 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008928 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008929 ASSERT_VK_SUCCESS(err);
8930
8931 // Create an image to be used for invalid updates
8932 VkImageCreateInfo image_ci = {};
8933 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8934 image_ci.imageType = VK_IMAGE_TYPE_2D;
8935 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
8936 image_ci.extent.width = 64;
8937 image_ci.extent.height = 64;
8938 image_ci.extent.depth = 1;
8939 image_ci.mipLevels = 1;
8940 image_ci.arrayLayers = 1;
8941 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
8942 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
8943 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
8944 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8945 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8946 VkImage image;
8947 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
8948 ASSERT_VK_SUCCESS(err);
8949 // Bind memory to image
8950 VkMemoryRequirements mem_reqs;
8951 VkDeviceMemory image_mem;
8952 bool pass;
8953 VkMemoryAllocateInfo mem_alloc = {};
8954 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8955 mem_alloc.pNext = NULL;
8956 mem_alloc.allocationSize = 0;
8957 mem_alloc.memoryTypeIndex = 0;
8958 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
8959 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008960 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008961 ASSERT_TRUE(pass);
8962 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
8963 ASSERT_VK_SUCCESS(err);
8964 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
8965 ASSERT_VK_SUCCESS(err);
8966 // Now create view for image
8967 VkImageViewCreateInfo image_view_ci = {};
8968 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8969 image_view_ci.image = image;
8970 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
8971 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
8972 image_view_ci.subresourceRange.layerCount = 1;
8973 image_view_ci.subresourceRange.baseArrayLayer = 0;
8974 image_view_ci.subresourceRange.levelCount = 1;
8975 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008976 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008977
8978 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008979 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008980 ASSERT_VK_SUCCESS(err);
8981
8982 VkDescriptorImageInfo img_info = {};
8983 img_info.imageView = image_view;
8984 VkWriteDescriptorSet descriptor_write = {};
8985 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8986 descriptor_write.dstBinding = 0;
8987 descriptor_write.descriptorCount = 1;
8988 descriptor_write.pTexelBufferView = NULL;
8989 descriptor_write.pBufferInfo = NULL;
8990 descriptor_write.pImageInfo = &img_info;
8991 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8992 descriptor_write.dstSet = descriptor_set;
8993 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
8994 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008996
8997 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8998
8999 m_errorMonitor->VerifyFound();
9000 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9001 vkDestroyImage(m_device->device(), image, NULL);
9002 vkFreeMemory(m_device->device(), image_mem, NULL);
9003 vkDestroyImageView(m_device->device(), image_view, NULL);
9004 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9005 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9006}
9007
Karl Schultz6addd812016-02-02 17:17:23 -07009008TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009009 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07009010 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009011
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9013 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
9014 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009015
Tobin Ehlis3b780662015-05-28 12:11:26 -06009016 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009017 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009018 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009019 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9020 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009021
9022 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009023 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9024 ds_pool_ci.pNext = NULL;
9025 ds_pool_ci.maxSets = 1;
9026 ds_pool_ci.poolSizeCount = 1;
9027 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009028
Tobin Ehlis3b780662015-05-28 12:11:26 -06009029 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009030 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009031 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009032 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009033 dsl_binding.binding = 0;
9034 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9035 dsl_binding.descriptorCount = 1;
9036 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9037 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009038
Tony Barboureb254902015-07-15 12:50:33 -06009039 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009040 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9041 ds_layout_ci.pNext = NULL;
9042 ds_layout_ci.bindingCount = 1;
9043 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009044
Tobin Ehlis3b780662015-05-28 12:11:26 -06009045 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009046 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009047 ASSERT_VK_SUCCESS(err);
9048
9049 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009050 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009051 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009052 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009053 alloc_info.descriptorPool = ds_pool;
9054 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009055 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009056 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009057
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009058 VkSamplerCreateInfo sampler_ci = {};
9059 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9060 sampler_ci.pNext = NULL;
9061 sampler_ci.magFilter = VK_FILTER_NEAREST;
9062 sampler_ci.minFilter = VK_FILTER_NEAREST;
9063 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9064 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9065 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9066 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9067 sampler_ci.mipLodBias = 1.0;
9068 sampler_ci.anisotropyEnable = VK_FALSE;
9069 sampler_ci.maxAnisotropy = 1;
9070 sampler_ci.compareEnable = VK_FALSE;
9071 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9072 sampler_ci.minLod = 1.0;
9073 sampler_ci.maxLod = 1.0;
9074 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9075 sampler_ci.unnormalizedCoordinates = VK_FALSE;
9076 VkSampler sampler;
9077 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9078 ASSERT_VK_SUCCESS(err);
9079
9080 VkDescriptorImageInfo info = {};
9081 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009082
9083 VkWriteDescriptorSet descriptor_write;
9084 memset(&descriptor_write, 0, sizeof(descriptor_write));
9085 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009086 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009087 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009088 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009089 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009090 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009091
9092 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9093
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009094 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009095
Chia-I Wuf7458c52015-10-26 21:10:41 +08009096 vkDestroySampler(m_device->device(), sampler, NULL);
9097 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9098 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009099}
9100
Karl Schultz6addd812016-02-02 17:17:23 -07009101TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009102 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07009103 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009104
Tobin Ehlisf922ef82016-11-30 10:19:14 -07009105 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009106
Tobin Ehlis3b780662015-05-28 12:11:26 -06009107 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009108 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009109 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009110 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9111 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009112
9113 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009114 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9115 ds_pool_ci.pNext = NULL;
9116 ds_pool_ci.maxSets = 1;
9117 ds_pool_ci.poolSizeCount = 1;
9118 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009119
Tobin Ehlis3b780662015-05-28 12:11:26 -06009120 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009121 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009122 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009123
Tony Barboureb254902015-07-15 12:50:33 -06009124 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009125 dsl_binding.binding = 0;
9126 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9127 dsl_binding.descriptorCount = 1;
9128 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9129 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009130
9131 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009132 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9133 ds_layout_ci.pNext = NULL;
9134 ds_layout_ci.bindingCount = 1;
9135 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009136
Tobin Ehlis3b780662015-05-28 12:11:26 -06009137 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009138 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009139 ASSERT_VK_SUCCESS(err);
9140
9141 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009142 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009143 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009144 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009145 alloc_info.descriptorPool = ds_pool;
9146 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009147 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009148 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009149
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009150 // Correctly update descriptor to avoid "NOT_UPDATED" error
9151 VkDescriptorBufferInfo buff_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009152 buff_info.buffer = VkBuffer(0); // Don't care about buffer handle for this test
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009153 buff_info.offset = 0;
9154 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009155
9156 VkWriteDescriptorSet descriptor_write;
9157 memset(&descriptor_write, 0, sizeof(descriptor_write));
9158 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009159 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009160 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08009161 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009162 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9163 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009164
9165 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9166
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009167 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009168
Chia-I Wuf7458c52015-10-26 21:10:41 +08009169 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9170 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009171}
9172
Karl Schultz6addd812016-02-02 17:17:23 -07009173TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009174 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -07009175 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009176
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009178
Tobin Ehlis3b780662015-05-28 12:11:26 -06009179 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009180 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009181 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009182 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9183 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009184
9185 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009186 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9187 ds_pool_ci.pNext = NULL;
9188 ds_pool_ci.maxSets = 1;
9189 ds_pool_ci.poolSizeCount = 1;
9190 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009191
Tobin Ehlis3b780662015-05-28 12:11:26 -06009192 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009193 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009194 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009195
Tony Barboureb254902015-07-15 12:50:33 -06009196 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009197 dsl_binding.binding = 0;
9198 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9199 dsl_binding.descriptorCount = 1;
9200 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9201 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009202
9203 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009204 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9205 ds_layout_ci.pNext = NULL;
9206 ds_layout_ci.bindingCount = 1;
9207 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009208 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009209 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009210 ASSERT_VK_SUCCESS(err);
9211
9212 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009213 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009214 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009215 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009216 alloc_info.descriptorPool = ds_pool;
9217 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009218 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009219 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009220
Tony Barboureb254902015-07-15 12:50:33 -06009221 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009222 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9223 sampler_ci.pNext = NULL;
9224 sampler_ci.magFilter = VK_FILTER_NEAREST;
9225 sampler_ci.minFilter = VK_FILTER_NEAREST;
9226 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9227 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9228 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9229 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9230 sampler_ci.mipLodBias = 1.0;
9231 sampler_ci.anisotropyEnable = VK_FALSE;
9232 sampler_ci.maxAnisotropy = 1;
9233 sampler_ci.compareEnable = VK_FALSE;
9234 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9235 sampler_ci.minLod = 1.0;
9236 sampler_ci.maxLod = 1.0;
9237 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9238 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06009239
Tobin Ehlis3b780662015-05-28 12:11:26 -06009240 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009241 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009242 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009243
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009244 VkDescriptorImageInfo info = {};
9245 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009246
9247 VkWriteDescriptorSet descriptor_write;
9248 memset(&descriptor_write, 0, sizeof(descriptor_write));
9249 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009250 descriptor_write.dstSet = descriptorSet;
9251 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009252 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009253 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009254 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009255 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009256
9257 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9258
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009259 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009260
Chia-I Wuf7458c52015-10-26 21:10:41 +08009261 vkDestroySampler(m_device->device(), sampler, NULL);
9262 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9263 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009264}
9265
Tobin Ehlise202b2d2016-11-21 10:36:16 -07009266TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
9267 // Create layout w/ empty binding and attempt to update it
9268 VkResult err;
9269
9270 ASSERT_NO_FATAL_FAILURE(InitState());
9271
9272 VkDescriptorPoolSize ds_type_count = {};
9273 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
9274 ds_type_count.descriptorCount = 1;
9275
9276 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9277 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9278 ds_pool_ci.pNext = NULL;
9279 ds_pool_ci.maxSets = 1;
9280 ds_pool_ci.poolSizeCount = 1;
9281 ds_pool_ci.pPoolSizes = &ds_type_count;
9282
9283 VkDescriptorPool ds_pool;
9284 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9285 ASSERT_VK_SUCCESS(err);
9286
9287 VkDescriptorSetLayoutBinding dsl_binding = {};
9288 dsl_binding.binding = 0;
9289 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9290 dsl_binding.descriptorCount = 0;
9291 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9292 dsl_binding.pImmutableSamplers = NULL;
9293
9294 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9295 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9296 ds_layout_ci.pNext = NULL;
9297 ds_layout_ci.bindingCount = 1;
9298 ds_layout_ci.pBindings = &dsl_binding;
9299 VkDescriptorSetLayout ds_layout;
9300 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9301 ASSERT_VK_SUCCESS(err);
9302
9303 VkDescriptorSet descriptor_set;
9304 VkDescriptorSetAllocateInfo alloc_info = {};
9305 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9306 alloc_info.descriptorSetCount = 1;
9307 alloc_info.descriptorPool = ds_pool;
9308 alloc_info.pSetLayouts = &ds_layout;
9309 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9310 ASSERT_VK_SUCCESS(err);
9311
9312 VkSamplerCreateInfo sampler_ci = {};
9313 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9314 sampler_ci.magFilter = VK_FILTER_NEAREST;
9315 sampler_ci.minFilter = VK_FILTER_NEAREST;
9316 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9317 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9318 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9319 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9320 sampler_ci.mipLodBias = 1.0;
9321 sampler_ci.maxAnisotropy = 1;
9322 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9323 sampler_ci.minLod = 1.0;
9324 sampler_ci.maxLod = 1.0;
9325 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9326
9327 VkSampler sampler;
9328 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9329 ASSERT_VK_SUCCESS(err);
9330
9331 VkDescriptorImageInfo info = {};
9332 info.sampler = sampler;
9333
9334 VkWriteDescriptorSet descriptor_write;
9335 memset(&descriptor_write, 0, sizeof(descriptor_write));
9336 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9337 descriptor_write.dstSet = descriptor_set;
9338 descriptor_write.dstBinding = 0;
9339 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
9340 // This is the wrong type, but empty binding error will be flagged first
9341 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9342 descriptor_write.pImageInfo = &info;
9343
9344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
9345 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9346 m_errorMonitor->VerifyFound();
9347
9348 vkDestroySampler(m_device->device(), sampler, NULL);
9349 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9350 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9351}
9352
Karl Schultz6addd812016-02-02 17:17:23 -07009353TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
9354 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
9355 // types
9356 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009357
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009359
Tobin Ehlis3b780662015-05-28 12:11:26 -06009360 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009361
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009362 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009363 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9364 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009365
9366 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009367 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9368 ds_pool_ci.pNext = NULL;
9369 ds_pool_ci.maxSets = 1;
9370 ds_pool_ci.poolSizeCount = 1;
9371 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009372
Tobin Ehlis3b780662015-05-28 12:11:26 -06009373 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009374 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009375 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009376 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009377 dsl_binding.binding = 0;
9378 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9379 dsl_binding.descriptorCount = 1;
9380 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9381 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009382
Tony Barboureb254902015-07-15 12:50:33 -06009383 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009384 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9385 ds_layout_ci.pNext = NULL;
9386 ds_layout_ci.bindingCount = 1;
9387 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009388
Tobin Ehlis3b780662015-05-28 12:11:26 -06009389 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009390 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009391 ASSERT_VK_SUCCESS(err);
9392
9393 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009394 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009395 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009396 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009397 alloc_info.descriptorPool = ds_pool;
9398 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009399 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009400 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009401
Tony Barboureb254902015-07-15 12:50:33 -06009402 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009403 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9404 sampler_ci.pNext = NULL;
9405 sampler_ci.magFilter = VK_FILTER_NEAREST;
9406 sampler_ci.minFilter = VK_FILTER_NEAREST;
9407 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9408 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9409 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9410 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9411 sampler_ci.mipLodBias = 1.0;
9412 sampler_ci.anisotropyEnable = VK_FALSE;
9413 sampler_ci.maxAnisotropy = 1;
9414 sampler_ci.compareEnable = VK_FALSE;
9415 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9416 sampler_ci.minLod = 1.0;
9417 sampler_ci.maxLod = 1.0;
9418 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9419 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009420 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009421 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009422 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009423
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009424 VkDescriptorImageInfo info = {};
9425 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009426
9427 VkWriteDescriptorSet descriptor_write;
9428 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009429 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009430 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009431 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009432 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009433 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009434 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009435
9436 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9437
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009438 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009439
Chia-I Wuf7458c52015-10-26 21:10:41 +08009440 vkDestroySampler(m_device->device(), sampler, NULL);
9441 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9442 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009443}
9444
Karl Schultz6addd812016-02-02 17:17:23 -07009445TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009446 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07009447 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009448
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9450 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009451
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009452 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009453 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
9454 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009455 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009456 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
9457 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009458
9459 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009460 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9461 ds_pool_ci.pNext = NULL;
9462 ds_pool_ci.maxSets = 1;
9463 ds_pool_ci.poolSizeCount = 1;
9464 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009465
9466 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009467 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009468 ASSERT_VK_SUCCESS(err);
9469
9470 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009471 dsl_binding.binding = 0;
9472 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9473 dsl_binding.descriptorCount = 1;
9474 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9475 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009476
9477 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009478 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9479 ds_layout_ci.pNext = NULL;
9480 ds_layout_ci.bindingCount = 1;
9481 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009482 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009483 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009484 ASSERT_VK_SUCCESS(err);
9485
9486 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009487 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009488 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009489 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009490 alloc_info.descriptorPool = ds_pool;
9491 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009492 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009493 ASSERT_VK_SUCCESS(err);
9494
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009495 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009496
9497 VkDescriptorImageInfo descriptor_info;
9498 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
9499 descriptor_info.sampler = sampler;
9500
9501 VkWriteDescriptorSet descriptor_write;
9502 memset(&descriptor_write, 0, sizeof(descriptor_write));
9503 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009504 descriptor_write.dstSet = descriptorSet;
9505 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009506 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009507 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9508 descriptor_write.pImageInfo = &descriptor_info;
9509
9510 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9511
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009512 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009513
Chia-I Wuf7458c52015-10-26 21:10:41 +08009514 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9515 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009516}
9517
Karl Schultz6addd812016-02-02 17:17:23 -07009518TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
9519 // Create a single combined Image/Sampler descriptor and send it an invalid
9520 // imageView
9521 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009522
Karl Schultzf78bcdd2016-11-30 12:36:01 -07009523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009524
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009525 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009526 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009527 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9528 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009529
9530 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009531 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9532 ds_pool_ci.pNext = NULL;
9533 ds_pool_ci.maxSets = 1;
9534 ds_pool_ci.poolSizeCount = 1;
9535 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009536
9537 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009538 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009539 ASSERT_VK_SUCCESS(err);
9540
9541 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009542 dsl_binding.binding = 0;
9543 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9544 dsl_binding.descriptorCount = 1;
9545 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9546 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009547
9548 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009549 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9550 ds_layout_ci.pNext = NULL;
9551 ds_layout_ci.bindingCount = 1;
9552 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009553 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009554 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009555 ASSERT_VK_SUCCESS(err);
9556
9557 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009558 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009559 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009560 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009561 alloc_info.descriptorPool = ds_pool;
9562 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009563 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009564 ASSERT_VK_SUCCESS(err);
9565
9566 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009567 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9568 sampler_ci.pNext = NULL;
9569 sampler_ci.magFilter = VK_FILTER_NEAREST;
9570 sampler_ci.minFilter = VK_FILTER_NEAREST;
9571 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9572 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9573 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9574 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9575 sampler_ci.mipLodBias = 1.0;
9576 sampler_ci.anisotropyEnable = VK_FALSE;
9577 sampler_ci.maxAnisotropy = 1;
9578 sampler_ci.compareEnable = VK_FALSE;
9579 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9580 sampler_ci.minLod = 1.0;
9581 sampler_ci.maxLod = 1.0;
9582 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9583 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009584
9585 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009586 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009587 ASSERT_VK_SUCCESS(err);
9588
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009589 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009590
9591 VkDescriptorImageInfo descriptor_info;
9592 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
9593 descriptor_info.sampler = sampler;
9594 descriptor_info.imageView = view;
9595
9596 VkWriteDescriptorSet descriptor_write;
9597 memset(&descriptor_write, 0, sizeof(descriptor_write));
9598 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009599 descriptor_write.dstSet = descriptorSet;
9600 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009601 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009602 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9603 descriptor_write.pImageInfo = &descriptor_info;
9604
9605 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9606
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009607 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009608
Chia-I Wuf7458c52015-10-26 21:10:41 +08009609 vkDestroySampler(m_device->device(), sampler, NULL);
9610 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9611 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009612}
9613
Karl Schultz6addd812016-02-02 17:17:23 -07009614TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
9615 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
9616 // into the other
9617 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009618
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding #1 with type "
9620 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
9621 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009622
Tobin Ehlis04356f92015-10-27 16:35:27 -06009623 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009624 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009625 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009626 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9627 ds_type_count[0].descriptorCount = 1;
9628 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
9629 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009630
9631 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009632 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9633 ds_pool_ci.pNext = NULL;
9634 ds_pool_ci.maxSets = 1;
9635 ds_pool_ci.poolSizeCount = 2;
9636 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009637
9638 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009639 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009640 ASSERT_VK_SUCCESS(err);
9641 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009642 dsl_binding[0].binding = 0;
9643 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9644 dsl_binding[0].descriptorCount = 1;
9645 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9646 dsl_binding[0].pImmutableSamplers = NULL;
9647 dsl_binding[1].binding = 1;
9648 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9649 dsl_binding[1].descriptorCount = 1;
9650 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9651 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009652
9653 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009654 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9655 ds_layout_ci.pNext = NULL;
9656 ds_layout_ci.bindingCount = 2;
9657 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009658
9659 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009660 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009661 ASSERT_VK_SUCCESS(err);
9662
9663 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009664 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009665 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009666 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009667 alloc_info.descriptorPool = ds_pool;
9668 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009669 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009670 ASSERT_VK_SUCCESS(err);
9671
9672 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009673 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9674 sampler_ci.pNext = NULL;
9675 sampler_ci.magFilter = VK_FILTER_NEAREST;
9676 sampler_ci.minFilter = VK_FILTER_NEAREST;
9677 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9678 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9679 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9680 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9681 sampler_ci.mipLodBias = 1.0;
9682 sampler_ci.anisotropyEnable = VK_FALSE;
9683 sampler_ci.maxAnisotropy = 1;
9684 sampler_ci.compareEnable = VK_FALSE;
9685 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9686 sampler_ci.minLod = 1.0;
9687 sampler_ci.maxLod = 1.0;
9688 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9689 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009690
9691 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009692 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009693 ASSERT_VK_SUCCESS(err);
9694
9695 VkDescriptorImageInfo info = {};
9696 info.sampler = sampler;
9697
9698 VkWriteDescriptorSet descriptor_write;
9699 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
9700 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009701 descriptor_write.dstSet = descriptorSet;
9702 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08009703 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009704 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9705 descriptor_write.pImageInfo = &info;
9706 // This write update should succeed
9707 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9708 // Now perform a copy update that fails due to type mismatch
9709 VkCopyDescriptorSet copy_ds_update;
9710 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9711 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9712 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06009713 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009714 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07009715 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08009716 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06009717 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9718
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009719 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06009720 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -06009722 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9723 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9724 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009725 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009726 copy_ds_update.dstSet = descriptorSet;
9727 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06009728 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06009729 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9730
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009731 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009732
Tobin Ehlis04356f92015-10-27 16:35:27 -06009733 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
9735 "update array offset of 0 and update of "
9736 "5 descriptors oversteps total number "
9737 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009738
Tobin Ehlis04356f92015-10-27 16:35:27 -06009739 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9740 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9741 copy_ds_update.srcSet = descriptorSet;
9742 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009743 copy_ds_update.dstSet = descriptorSet;
9744 copy_ds_update.dstBinding = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009745 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06009746 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9747
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009748 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06009749
Chia-I Wuf7458c52015-10-26 21:10:41 +08009750 vkDestroySampler(m_device->device(), sampler, NULL);
9751 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9752 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009753}
9754
Karl Schultz6addd812016-02-02 17:17:23 -07009755TEST_F(VkLayerTest, NumSamplesMismatch) {
9756 // Create CommandBuffer where MSAA samples doesn't match RenderPass
9757 // sampleCount
9758 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009759
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009761
Tobin Ehlis3b780662015-05-28 12:11:26 -06009762 ASSERT_NO_FATAL_FAILURE(InitState());
9763 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009764 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06009765 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009766 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009767
9768 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009769 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9770 ds_pool_ci.pNext = NULL;
9771 ds_pool_ci.maxSets = 1;
9772 ds_pool_ci.poolSizeCount = 1;
9773 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009774
Tobin Ehlis3b780662015-05-28 12:11:26 -06009775 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009776 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009777 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009778
Tony Barboureb254902015-07-15 12:50:33 -06009779 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08009780 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06009781 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08009782 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009783 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9784 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009785
Tony Barboureb254902015-07-15 12:50:33 -06009786 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9787 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9788 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009789 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07009790 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009791
Tobin Ehlis3b780662015-05-28 12:11:26 -06009792 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009793 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009794 ASSERT_VK_SUCCESS(err);
9795
9796 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009797 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009798 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009799 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009800 alloc_info.descriptorPool = ds_pool;
9801 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009802 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009803 ASSERT_VK_SUCCESS(err);
9804
Tony Barboureb254902015-07-15 12:50:33 -06009805 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009806 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07009807 pipe_ms_state_ci.pNext = NULL;
9808 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
9809 pipe_ms_state_ci.sampleShadingEnable = 0;
9810 pipe_ms_state_ci.minSampleShading = 1.0;
9811 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009812
Tony Barboureb254902015-07-15 12:50:33 -06009813 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009814 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9815 pipeline_layout_ci.pNext = NULL;
9816 pipeline_layout_ci.setLayoutCount = 1;
9817 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009818
9819 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009820 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009821 ASSERT_VK_SUCCESS(err);
9822
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009823 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9824 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
9825 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06009826 VkPipelineObj pipe(m_device);
9827 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06009828 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06009829 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06009830 pipe.SetMSAA(&pipe_ms_state_ci);
9831 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06009832
Tony Barbourfe3351b2015-07-28 10:17:20 -06009833 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009834 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06009835
Mark Young29927482016-05-04 14:38:51 -06009836 // Render triangle (the error should trigger on the attempt to draw).
9837 Draw(3, 1, 0, 0);
9838
9839 // Finalize recording of the command buffer
9840 EndCommandBuffer();
9841
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009842 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009843
Chia-I Wuf7458c52015-10-26 21:10:41 +08009844 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9845 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9846 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009847}
Mark Young29927482016-05-04 14:38:51 -06009848
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009849TEST_F(VkLayerTest, RenderPassIncompatible) {
9850 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
9851 "Initial case is drawing with an active renderpass that's "
Mike Weiblencce7ec72016-10-17 19:33:05 -06009852 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009853 VkResult err;
9854
9855 ASSERT_NO_FATAL_FAILURE(InitState());
9856 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9857
9858 VkDescriptorSetLayoutBinding dsl_binding = {};
9859 dsl_binding.binding = 0;
9860 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9861 dsl_binding.descriptorCount = 1;
9862 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9863 dsl_binding.pImmutableSamplers = NULL;
9864
9865 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9866 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9867 ds_layout_ci.pNext = NULL;
9868 ds_layout_ci.bindingCount = 1;
9869 ds_layout_ci.pBindings = &dsl_binding;
9870
9871 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009872 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009873 ASSERT_VK_SUCCESS(err);
9874
9875 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9876 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9877 pipeline_layout_ci.pNext = NULL;
9878 pipeline_layout_ci.setLayoutCount = 1;
9879 pipeline_layout_ci.pSetLayouts = &ds_layout;
9880
9881 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009882 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009883 ASSERT_VK_SUCCESS(err);
9884
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009885 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9886 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
9887 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009888 // Create a renderpass that will be incompatible with default renderpass
9889 VkAttachmentReference attach = {};
9890 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
9891 VkAttachmentReference color_att = {};
9892 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9893 VkSubpassDescription subpass = {};
9894 subpass.inputAttachmentCount = 1;
9895 subpass.pInputAttachments = &attach;
9896 subpass.colorAttachmentCount = 1;
9897 subpass.pColorAttachments = &color_att;
9898 VkRenderPassCreateInfo rpci = {};
9899 rpci.subpassCount = 1;
9900 rpci.pSubpasses = &subpass;
9901 rpci.attachmentCount = 1;
9902 VkAttachmentDescription attach_desc = {};
9903 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -06009904 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
9905 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009906 rpci.pAttachments = &attach_desc;
9907 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9908 VkRenderPass rp;
9909 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9910 VkPipelineObj pipe(m_device);
9911 pipe.AddShader(&vs);
9912 pipe.AddShader(&fs);
9913 pipe.AddColorAttachment();
9914 VkViewport view_port = {};
9915 m_viewports.push_back(view_port);
9916 pipe.SetViewport(m_viewports);
9917 VkRect2D rect = {};
9918 m_scissors.push_back(rect);
9919 pipe.SetScissor(m_scissors);
9920 pipe.CreateVKPipeline(pipeline_layout, renderPass());
9921
9922 VkCommandBufferInheritanceInfo cbii = {};
9923 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9924 cbii.renderPass = rp;
9925 cbii.subpass = 0;
9926 VkCommandBufferBeginInfo cbbi = {};
9927 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9928 cbbi.pInheritanceInfo = &cbii;
9929 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
9930 VkRenderPassBeginInfo rpbi = {};
9931 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9932 rpbi.framebuffer = m_framebuffer;
9933 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009934 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9935 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009936
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009938 // Render triangle (the error should trigger on the attempt to draw).
9939 Draw(3, 1, 0, 0);
9940
9941 // Finalize recording of the command buffer
9942 EndCommandBuffer();
9943
9944 m_errorMonitor->VerifyFound();
9945
9946 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9947 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9948 vkDestroyRenderPass(m_device->device(), rp, NULL);
9949}
9950
Mark Youngc89c6312016-03-31 16:03:20 -06009951TEST_F(VkLayerTest, NumBlendAttachMismatch) {
9952 // Create Pipeline where the number of blend attachments doesn't match the
9953 // number of color attachments. In this case, we don't add any color
9954 // blend attachments even though we have a color attachment.
9955 VkResult err;
9956
9957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009958 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06009959
9960 ASSERT_NO_FATAL_FAILURE(InitState());
9961 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9962 VkDescriptorPoolSize ds_type_count = {};
9963 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9964 ds_type_count.descriptorCount = 1;
9965
9966 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9967 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9968 ds_pool_ci.pNext = NULL;
9969 ds_pool_ci.maxSets = 1;
9970 ds_pool_ci.poolSizeCount = 1;
9971 ds_pool_ci.pPoolSizes = &ds_type_count;
9972
9973 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009974 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -06009975 ASSERT_VK_SUCCESS(err);
9976
9977 VkDescriptorSetLayoutBinding dsl_binding = {};
9978 dsl_binding.binding = 0;
9979 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9980 dsl_binding.descriptorCount = 1;
9981 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9982 dsl_binding.pImmutableSamplers = NULL;
9983
9984 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9985 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9986 ds_layout_ci.pNext = NULL;
9987 ds_layout_ci.bindingCount = 1;
9988 ds_layout_ci.pBindings = &dsl_binding;
9989
9990 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009991 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -06009992 ASSERT_VK_SUCCESS(err);
9993
9994 VkDescriptorSet descriptorSet;
9995 VkDescriptorSetAllocateInfo alloc_info = {};
9996 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9997 alloc_info.descriptorSetCount = 1;
9998 alloc_info.descriptorPool = ds_pool;
9999 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010000 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060010001 ASSERT_VK_SUCCESS(err);
10002
10003 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010004 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060010005 pipe_ms_state_ci.pNext = NULL;
10006 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10007 pipe_ms_state_ci.sampleShadingEnable = 0;
10008 pipe_ms_state_ci.minSampleShading = 1.0;
10009 pipe_ms_state_ci.pSampleMask = NULL;
10010
10011 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10012 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10013 pipeline_layout_ci.pNext = NULL;
10014 pipeline_layout_ci.setLayoutCount = 1;
10015 pipeline_layout_ci.pSetLayouts = &ds_layout;
10016
10017 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010018 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010019 ASSERT_VK_SUCCESS(err);
10020
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010021 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10022 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10023 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060010024 VkPipelineObj pipe(m_device);
10025 pipe.AddShader(&vs);
10026 pipe.AddShader(&fs);
10027 pipe.SetMSAA(&pipe_ms_state_ci);
10028 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10029
10030 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010031 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Youngc89c6312016-03-31 16:03:20 -060010032
Mark Young29927482016-05-04 14:38:51 -060010033 // Render triangle (the error should trigger on the attempt to draw).
10034 Draw(3, 1, 0, 0);
10035
10036 // Finalize recording of the command buffer
10037 EndCommandBuffer();
10038
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010039 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060010040
10041 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10042 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10043 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10044}
Mark Young29927482016-05-04 14:38:51 -060010045
Mark Muellerd4914412016-06-13 17:52:06 -060010046TEST_F(VkLayerTest, MissingClearAttachment) {
10047 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
10048 "structure passed to vkCmdClearAttachments");
Cody Northropc31a84f2016-08-22 10:41:47 -060010049 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesda6ae6f2016-09-09 14:36:33 +120010050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesfa79fc72016-11-01 10:18:12 +130010051 "vkCmdClearAttachments() color attachment index 1 out of range for active subpass 0");
Mark Muellerd4914412016-06-13 17:52:06 -060010052
10053 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
10054 m_errorMonitor->VerifyFound();
10055}
10056
Karl Schultz6addd812016-02-02 17:17:23 -070010057TEST_F(VkLayerTest, ClearCmdNoDraw) {
10058 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
10059 // to issuing a Draw
10060 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010061
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060010063 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010064
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010065 ASSERT_NO_FATAL_FAILURE(InitState());
10066 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010067
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010068 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010069 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10070 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010071
10072 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010073 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10074 ds_pool_ci.pNext = NULL;
10075 ds_pool_ci.maxSets = 1;
10076 ds_pool_ci.poolSizeCount = 1;
10077 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010078
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010079 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010080 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010081 ASSERT_VK_SUCCESS(err);
10082
Tony Barboureb254902015-07-15 12:50:33 -060010083 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010084 dsl_binding.binding = 0;
10085 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10086 dsl_binding.descriptorCount = 1;
10087 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10088 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010089
Tony Barboureb254902015-07-15 12:50:33 -060010090 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010091 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10092 ds_layout_ci.pNext = NULL;
10093 ds_layout_ci.bindingCount = 1;
10094 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010095
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010096 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010097 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010098 ASSERT_VK_SUCCESS(err);
10099
10100 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010101 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010102 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010103 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010104 alloc_info.descriptorPool = ds_pool;
10105 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010106 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010107 ASSERT_VK_SUCCESS(err);
10108
Tony Barboureb254902015-07-15 12:50:33 -060010109 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010110 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010111 pipe_ms_state_ci.pNext = NULL;
10112 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10113 pipe_ms_state_ci.sampleShadingEnable = 0;
10114 pipe_ms_state_ci.minSampleShading = 1.0;
10115 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010116
Tony Barboureb254902015-07-15 12:50:33 -060010117 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010118 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10119 pipeline_layout_ci.pNext = NULL;
10120 pipeline_layout_ci.setLayoutCount = 1;
10121 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010122
10123 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010124 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010125 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010126
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010127 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060010128 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070010129 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010130 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010131
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010132 VkPipelineObj pipe(m_device);
10133 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010134 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010135 pipe.SetMSAA(&pipe_ms_state_ci);
10136 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010137
10138 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010139
Karl Schultz6addd812016-02-02 17:17:23 -070010140 // Main thing we care about for this test is that the VkImage obj we're
10141 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010142 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010143 VkClearAttachment color_attachment;
10144 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10145 color_attachment.clearValue.color.float32[0] = 1.0;
10146 color_attachment.clearValue.color.float32[1] = 1.0;
10147 color_attachment.clearValue.color.float32[2] = 1.0;
10148 color_attachment.clearValue.color.float32[3] = 1.0;
10149 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010150 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010151
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010152 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010153
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010154 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010155
Chia-I Wuf7458c52015-10-26 21:10:41 +080010156 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10157 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10158 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010159}
10160
Karl Schultz6addd812016-02-02 17:17:23 -070010161TEST_F(VkLayerTest, VtxBufferBadIndex) {
10162 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010163
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10165 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010166
Tobin Ehlis502480b2015-06-24 15:53:07 -060010167 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060010168 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060010169 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010170
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010171 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010172 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10173 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010174
10175 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010176 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10177 ds_pool_ci.pNext = NULL;
10178 ds_pool_ci.maxSets = 1;
10179 ds_pool_ci.poolSizeCount = 1;
10180 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010181
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010182 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010183 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010184 ASSERT_VK_SUCCESS(err);
10185
Tony Barboureb254902015-07-15 12:50:33 -060010186 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010187 dsl_binding.binding = 0;
10188 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10189 dsl_binding.descriptorCount = 1;
10190 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10191 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010192
Tony Barboureb254902015-07-15 12:50:33 -060010193 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010194 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10195 ds_layout_ci.pNext = NULL;
10196 ds_layout_ci.bindingCount = 1;
10197 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010198
Tobin Ehlis502480b2015-06-24 15:53:07 -060010199 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010200 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010201 ASSERT_VK_SUCCESS(err);
10202
10203 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010204 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010205 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010206 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010207 alloc_info.descriptorPool = ds_pool;
10208 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010209 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010210 ASSERT_VK_SUCCESS(err);
10211
Tony Barboureb254902015-07-15 12:50:33 -060010212 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010213 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010214 pipe_ms_state_ci.pNext = NULL;
10215 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10216 pipe_ms_state_ci.sampleShadingEnable = 0;
10217 pipe_ms_state_ci.minSampleShading = 1.0;
10218 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010219
Tony Barboureb254902015-07-15 12:50:33 -060010220 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010221 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10222 pipeline_layout_ci.pNext = NULL;
10223 pipeline_layout_ci.setLayoutCount = 1;
10224 pipeline_layout_ci.pSetLayouts = &ds_layout;
10225 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010226
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010227 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010228 ASSERT_VK_SUCCESS(err);
10229
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010230 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10231 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10232 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010233 VkPipelineObj pipe(m_device);
10234 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010235 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010236 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010237 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060010238 pipe.SetViewport(m_viewports);
10239 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010240 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010241
10242 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010243 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060010244 // Don't care about actual data, just need to get to draw to flag error
10245 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010246 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060010247 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060010248 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010249
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010250 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010251
Chia-I Wuf7458c52015-10-26 21:10:41 +080010252 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10253 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10254 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010255}
Mark Muellerdfe37552016-07-07 14:47:42 -060010256
Mark Mueller2ee294f2016-08-04 12:59:48 -060010257TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
10258 TEST_DESCRIPTION("Use an invalid count in a vkEnumeratePhysicalDevices call."
10259 "Use invalid Queue Family Index in vkCreateDevice");
Cody Northropc31a84f2016-08-22 10:41:47 -060010260 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Mueller2ee294f2016-08-04 12:59:48 -060010261
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010262 const char *mismatch_count_message = "Call to vkEnumeratePhysicalDevices() "
10263 "w/ pPhysicalDeviceCount value ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010264
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010265 const char *invalid_queueFamilyIndex_message = "Invalid queue create request in vkCreateDevice(). Invalid "
10266 "queueFamilyIndex ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010267
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010268 const char *unavailable_feature_message = "While calling vkCreateDevice(), requesting feature #";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010269
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, mismatch_count_message);
Mark Mueller880fce52016-08-17 15:23:23 -060010271 // The following test fails with recent NVidia drivers.
10272 // By the time core_validation is reached, the NVidia
10273 // driver has sanitized the invalid condition and core_validation
10274 // is not introduced to the failure condition. This is not the case
10275 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010276 // uint32_t count = static_cast<uint32_t>(~0);
10277 // VkPhysicalDevice physical_device;
10278 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
10279 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060010280
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queueFamilyIndex_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010282 float queue_priority = 0.0;
10283
10284 VkDeviceQueueCreateInfo queue_create_info = {};
10285 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
10286 queue_create_info.queueCount = 1;
10287 queue_create_info.pQueuePriorities = &queue_priority;
10288 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
10289
10290 VkPhysicalDeviceFeatures features = m_device->phy().features();
10291 VkDevice testDevice;
10292 VkDeviceCreateInfo device_create_info = {};
10293 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
10294 device_create_info.queueCreateInfoCount = 1;
10295 device_create_info.pQueueCreateInfos = &queue_create_info;
10296 device_create_info.pEnabledFeatures = &features;
10297 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
10298 m_errorMonitor->VerifyFound();
10299
10300 queue_create_info.queueFamilyIndex = 1;
10301
10302 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
10303 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
10304 for (unsigned i = 0; i < feature_count; i++) {
10305 if (VK_FALSE == feature_array[i]) {
10306 feature_array[i] = VK_TRUE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, unavailable_feature_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010308 device_create_info.pEnabledFeatures = &features;
10309 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
10310 m_errorMonitor->VerifyFound();
10311 break;
10312 }
10313 }
10314}
10315
Tobin Ehlis16edf082016-11-21 12:33:49 -070010316TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
10317 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
10318
10319 ASSERT_NO_FATAL_FAILURE(InitState());
10320
10321 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
10322 std::vector<VkDeviceQueueCreateInfo> queue_info;
10323 queue_info.reserve(queue_props.size());
10324 std::vector<std::vector<float>> queue_priorities;
10325 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
10326 VkDeviceQueueCreateInfo qi{};
10327 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
10328 qi.queueFamilyIndex = i;
10329 qi.queueCount = queue_props[i].queueCount;
10330 queue_priorities.emplace_back(qi.queueCount, 0.0f);
10331 qi.pQueuePriorities = queue_priorities[i].data();
10332 queue_info.push_back(qi);
10333 }
10334
10335 std::vector<const char *> device_extension_names;
10336
10337 VkDevice local_device;
10338 VkDeviceCreateInfo device_create_info = {};
10339 auto features = m_device->phy().features();
10340 // Intentionally disable pipeline stats
10341 features.pipelineStatisticsQuery = VK_FALSE;
10342 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
10343 device_create_info.pNext = NULL;
10344 device_create_info.queueCreateInfoCount = queue_info.size();
10345 device_create_info.pQueueCreateInfos = queue_info.data();
10346 device_create_info.enabledLayerCount = 0;
10347 device_create_info.ppEnabledLayerNames = NULL;
10348 device_create_info.pEnabledFeatures = &features;
10349 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
10350 ASSERT_VK_SUCCESS(err);
10351
10352 VkQueryPoolCreateInfo qpci{};
10353 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
10354 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
10355 qpci.queryCount = 1;
10356 VkQueryPool query_pool;
10357
10358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
10359 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
10360 m_errorMonitor->VerifyFound();
10361
10362 vkDestroyDevice(local_device, nullptr);
10363}
10364
Mark Mueller2ee294f2016-08-04 12:59:48 -060010365TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
10366 TEST_DESCRIPTION("Use an invalid queue index in a vkCmdWaitEvents call."
10367 "End a command buffer with a query still in progress.");
10368
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010369 const char *invalid_queue_index = "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
10370 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
10371 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010372
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010373 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010374
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010376
10377 ASSERT_NO_FATAL_FAILURE(InitState());
10378
10379 VkEvent event;
10380 VkEventCreateInfo event_create_info{};
10381 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
10382 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
10383
Mark Mueller2ee294f2016-08-04 12:59:48 -060010384 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010385 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010386
10387 BeginCommandBuffer();
10388
10389 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010390 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010391 ASSERT_TRUE(image.initialized());
10392 VkImageMemoryBarrier img_barrier = {};
10393 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10394 img_barrier.pNext = NULL;
10395 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10396 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10397 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10398 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10399 img_barrier.image = image.handle();
10400 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060010401
10402 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
10403 // that layer validation catches the case when it is not.
10404 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060010405 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10406 img_barrier.subresourceRange.baseArrayLayer = 0;
10407 img_barrier.subresourceRange.baseMipLevel = 0;
10408 img_barrier.subresourceRange.layerCount = 1;
10409 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010410 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
10411 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010412 m_errorMonitor->VerifyFound();
10413
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010414 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010415
10416 VkQueryPool query_pool;
10417 VkQueryPoolCreateInfo query_pool_create_info = {};
10418 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
10419 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
10420 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010421 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010422
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010423 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010424 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
10425
10426 vkEndCommandBuffer(m_commandBuffer->handle());
10427 m_errorMonitor->VerifyFound();
10428
10429 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
10430 vkDestroyEvent(m_device->device(), event, nullptr);
10431}
10432
Mark Muellerdfe37552016-07-07 14:47:42 -060010433TEST_F(VkLayerTest, VertexBufferInvalid) {
10434 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
10435 "delete a buffer twice, use an invalid offset for each "
10436 "buffer type, and attempt to bind a null buffer");
10437
10438 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
10439 "using deleted buffer ";
Mark Muellerdfe37552016-07-07 14:47:42 -060010440 const char *invalid_offset_message = "vkBindBufferMemory(): "
10441 "memoryOffset is 0x";
10442 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
10443 "storage memoryOffset "
10444 "is 0x";
10445 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
10446 "texel memoryOffset "
10447 "is 0x";
10448 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
10449 "uniform memoryOffset "
10450 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060010451
10452 ASSERT_NO_FATAL_FAILURE(InitState());
10453 ASSERT_NO_FATAL_FAILURE(InitViewport());
10454 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10455
10456 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010457 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060010458 pipe_ms_state_ci.pNext = NULL;
10459 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10460 pipe_ms_state_ci.sampleShadingEnable = 0;
10461 pipe_ms_state_ci.minSampleShading = 1.0;
10462 pipe_ms_state_ci.pSampleMask = nullptr;
10463
10464 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10465 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10466 VkPipelineLayout pipeline_layout;
10467
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010468 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060010469 ASSERT_VK_SUCCESS(err);
10470
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010471 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10472 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060010473 VkPipelineObj pipe(m_device);
10474 pipe.AddShader(&vs);
10475 pipe.AddShader(&fs);
10476 pipe.AddColorAttachment();
10477 pipe.SetMSAA(&pipe_ms_state_ci);
10478 pipe.SetViewport(m_viewports);
10479 pipe.SetScissor(m_scissors);
10480 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10481
10482 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010483 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060010484
10485 {
10486 // Create and bind a vertex buffer in a reduced scope, which will cause
10487 // it to be deleted upon leaving this scope
10488 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010489 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060010490 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
10491 draw_verticies.AddVertexInputToPipe(pipe);
10492 }
10493
10494 Draw(1, 0, 0, 0);
10495
10496 EndCommandBuffer();
10497
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060010499 QueueCommandBuffer(false);
10500 m_errorMonitor->VerifyFound();
10501
10502 {
10503 // Create and bind a vertex buffer in a reduced scope, and delete it
10504 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010505 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010506 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060010507 buffer_test.TestDoubleDestroy();
10508 }
10509 m_errorMonitor->VerifyFound();
10510
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010511 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010512 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
10514 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
10515 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010516 m_errorMonitor->VerifyFound();
10517 }
10518
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010519 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
10520 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010521 // Create and bind a memory buffer with an invalid offset again,
10522 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
10524 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10525 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010526 m_errorMonitor->VerifyFound();
10527 }
10528
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010529 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010530 // Create and bind a memory buffer with an invalid offset again, but
10531 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
10533 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10534 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010535 m_errorMonitor->VerifyFound();
10536 }
10537
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010538 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010539 // Create and bind a memory buffer with an invalid offset again, but
10540 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
10542 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10543 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010544 m_errorMonitor->VerifyFound();
10545 }
10546
10547 {
10548 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010549 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010550 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
10551 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010552 m_errorMonitor->VerifyFound();
10553 }
10554
10555 {
10556 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010558 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
10559 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010560 }
10561 m_errorMonitor->VerifyFound();
10562
10563 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10564}
10565
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010566// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
10567TEST_F(VkLayerTest, InvalidImageLayout) {
10568 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010569 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
10570 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010571 // 3 in ValidateCmdBufImageLayouts
10572 // * -1 Attempt to submit cmd buf w/ deleted image
10573 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
10574 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010575
10576 ASSERT_NO_FATAL_FAILURE(InitState());
10577 // Create src & dst images to use for copy operations
10578 VkImage src_image;
10579 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080010580 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010581
10582 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
10583 const int32_t tex_width = 32;
10584 const int32_t tex_height = 32;
10585
10586 VkImageCreateInfo image_create_info = {};
10587 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10588 image_create_info.pNext = NULL;
10589 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10590 image_create_info.format = tex_format;
10591 image_create_info.extent.width = tex_width;
10592 image_create_info.extent.height = tex_height;
10593 image_create_info.extent.depth = 1;
10594 image_create_info.mipLevels = 1;
10595 image_create_info.arrayLayers = 4;
10596 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10597 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10598 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080010599 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010600 image_create_info.flags = 0;
10601
10602 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
10603 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080010604 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010605 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
10606 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080010607 image_create_info.format = VK_FORMAT_D32_SFLOAT;
10608 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
10609 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
10610 ASSERT_VK_SUCCESS(err);
10611
10612 // Allocate memory
10613 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080010614 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080010615 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080010616 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10617 mem_alloc.pNext = NULL;
10618 mem_alloc.allocationSize = 0;
10619 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080010620
10621 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010622 mem_alloc.allocationSize = img_mem_reqs.size;
10623 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010624 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080010625 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080010626 ASSERT_VK_SUCCESS(err);
10627
10628 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010629 mem_alloc.allocationSize = img_mem_reqs.size;
10630 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010631 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080010632 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080010633 ASSERT_VK_SUCCESS(err);
10634
10635 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010636 mem_alloc.allocationSize = img_mem_reqs.size;
10637 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010638 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080010639 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080010640 ASSERT_VK_SUCCESS(err);
10641
10642 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
10643 ASSERT_VK_SUCCESS(err);
10644 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
10645 ASSERT_VK_SUCCESS(err);
10646 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
10647 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010648
10649 BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080010650 VkImageCopy copy_region;
10651 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10652 copy_region.srcSubresource.mipLevel = 0;
10653 copy_region.srcSubresource.baseArrayLayer = 0;
10654 copy_region.srcSubresource.layerCount = 1;
10655 copy_region.srcOffset.x = 0;
10656 copy_region.srcOffset.y = 0;
10657 copy_region.srcOffset.z = 0;
10658 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10659 copy_region.dstSubresource.mipLevel = 0;
10660 copy_region.dstSubresource.baseArrayLayer = 0;
10661 copy_region.dstSubresource.layerCount = 1;
10662 copy_region.dstOffset.x = 0;
10663 copy_region.dstOffset.y = 0;
10664 copy_region.dstOffset.z = 0;
10665 copy_region.extent.width = 1;
10666 copy_region.extent.height = 1;
10667 copy_region.extent.depth = 1;
10668
10669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10670 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
10671 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010672 m_errorMonitor->VerifyFound();
10673 // Now cause error due to src image layout changing
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot copy from an image whose source layout is "
10675 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
10676 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010677 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010678 m_errorMonitor->VerifyFound();
10679 // Final src error is due to bad layout type
10680 m_errorMonitor->SetDesiredFailureMsg(
10681 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10682 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010683 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010684 m_errorMonitor->VerifyFound();
10685 // Now verify same checks for dst
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10687 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010688 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010689 m_errorMonitor->VerifyFound();
10690 // Now cause error due to src image layout changing
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010691 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot copy from an image whose dest layout is "
10692 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
10693 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010694 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010695 m_errorMonitor->VerifyFound();
10696 m_errorMonitor->SetDesiredFailureMsg(
10697 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10698 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010699 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010700 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010701
Cort3b021012016-12-07 12:00:57 -080010702 // Convert dst and depth images to TRANSFER_DST for subsequent tests
10703 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
10704 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10705 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10706 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10707 transfer_dst_image_barrier[0].srcAccessMask = 0;
10708 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
10709 transfer_dst_image_barrier[0].image = dst_image;
10710 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
10711 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
10712 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10713 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10714 NULL, 0, NULL, 1, transfer_dst_image_barrier);
10715 transfer_dst_image_barrier[0].image = depth_image;
10716 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
10717 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10718 NULL, 0, NULL, 1, transfer_dst_image_barrier);
10719
10720 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080010721 VkClearColorValue color_clear_value = {};
10722 VkImageSubresourceRange clear_range;
10723 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10724 clear_range.baseMipLevel = 0;
10725 clear_range.baseArrayLayer = 0;
10726 clear_range.layerCount = 1;
10727 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010728
Cort3b021012016-12-07 12:00:57 -080010729 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
10730 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
10731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
10732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080010733 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010734 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080010735 // Fail due to provided layout not matching actual current layout for color clear.
10736 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080010737 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010738 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080010739
Cort530cf382016-12-08 09:59:47 -080010740 VkClearDepthStencilValue depth_clear_value = {};
10741 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080010742
10743 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
10744 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
10745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
10746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080010747 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080010748 m_errorMonitor->VerifyFound();
10749 // Fail due to provided layout not matching actual current layout for depth clear.
10750 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080010751 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080010752 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010753
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010754 // Now cause error due to bad image layout transition in PipelineBarrier
10755 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080010756 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010757 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080010758 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010759 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080010760 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
10761 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010762 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You cannot transition the layout from "
10764 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when "
10765 "current layout is VK_IMAGE_LAYOUT_GENERAL.");
10766 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10767 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010768 m_errorMonitor->VerifyFound();
10769
10770 // Finally some layout errors at RenderPass create time
10771 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
10772 VkAttachmentReference attach = {};
10773 // perf warning for GENERAL layout w/ non-DS input attachment
10774 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10775 VkSubpassDescription subpass = {};
10776 subpass.inputAttachmentCount = 1;
10777 subpass.pInputAttachments = &attach;
10778 VkRenderPassCreateInfo rpci = {};
10779 rpci.subpassCount = 1;
10780 rpci.pSubpasses = &subpass;
10781 rpci.attachmentCount = 1;
10782 VkAttachmentDescription attach_desc = {};
10783 attach_desc.format = VK_FORMAT_UNDEFINED;
10784 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060010785 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010786 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10788 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010789 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10790 m_errorMonitor->VerifyFound();
10791 // error w/ non-general layout
10792 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10793
10794 m_errorMonitor->SetDesiredFailureMsg(
10795 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10796 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
10797 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10798 m_errorMonitor->VerifyFound();
10799 subpass.inputAttachmentCount = 0;
10800 subpass.colorAttachmentCount = 1;
10801 subpass.pColorAttachments = &attach;
10802 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10803 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10805 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010806 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10807 m_errorMonitor->VerifyFound();
10808 // error w/ non-color opt or GENERAL layout for color attachment
10809 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10810 m_errorMonitor->SetDesiredFailureMsg(
10811 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10812 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
10813 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10814 m_errorMonitor->VerifyFound();
10815 subpass.colorAttachmentCount = 0;
10816 subpass.pDepthStencilAttachment = &attach;
10817 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10818 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10820 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010821 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10822 m_errorMonitor->VerifyFound();
10823 // error w/ non-ds opt or GENERAL layout for color attachment
10824 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10826 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
10827 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010828 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10829 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060010830 // For this error we need a valid renderpass so create default one
10831 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
10832 attach.attachment = 0;
10833 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
10834 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
10835 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
10836 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
10837 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
10838 // Can't do a CLEAR load on READ_ONLY initialLayout
10839 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
10840 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
10841 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010842 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " with invalid first layout "
10843 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
10844 "ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060010845 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10846 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010847
Cort3b021012016-12-07 12:00:57 -080010848 vkFreeMemory(m_device->device(), src_image_mem, NULL);
10849 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
10850 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010851 vkDestroyImage(m_device->device(), src_image, NULL);
10852 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080010853 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010854}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060010855
Tobin Ehlise0936662016-10-11 08:10:51 -060010856TEST_F(VkLayerTest, InvalidStorageImageLayout) {
10857 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
10858 VkResult err;
10859
10860 ASSERT_NO_FATAL_FAILURE(InitState());
10861
10862 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
10863 VkImageTiling tiling;
10864 VkFormatProperties format_properties;
10865 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
10866 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
10867 tiling = VK_IMAGE_TILING_LINEAR;
10868 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
10869 tiling = VK_IMAGE_TILING_OPTIMAL;
10870 } else {
10871 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
10872 "skipped.\n");
10873 return;
10874 }
10875
10876 VkDescriptorPoolSize ds_type = {};
10877 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
10878 ds_type.descriptorCount = 1;
10879
10880 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10881 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10882 ds_pool_ci.maxSets = 1;
10883 ds_pool_ci.poolSizeCount = 1;
10884 ds_pool_ci.pPoolSizes = &ds_type;
10885 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
10886
10887 VkDescriptorPool ds_pool;
10888 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10889 ASSERT_VK_SUCCESS(err);
10890
10891 VkDescriptorSetLayoutBinding dsl_binding = {};
10892 dsl_binding.binding = 0;
10893 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
10894 dsl_binding.descriptorCount = 1;
10895 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
10896 dsl_binding.pImmutableSamplers = NULL;
10897
10898 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10899 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10900 ds_layout_ci.pNext = NULL;
10901 ds_layout_ci.bindingCount = 1;
10902 ds_layout_ci.pBindings = &dsl_binding;
10903
10904 VkDescriptorSetLayout ds_layout;
10905 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10906 ASSERT_VK_SUCCESS(err);
10907
10908 VkDescriptorSetAllocateInfo alloc_info = {};
10909 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10910 alloc_info.descriptorSetCount = 1;
10911 alloc_info.descriptorPool = ds_pool;
10912 alloc_info.pSetLayouts = &ds_layout;
10913 VkDescriptorSet descriptor_set;
10914 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10915 ASSERT_VK_SUCCESS(err);
10916
10917 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10918 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10919 pipeline_layout_ci.pNext = NULL;
10920 pipeline_layout_ci.setLayoutCount = 1;
10921 pipeline_layout_ci.pSetLayouts = &ds_layout;
10922 VkPipelineLayout pipeline_layout;
10923 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
10924 ASSERT_VK_SUCCESS(err);
10925
10926 VkImageObj image(m_device);
10927 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
10928 ASSERT_TRUE(image.initialized());
10929 VkImageView view = image.targetView(tex_format);
10930
10931 VkDescriptorImageInfo image_info = {};
10932 image_info.imageView = view;
10933 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
10934
10935 VkWriteDescriptorSet descriptor_write = {};
10936 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10937 descriptor_write.dstSet = descriptor_set;
10938 descriptor_write.dstBinding = 0;
10939 descriptor_write.descriptorCount = 1;
10940 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
10941 descriptor_write.pImageInfo = &image_info;
10942
10943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10944 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
10945 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
10946 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10947 m_errorMonitor->VerifyFound();
10948
10949 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10950 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10951 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10952 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10953}
10954
Mark Mueller93b938f2016-08-18 10:27:40 -060010955TEST_F(VkLayerTest, SimultaneousUse) {
10956 TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
10957 "in primary and secondary command buffers.");
10958
10959 ASSERT_NO_FATAL_FAILURE(InitState());
10960 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10961
Mike Weiblen95dd0f92016-10-19 12:28:27 -060010962 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010963 const char *simultaneous_use_message2 = "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
10964 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060010965
10966 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010967 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060010968 command_buffer_allocate_info.commandPool = m_commandPool;
10969 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
10970 command_buffer_allocate_info.commandBufferCount = 1;
10971
10972 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010973 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060010974 VkCommandBufferBeginInfo command_buffer_begin_info = {};
10975 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010976 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060010977 command_buffer_inheritance_info.renderPass = m_renderPass;
10978 command_buffer_inheritance_info.framebuffer = m_framebuffer;
10979 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010980 command_buffer_begin_info.flags =
10981 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060010982 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
10983
10984 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010985 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
10986 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller4042b652016-09-05 22:52:21 -060010987 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
Mark Mueller93b938f2016-08-18 10:27:40 -060010988 vkEndCommandBuffer(secondary_command_buffer);
10989
Mark Mueller93b938f2016-08-18 10:27:40 -060010990 VkSubmitInfo submit_info = {};
10991 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
10992 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010993 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller4042b652016-09-05 22:52:21 -060010994 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Mueller93b938f2016-08-18 10:27:40 -060010995
Mark Mueller4042b652016-09-05 22:52:21 -060010996 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010997 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
10998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
10999 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011000 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011001 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11002 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060011003
11004 m_errorMonitor->SetDesiredFailureMsg(0, "");
Mark Mueller93b938f2016-08-18 10:27:40 -060011005 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11006
Mark Mueller4042b652016-09-05 22:52:21 -060011007 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011008 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011009 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060011010
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
11012 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011013 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011014 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11015 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060011016}
11017
Mark Mueller917f6bc2016-08-30 10:57:19 -060011018TEST_F(VkLayerTest, InUseDestroyedSignaled) {
11019 TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
11020 "in primary and secondary command buffers. "
Mark Muellerc8d441e2016-08-23 17:36:00 -060011021 "Delete objects that are inuse. Call VkQueueSubmit "
11022 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060011023
11024 ASSERT_NO_FATAL_FAILURE(InitState());
11025 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11026
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011027 const char *submit_with_deleted_event_message = "Cannot submit cmd buffer using deleted event 0x";
11028 const char *cannot_delete_event_message = "Cannot delete event 0x";
11029 const char *cannot_delete_semaphore_message = "Cannot delete semaphore 0x";
11030 const char *cannot_destroy_fence_message = "Fence 0x";
Mark Mueller917f6bc2016-08-30 10:57:19 -060011031
11032 BeginCommandBuffer();
11033
11034 VkEvent event;
11035 VkEventCreateInfo event_create_info = {};
11036 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11037 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011038 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011039
Mark Muellerc8d441e2016-08-23 17:36:00 -060011040 EndCommandBuffer();
11041 vkDestroyEvent(m_device->device(), event, nullptr);
11042
11043 VkSubmitInfo submit_info = {};
11044 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11045 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011046 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, submit_with_deleted_event_message);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011048 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11049 m_errorMonitor->VerifyFound();
11050
11051 m_errorMonitor->SetDesiredFailureMsg(0, "");
11052 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
11053
11054 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11055
Mark Mueller917f6bc2016-08-30 10:57:19 -060011056 VkSemaphoreCreateInfo semaphore_create_info = {};
11057 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
11058 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011059 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011060 VkFenceCreateInfo fence_create_info = {};
11061 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
11062 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011063 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011064
11065 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011066 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011067 descriptor_pool_type_count.descriptorCount = 1;
11068
11069 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
11070 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11071 descriptor_pool_create_info.maxSets = 1;
11072 descriptor_pool_create_info.poolSizeCount = 1;
11073 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011074 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011075
11076 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011077 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011078
11079 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011080 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011081 descriptorset_layout_binding.descriptorCount = 1;
11082 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
11083
11084 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011085 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011086 descriptorset_layout_create_info.bindingCount = 1;
11087 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
11088
11089 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011090 ASSERT_VK_SUCCESS(
11091 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011092
11093 VkDescriptorSet descriptorset;
11094 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011095 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011096 descriptorset_allocate_info.descriptorSetCount = 1;
11097 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
11098 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011099 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011100
Mark Mueller4042b652016-09-05 22:52:21 -060011101 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
11102
11103 VkDescriptorBufferInfo buffer_info = {};
11104 buffer_info.buffer = buffer_test.GetBuffer();
11105 buffer_info.offset = 0;
11106 buffer_info.range = 1024;
11107
11108 VkWriteDescriptorSet write_descriptor_set = {};
11109 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11110 write_descriptor_set.dstSet = descriptorset;
11111 write_descriptor_set.descriptorCount = 1;
11112 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11113 write_descriptor_set.pBufferInfo = &buffer_info;
11114
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011115 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060011116
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011117 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11118 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011119
11120 VkPipelineObj pipe(m_device);
11121 pipe.AddColorAttachment();
11122 pipe.AddShader(&vs);
11123 pipe.AddShader(&fs);
11124
11125 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011126 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011127 pipeline_layout_create_info.setLayoutCount = 1;
11128 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
11129
11130 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011131 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011132
11133 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
11134
Mark Muellerc8d441e2016-08-23 17:36:00 -060011135 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011136 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011137
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011138 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11139 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11140 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011141
Mark Muellerc8d441e2016-08-23 17:36:00 -060011142 EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060011143
Mark Mueller917f6bc2016-08-30 10:57:19 -060011144 submit_info.signalSemaphoreCount = 1;
11145 submit_info.pSignalSemaphores = &semaphore;
11146 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011147
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_delete_event_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011149 vkDestroyEvent(m_device->device(), event, nullptr);
11150 m_errorMonitor->VerifyFound();
11151
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_delete_semaphore_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011153 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11154 m_errorMonitor->VerifyFound();
11155
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_destroy_fence_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011157 vkDestroyFence(m_device->device(), fence, nullptr);
11158 m_errorMonitor->VerifyFound();
11159
Tobin Ehlis122207b2016-09-01 08:50:06 -070011160 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011161 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11162 vkDestroyFence(m_device->device(), fence, nullptr);
11163 vkDestroyEvent(m_device->device(), event, nullptr);
11164 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011165 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011166 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
11167}
11168
Tobin Ehlis2adda372016-09-01 08:51:06 -070011169TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
11170 TEST_DESCRIPTION("Delete in-use query pool.");
11171
11172 ASSERT_NO_FATAL_FAILURE(InitState());
11173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11174
11175 VkQueryPool query_pool;
11176 VkQueryPoolCreateInfo query_pool_ci{};
11177 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11178 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
11179 query_pool_ci.queryCount = 1;
11180 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
11181 BeginCommandBuffer();
11182 // Reset query pool to create binding with cmd buffer
11183 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
11184
11185 EndCommandBuffer();
11186
11187 VkSubmitInfo submit_info = {};
11188 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11189 submit_info.commandBufferCount = 1;
11190 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11191 // Submit cmd buffer and then destroy query pool while in-flight
11192 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11193
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete query pool 0x");
Tobin Ehlis2adda372016-09-01 08:51:06 -070011195 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
11196 m_errorMonitor->VerifyFound();
11197
11198 vkQueueWaitIdle(m_device->m_queue);
11199 // Now that cmd buffer done we can safely destroy query_pool
11200 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
11201}
11202
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011203TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
11204 TEST_DESCRIPTION("Delete in-use pipeline.");
11205
11206 ASSERT_NO_FATAL_FAILURE(InitState());
11207 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11208
11209 // Empty pipeline layout used for binding PSO
11210 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11211 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11212 pipeline_layout_ci.setLayoutCount = 0;
11213 pipeline_layout_ci.pSetLayouts = NULL;
11214
11215 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011216 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011217 ASSERT_VK_SUCCESS(err);
11218
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete pipeline 0x");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011220 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011221 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11222 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011223 // Store pipeline handle so we can actually delete it before test finishes
11224 VkPipeline delete_this_pipeline;
11225 { // Scope pipeline so it will be auto-deleted
11226 VkPipelineObj pipe(m_device);
11227 pipe.AddShader(&vs);
11228 pipe.AddShader(&fs);
11229 pipe.AddColorAttachment();
11230 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11231 delete_this_pipeline = pipe.handle();
11232
11233 BeginCommandBuffer();
11234 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011235 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011236
11237 EndCommandBuffer();
11238
11239 VkSubmitInfo submit_info = {};
11240 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11241 submit_info.commandBufferCount = 1;
11242 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11243 // Submit cmd buffer and then pipeline destroyed while in-flight
11244 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11245 } // Pipeline deletion triggered here
11246 m_errorMonitor->VerifyFound();
11247 // Make sure queue finished and then actually delete pipeline
11248 vkQueueWaitIdle(m_device->m_queue);
11249 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
11250 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
11251}
11252
Tobin Ehlis7d965da2016-09-19 16:15:45 -060011253TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
11254 TEST_DESCRIPTION("Delete in-use imageView.");
11255
11256 ASSERT_NO_FATAL_FAILURE(InitState());
11257 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11258
11259 VkDescriptorPoolSize ds_type_count;
11260 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11261 ds_type_count.descriptorCount = 1;
11262
11263 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11264 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11265 ds_pool_ci.maxSets = 1;
11266 ds_pool_ci.poolSizeCount = 1;
11267 ds_pool_ci.pPoolSizes = &ds_type_count;
11268
11269 VkDescriptorPool ds_pool;
11270 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11271 ASSERT_VK_SUCCESS(err);
11272
11273 VkSamplerCreateInfo sampler_ci = {};
11274 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11275 sampler_ci.pNext = NULL;
11276 sampler_ci.magFilter = VK_FILTER_NEAREST;
11277 sampler_ci.minFilter = VK_FILTER_NEAREST;
11278 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11279 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11280 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11281 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11282 sampler_ci.mipLodBias = 1.0;
11283 sampler_ci.anisotropyEnable = VK_FALSE;
11284 sampler_ci.maxAnisotropy = 1;
11285 sampler_ci.compareEnable = VK_FALSE;
11286 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11287 sampler_ci.minLod = 1.0;
11288 sampler_ci.maxLod = 1.0;
11289 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11290 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11291 VkSampler sampler;
11292
11293 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11294 ASSERT_VK_SUCCESS(err);
11295
11296 VkDescriptorSetLayoutBinding layout_binding;
11297 layout_binding.binding = 0;
11298 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11299 layout_binding.descriptorCount = 1;
11300 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11301 layout_binding.pImmutableSamplers = NULL;
11302
11303 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11304 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11305 ds_layout_ci.bindingCount = 1;
11306 ds_layout_ci.pBindings = &layout_binding;
11307 VkDescriptorSetLayout ds_layout;
11308 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11309 ASSERT_VK_SUCCESS(err);
11310
11311 VkDescriptorSetAllocateInfo alloc_info = {};
11312 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11313 alloc_info.descriptorSetCount = 1;
11314 alloc_info.descriptorPool = ds_pool;
11315 alloc_info.pSetLayouts = &ds_layout;
11316 VkDescriptorSet descriptor_set;
11317 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11318 ASSERT_VK_SUCCESS(err);
11319
11320 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11321 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11322 pipeline_layout_ci.pNext = NULL;
11323 pipeline_layout_ci.setLayoutCount = 1;
11324 pipeline_layout_ci.pSetLayouts = &ds_layout;
11325
11326 VkPipelineLayout pipeline_layout;
11327 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11328 ASSERT_VK_SUCCESS(err);
11329
11330 VkImageObj image(m_device);
11331 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
11332 ASSERT_TRUE(image.initialized());
11333
11334 VkImageView view;
11335 VkImageViewCreateInfo ivci = {};
11336 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
11337 ivci.image = image.handle();
11338 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
11339 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
11340 ivci.subresourceRange.layerCount = 1;
11341 ivci.subresourceRange.baseMipLevel = 0;
11342 ivci.subresourceRange.levelCount = 1;
11343 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11344
11345 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
11346 ASSERT_VK_SUCCESS(err);
11347
11348 VkDescriptorImageInfo image_info{};
11349 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11350 image_info.imageView = view;
11351 image_info.sampler = sampler;
11352
11353 VkWriteDescriptorSet descriptor_write = {};
11354 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11355 descriptor_write.dstSet = descriptor_set;
11356 descriptor_write.dstBinding = 0;
11357 descriptor_write.descriptorCount = 1;
11358 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11359 descriptor_write.pImageInfo = &image_info;
11360
11361 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11362
11363 // Create PSO to use the sampler
11364 char const *vsSource = "#version 450\n"
11365 "\n"
11366 "out gl_PerVertex { \n"
11367 " vec4 gl_Position;\n"
11368 "};\n"
11369 "void main(){\n"
11370 " gl_Position = vec4(1);\n"
11371 "}\n";
11372 char const *fsSource = "#version 450\n"
11373 "\n"
11374 "layout(set=0, binding=0) uniform sampler2D s;\n"
11375 "layout(location=0) out vec4 x;\n"
11376 "void main(){\n"
11377 " x = texture(s, vec2(1));\n"
11378 "}\n";
11379 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11380 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11381 VkPipelineObj pipe(m_device);
11382 pipe.AddShader(&vs);
11383 pipe.AddShader(&fs);
11384 pipe.AddColorAttachment();
11385 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11386
11387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete image view 0x");
11388
11389 BeginCommandBuffer();
11390 // Bind pipeline to cmd buffer
11391 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11392 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11393 &descriptor_set, 0, nullptr);
11394 Draw(1, 0, 0, 0);
11395 EndCommandBuffer();
11396 // Submit cmd buffer then destroy sampler
11397 VkSubmitInfo submit_info = {};
11398 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11399 submit_info.commandBufferCount = 1;
11400 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11401 // Submit cmd buffer and then destroy imageView while in-flight
11402 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11403
11404 vkDestroyImageView(m_device->device(), view, nullptr);
11405 m_errorMonitor->VerifyFound();
11406 vkQueueWaitIdle(m_device->m_queue);
11407 // Now we can actually destroy imageView
11408 vkDestroyImageView(m_device->device(), view, NULL);
11409 vkDestroySampler(m_device->device(), sampler, nullptr);
11410 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11411 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11412 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11413}
11414
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060011415TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
11416 TEST_DESCRIPTION("Delete in-use bufferView.");
11417
11418 ASSERT_NO_FATAL_FAILURE(InitState());
11419 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11420
11421 VkDescriptorPoolSize ds_type_count;
11422 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11423 ds_type_count.descriptorCount = 1;
11424
11425 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11426 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11427 ds_pool_ci.maxSets = 1;
11428 ds_pool_ci.poolSizeCount = 1;
11429 ds_pool_ci.pPoolSizes = &ds_type_count;
11430
11431 VkDescriptorPool ds_pool;
11432 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11433 ASSERT_VK_SUCCESS(err);
11434
11435 VkDescriptorSetLayoutBinding layout_binding;
11436 layout_binding.binding = 0;
11437 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11438 layout_binding.descriptorCount = 1;
11439 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11440 layout_binding.pImmutableSamplers = NULL;
11441
11442 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11443 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11444 ds_layout_ci.bindingCount = 1;
11445 ds_layout_ci.pBindings = &layout_binding;
11446 VkDescriptorSetLayout ds_layout;
11447 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11448 ASSERT_VK_SUCCESS(err);
11449
11450 VkDescriptorSetAllocateInfo alloc_info = {};
11451 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11452 alloc_info.descriptorSetCount = 1;
11453 alloc_info.descriptorPool = ds_pool;
11454 alloc_info.pSetLayouts = &ds_layout;
11455 VkDescriptorSet descriptor_set;
11456 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11457 ASSERT_VK_SUCCESS(err);
11458
11459 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11460 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11461 pipeline_layout_ci.pNext = NULL;
11462 pipeline_layout_ci.setLayoutCount = 1;
11463 pipeline_layout_ci.pSetLayouts = &ds_layout;
11464
11465 VkPipelineLayout pipeline_layout;
11466 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11467 ASSERT_VK_SUCCESS(err);
11468
11469 VkBuffer buffer;
11470 uint32_t queue_family_index = 0;
11471 VkBufferCreateInfo buffer_create_info = {};
11472 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
11473 buffer_create_info.size = 1024;
11474 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
11475 buffer_create_info.queueFamilyIndexCount = 1;
11476 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
11477
11478 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
11479 ASSERT_VK_SUCCESS(err);
11480
11481 VkMemoryRequirements memory_reqs;
11482 VkDeviceMemory buffer_memory;
11483
11484 VkMemoryAllocateInfo memory_info = {};
11485 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11486 memory_info.allocationSize = 0;
11487 memory_info.memoryTypeIndex = 0;
11488
11489 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
11490 memory_info.allocationSize = memory_reqs.size;
11491 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
11492 ASSERT_TRUE(pass);
11493
11494 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
11495 ASSERT_VK_SUCCESS(err);
11496 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
11497 ASSERT_VK_SUCCESS(err);
11498
11499 VkBufferView view;
11500 VkBufferViewCreateInfo bvci = {};
11501 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
11502 bvci.buffer = buffer;
11503 bvci.format = VK_FORMAT_R8_UNORM;
11504 bvci.range = VK_WHOLE_SIZE;
11505
11506 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
11507 ASSERT_VK_SUCCESS(err);
11508
11509 VkWriteDescriptorSet descriptor_write = {};
11510 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11511 descriptor_write.dstSet = descriptor_set;
11512 descriptor_write.dstBinding = 0;
11513 descriptor_write.descriptorCount = 1;
11514 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11515 descriptor_write.pTexelBufferView = &view;
11516
11517 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11518
11519 char const *vsSource = "#version 450\n"
11520 "\n"
11521 "out gl_PerVertex { \n"
11522 " vec4 gl_Position;\n"
11523 "};\n"
11524 "void main(){\n"
11525 " gl_Position = vec4(1);\n"
11526 "}\n";
11527 char const *fsSource = "#version 450\n"
11528 "\n"
11529 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
11530 "layout(location=0) out vec4 x;\n"
11531 "void main(){\n"
11532 " x = imageLoad(s, 0);\n"
11533 "}\n";
11534 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11535 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11536 VkPipelineObj pipe(m_device);
11537 pipe.AddShader(&vs);
11538 pipe.AddShader(&fs);
11539 pipe.AddColorAttachment();
11540 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11541
11542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete buffer view 0x");
11543
11544 BeginCommandBuffer();
11545 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11546 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11547 VkRect2D scissor = {{0, 0}, {16, 16}};
11548 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11549 // Bind pipeline to cmd buffer
11550 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11551 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11552 &descriptor_set, 0, nullptr);
11553 Draw(1, 0, 0, 0);
11554 EndCommandBuffer();
11555
11556 VkSubmitInfo submit_info = {};
11557 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11558 submit_info.commandBufferCount = 1;
11559 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11560 // Submit cmd buffer and then destroy bufferView while in-flight
11561 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11562
11563 vkDestroyBufferView(m_device->device(), view, nullptr);
11564 m_errorMonitor->VerifyFound();
11565 vkQueueWaitIdle(m_device->m_queue);
11566 // Now we can actually destroy bufferView
11567 vkDestroyBufferView(m_device->device(), view, NULL);
11568 vkDestroyBuffer(m_device->device(), buffer, NULL);
11569 vkFreeMemory(m_device->device(), buffer_memory, NULL);
11570 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11571 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11572 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11573}
11574
Tobin Ehlis209532e2016-09-07 13:52:18 -060011575TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
11576 TEST_DESCRIPTION("Delete in-use sampler.");
11577
11578 ASSERT_NO_FATAL_FAILURE(InitState());
11579 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11580
11581 VkDescriptorPoolSize ds_type_count;
11582 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11583 ds_type_count.descriptorCount = 1;
11584
11585 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11586 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11587 ds_pool_ci.maxSets = 1;
11588 ds_pool_ci.poolSizeCount = 1;
11589 ds_pool_ci.pPoolSizes = &ds_type_count;
11590
11591 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011592 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011593 ASSERT_VK_SUCCESS(err);
11594
11595 VkSamplerCreateInfo sampler_ci = {};
11596 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11597 sampler_ci.pNext = NULL;
11598 sampler_ci.magFilter = VK_FILTER_NEAREST;
11599 sampler_ci.minFilter = VK_FILTER_NEAREST;
11600 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11601 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11602 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11603 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11604 sampler_ci.mipLodBias = 1.0;
11605 sampler_ci.anisotropyEnable = VK_FALSE;
11606 sampler_ci.maxAnisotropy = 1;
11607 sampler_ci.compareEnable = VK_FALSE;
11608 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11609 sampler_ci.minLod = 1.0;
11610 sampler_ci.maxLod = 1.0;
11611 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11612 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11613 VkSampler sampler;
11614
11615 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11616 ASSERT_VK_SUCCESS(err);
11617
11618 VkDescriptorSetLayoutBinding layout_binding;
11619 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060011620 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060011621 layout_binding.descriptorCount = 1;
11622 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11623 layout_binding.pImmutableSamplers = NULL;
11624
11625 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11626 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11627 ds_layout_ci.bindingCount = 1;
11628 ds_layout_ci.pBindings = &layout_binding;
11629 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011630 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011631 ASSERT_VK_SUCCESS(err);
11632
11633 VkDescriptorSetAllocateInfo alloc_info = {};
11634 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11635 alloc_info.descriptorSetCount = 1;
11636 alloc_info.descriptorPool = ds_pool;
11637 alloc_info.pSetLayouts = &ds_layout;
11638 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011639 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011640 ASSERT_VK_SUCCESS(err);
11641
11642 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11643 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11644 pipeline_layout_ci.pNext = NULL;
11645 pipeline_layout_ci.setLayoutCount = 1;
11646 pipeline_layout_ci.pSetLayouts = &ds_layout;
11647
11648 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011649 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011650 ASSERT_VK_SUCCESS(err);
11651
11652 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011653 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011654 ASSERT_TRUE(image.initialized());
11655
11656 VkImageView view;
11657 VkImageViewCreateInfo ivci = {};
11658 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
11659 ivci.image = image.handle();
11660 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
11661 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
11662 ivci.subresourceRange.layerCount = 1;
11663 ivci.subresourceRange.baseMipLevel = 0;
11664 ivci.subresourceRange.levelCount = 1;
11665 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11666
11667 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
11668 ASSERT_VK_SUCCESS(err);
11669
11670 VkDescriptorImageInfo image_info{};
11671 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11672 image_info.imageView = view;
11673 image_info.sampler = sampler;
11674
11675 VkWriteDescriptorSet descriptor_write = {};
11676 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11677 descriptor_write.dstSet = descriptor_set;
11678 descriptor_write.dstBinding = 0;
11679 descriptor_write.descriptorCount = 1;
11680 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11681 descriptor_write.pImageInfo = &image_info;
11682
11683 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11684
11685 // Create PSO to use the sampler
11686 char const *vsSource = "#version 450\n"
11687 "\n"
11688 "out gl_PerVertex { \n"
11689 " vec4 gl_Position;\n"
11690 "};\n"
11691 "void main(){\n"
11692 " gl_Position = vec4(1);\n"
11693 "}\n";
11694 char const *fsSource = "#version 450\n"
11695 "\n"
11696 "layout(set=0, binding=0) uniform sampler2D s;\n"
11697 "layout(location=0) out vec4 x;\n"
11698 "void main(){\n"
11699 " x = texture(s, vec2(1));\n"
11700 "}\n";
11701 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11702 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11703 VkPipelineObj pipe(m_device);
11704 pipe.AddShader(&vs);
11705 pipe.AddShader(&fs);
11706 pipe.AddColorAttachment();
11707 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11708
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete sampler 0x");
Tobin Ehlis209532e2016-09-07 13:52:18 -060011710
11711 BeginCommandBuffer();
11712 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011713 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11714 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11715 &descriptor_set, 0, nullptr);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011716 Draw(1, 0, 0, 0);
11717 EndCommandBuffer();
11718 // Submit cmd buffer then destroy sampler
11719 VkSubmitInfo submit_info = {};
11720 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11721 submit_info.commandBufferCount = 1;
11722 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11723 // Submit cmd buffer and then destroy sampler while in-flight
11724 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11725
11726 vkDestroySampler(m_device->device(), sampler, nullptr);
11727 m_errorMonitor->VerifyFound();
11728 vkQueueWaitIdle(m_device->m_queue);
11729 // Now we can actually destroy sampler
11730 vkDestroySampler(m_device->device(), sampler, nullptr);
11731 vkDestroyImageView(m_device->device(), view, NULL);
11732 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11733 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11734 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11735}
11736
Mark Mueller1cd9f412016-08-25 13:23:52 -060011737TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Mueller96a56d52016-08-24 10:28:05 -060011738 TEST_DESCRIPTION("Call VkQueueSubmit with a semaphore that is already "
Mark Mueller1cd9f412016-08-25 13:23:52 -060011739 "signaled but not waited on by the queue. Wait on a "
11740 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060011741
11742 ASSERT_NO_FATAL_FAILURE(InitState());
11743 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11744
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011745 const char *queue_forward_progress_message = " that has already been signaled but not waited on by queue 0x";
11746 const char *invalid_fence_wait_message = " which has not been submitted on a Queue or during "
11747 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060011748
11749 BeginCommandBuffer();
11750 EndCommandBuffer();
11751
11752 VkSemaphoreCreateInfo semaphore_create_info = {};
11753 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
11754 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011755 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060011756 VkSubmitInfo submit_info = {};
11757 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11758 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011759 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060011760 submit_info.signalSemaphoreCount = 1;
11761 submit_info.pSignalSemaphores = &semaphore;
11762 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11763 m_errorMonitor->SetDesiredFailureMsg(0, "");
11764 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
11765 BeginCommandBuffer();
11766 EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060011768 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11769 m_errorMonitor->VerifyFound();
11770
Mark Mueller1cd9f412016-08-25 13:23:52 -060011771 VkFenceCreateInfo fence_create_info = {};
11772 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
11773 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011774 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060011775
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060011777 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
11778 m_errorMonitor->VerifyFound();
11779
Mark Mueller4042b652016-09-05 22:52:21 -060011780 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060011781 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060011782 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11783}
11784
Tobin Ehlis4af23302016-07-19 10:50:30 -060011785TEST_F(VkLayerTest, FramebufferIncompatible) {
11786 TEST_DESCRIPTION("Bind a secondary command buffer with with a framebuffer "
11787 "that does not match the framebuffer for the active "
11788 "renderpass.");
11789 ASSERT_NO_FATAL_FAILURE(InitState());
11790 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11791
11792 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011793 VkAttachmentDescription attachment = {0,
11794 VK_FORMAT_B8G8R8A8_UNORM,
11795 VK_SAMPLE_COUNT_1_BIT,
11796 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
11797 VK_ATTACHMENT_STORE_OP_STORE,
11798 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
11799 VK_ATTACHMENT_STORE_OP_DONT_CARE,
11800 VK_IMAGE_LAYOUT_UNDEFINED,
11801 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011802
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011803 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011804
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011805 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011806
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011807 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011808
11809 VkRenderPass rp;
11810 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
11811 ASSERT_VK_SUCCESS(err);
11812
11813 // A compatible framebuffer.
11814 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011815 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis4af23302016-07-19 10:50:30 -060011816 ASSERT_TRUE(image.initialized());
11817
11818 VkImageViewCreateInfo ivci = {
11819 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
11820 nullptr,
11821 0,
11822 image.handle(),
11823 VK_IMAGE_VIEW_TYPE_2D,
11824 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011825 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
11826 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060011827 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
11828 };
11829 VkImageView view;
11830 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
11831 ASSERT_VK_SUCCESS(err);
11832
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011833 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011834 VkFramebuffer fb;
11835 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
11836 ASSERT_VK_SUCCESS(err);
11837
11838 VkCommandBufferAllocateInfo cbai = {};
11839 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
11840 cbai.commandPool = m_commandPool;
11841 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
11842 cbai.commandBufferCount = 1;
11843
11844 VkCommandBuffer sec_cb;
11845 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
11846 ASSERT_VK_SUCCESS(err);
11847 VkCommandBufferBeginInfo cbbi = {};
11848 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130011849 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060011850 cbii.renderPass = renderPass();
11851 cbii.framebuffer = fb;
11852 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11853 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011854 cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Tobin Ehlis4af23302016-07-19 10:50:30 -060011855 cbbi.pInheritanceInfo = &cbii;
11856 vkBeginCommandBuffer(sec_cb, &cbbi);
11857 vkEndCommandBuffer(sec_cb);
11858
Chris Forbes3400bc52016-09-13 18:10:34 +120011859 VkCommandBufferBeginInfo cbbi2 = {
11860 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
11861 0, nullptr
11862 };
11863 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
11864 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060011865
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060011867 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060011868 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
11869 m_errorMonitor->VerifyFound();
11870 // Cleanup
11871 vkDestroyImageView(m_device->device(), view, NULL);
11872 vkDestroyRenderPass(m_device->device(), rp, NULL);
11873 vkDestroyFramebuffer(m_device->device(), fb, NULL);
11874}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011875
11876TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
11877 TEST_DESCRIPTION("If logicOp is available on the device, set it to an "
11878 "invalid value. If logicOp is not available, attempt to "
11879 "use it and verify that we see the correct error.");
11880 ASSERT_NO_FATAL_FAILURE(InitState());
11881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11882
11883 auto features = m_device->phy().features();
11884 // Set the expected error depending on whether or not logicOp available
11885 if (VK_FALSE == features.logicOp) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "If logic operations feature not "
11887 "enabled, logicOpEnable must be "
11888 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011889 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130011890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011891 }
11892 // Create a pipeline using logicOp
11893 VkResult err;
11894
11895 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11896 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11897
11898 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011899 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011900 ASSERT_VK_SUCCESS(err);
11901
11902 VkPipelineViewportStateCreateInfo vp_state_ci = {};
11903 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
11904 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011905 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011906 vp_state_ci.pViewports = &vp;
11907 vp_state_ci.scissorCount = 1;
11908 VkRect2D scissors = {}; // Dummy scissors to point to
11909 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011910
11911 VkPipelineShaderStageCreateInfo shaderStages[2];
11912 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
11913
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011914 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11915 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011916 shaderStages[0] = vs.GetStageCreateInfo();
11917 shaderStages[1] = fs.GetStageCreateInfo();
11918
11919 VkPipelineVertexInputStateCreateInfo vi_ci = {};
11920 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
11921
11922 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
11923 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
11924 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
11925
11926 VkPipelineRasterizationStateCreateInfo rs_ci = {};
11927 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130011928 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011929
11930 VkPipelineColorBlendAttachmentState att = {};
11931 att.blendEnable = VK_FALSE;
11932 att.colorWriteMask = 0xf;
11933
11934 VkPipelineColorBlendStateCreateInfo cb_ci = {};
11935 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
11936 // Enable logicOp & set logicOp to value 1 beyond allowed entries
11937 cb_ci.logicOpEnable = VK_TRUE;
11938 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
11939 cb_ci.attachmentCount = 1;
11940 cb_ci.pAttachments = &att;
11941
Chris Forbes8aeacbf2016-10-03 14:25:08 +130011942 VkPipelineMultisampleStateCreateInfo ms_ci = {};
11943 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11944 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11945
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011946 VkGraphicsPipelineCreateInfo gp_ci = {};
11947 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
11948 gp_ci.stageCount = 2;
11949 gp_ci.pStages = shaderStages;
11950 gp_ci.pVertexInputState = &vi_ci;
11951 gp_ci.pInputAssemblyState = &ia_ci;
11952 gp_ci.pViewportState = &vp_state_ci;
11953 gp_ci.pRasterizationState = &rs_ci;
11954 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130011955 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011956 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
11957 gp_ci.layout = pipeline_layout;
11958 gp_ci.renderPass = renderPass();
11959
11960 VkPipelineCacheCreateInfo pc_ci = {};
11961 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
11962
11963 VkPipeline pipeline;
11964 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011965 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011966 ASSERT_VK_SUCCESS(err);
11967
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011968 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011969 m_errorMonitor->VerifyFound();
11970 if (VK_SUCCESS == err) {
11971 vkDestroyPipeline(m_device->device(), pipeline, NULL);
11972 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011973 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
11974 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11975}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011976#endif // DRAW_STATE_TESTS
11977
Tobin Ehlis0788f522015-05-26 16:11:58 -060011978#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060011979#if GTEST_IS_THREADSAFE
11980struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011981 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011982 VkEvent event;
11983 bool bailout;
11984};
11985
Karl Schultz6addd812016-02-02 17:17:23 -070011986extern "C" void *AddToCommandBuffer(void *arg) {
11987 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011988
Mike Stroyana6d14942016-07-13 15:10:05 -060011989 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011990 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011991 if (data->bailout) {
11992 break;
11993 }
11994 }
11995 return NULL;
11996}
11997
Karl Schultz6addd812016-02-02 17:17:23 -070011998TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011999 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012000
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012002
Mike Stroyanaccf7692015-05-12 16:00:45 -060012003 ASSERT_NO_FATAL_FAILURE(InitState());
12004 ASSERT_NO_FATAL_FAILURE(InitViewport());
12005 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12006
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012007 // Calls AllocateCommandBuffers
12008 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012009
12010 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012011 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012012
12013 VkEventCreateInfo event_info;
12014 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012015 VkResult err;
12016
12017 memset(&event_info, 0, sizeof(event_info));
12018 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12019
Chia-I Wuf7458c52015-10-26 21:10:41 +080012020 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012021 ASSERT_VK_SUCCESS(err);
12022
Mike Stroyanaccf7692015-05-12 16:00:45 -060012023 err = vkResetEvent(device(), event);
12024 ASSERT_VK_SUCCESS(err);
12025
12026 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012027 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012028 data.event = event;
12029 data.bailout = false;
12030 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060012031
12032 // First do some correct operations using multiple threads.
12033 // Add many entries to command buffer from another thread.
12034 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
12035 // Make non-conflicting calls from this thread at the same time.
12036 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060012037 uint32_t count;
12038 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060012039 }
12040 test_platform_thread_join(thread, NULL);
12041
12042 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060012043 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012044 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012045 // Add many entries to command buffer from this thread at the same time.
12046 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012047
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012048 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012049 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012050
Mike Stroyan10b8cb72016-01-22 15:22:03 -070012051 m_errorMonitor->SetBailout(NULL);
12052
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012053 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012054
Chia-I Wuf7458c52015-10-26 21:10:41 +080012055 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012056}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012057#endif // GTEST_IS_THREADSAFE
12058#endif // THREADING_TESTS
12059
Chris Forbes9f7ff632015-05-25 11:13:08 +120012060#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070012061TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012062 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12063 "with an impossible code size");
12064
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012066
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012067 ASSERT_NO_FATAL_FAILURE(InitState());
12068 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12069
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012070 VkShaderModule module;
12071 VkShaderModuleCreateInfo moduleCreateInfo;
12072 struct icd_spv_header spv;
12073
12074 spv.magic = ICD_SPV_MAGIC;
12075 spv.version = ICD_SPV_VERSION;
12076 spv.gen_magic = 0;
12077
12078 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12079 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012080 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012081 moduleCreateInfo.codeSize = 4;
12082 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012083 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012084
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012085 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012086}
12087
Karl Schultz6addd812016-02-02 17:17:23 -070012088TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012089 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12090 "with a bad magic number");
12091
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012093
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012094 ASSERT_NO_FATAL_FAILURE(InitState());
12095 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12096
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012097 VkShaderModule module;
12098 VkShaderModuleCreateInfo moduleCreateInfo;
12099 struct icd_spv_header spv;
12100
12101 spv.magic = ~ICD_SPV_MAGIC;
12102 spv.version = ICD_SPV_VERSION;
12103 spv.gen_magic = 0;
12104
12105 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12106 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012107 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012108 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12109 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012110 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012111
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012112 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012113}
12114
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012115#if 0
12116// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070012117TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012119 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012120
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012121 ASSERT_NO_FATAL_FAILURE(InitState());
12122 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12123
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012124 VkShaderModule module;
12125 VkShaderModuleCreateInfo moduleCreateInfo;
12126 struct icd_spv_header spv;
12127
12128 spv.magic = ICD_SPV_MAGIC;
12129 spv.version = ~ICD_SPV_VERSION;
12130 spv.gen_magic = 0;
12131
12132 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12133 moduleCreateInfo.pNext = NULL;
12134
Karl Schultz6addd812016-02-02 17:17:23 -070012135 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012136 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12137 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012138 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012139
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012140 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012141}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012142#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012143
Karl Schultz6addd812016-02-02 17:17:23 -070012144TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012145 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
12146 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012148
Chris Forbes9f7ff632015-05-25 11:13:08 +120012149 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012150 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012151
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012152 char const *vsSource = "#version 450\n"
12153 "\n"
12154 "layout(location=0) out float x;\n"
12155 "out gl_PerVertex {\n"
12156 " vec4 gl_Position;\n"
12157 "};\n"
12158 "void main(){\n"
12159 " gl_Position = vec4(1);\n"
12160 " x = 0;\n"
12161 "}\n";
12162 char const *fsSource = "#version 450\n"
12163 "\n"
12164 "layout(location=0) out vec4 color;\n"
12165 "void main(){\n"
12166 " color = vec4(1);\n"
12167 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120012168
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012169 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12170 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012171
12172 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012173 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012174 pipe.AddShader(&vs);
12175 pipe.AddShader(&fs);
12176
Chris Forbes9f7ff632015-05-25 11:13:08 +120012177 VkDescriptorSetObj descriptorSet(m_device);
12178 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012179 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012180
Tony Barbour5781e8f2015-08-04 16:23:11 -060012181 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012182
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012183 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012184}
Chris Forbes9f7ff632015-05-25 11:13:08 +120012185
Mark Mueller098c9cb2016-09-08 09:01:57 -060012186TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
12187 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
12188
12189 ASSERT_NO_FATAL_FAILURE(InitState());
12190 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12191
12192 const char *bad_specialization_message =
12193 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
12194
12195 char const *vsSource =
12196 "#version 450\n"
12197 "\n"
12198 "out gl_PerVertex {\n"
12199 " vec4 gl_Position;\n"
12200 "};\n"
12201 "void main(){\n"
12202 " gl_Position = vec4(1);\n"
12203 "}\n";
12204
12205 char const *fsSource =
12206 "#version 450\n"
12207 "\n"
12208 "layout (constant_id = 0) const float r = 0.0f;\n"
12209 "layout(location = 0) out vec4 uFragColor;\n"
12210 "void main(){\n"
12211 " uFragColor = vec4(r,1,0,1);\n"
12212 "}\n";
12213
12214 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12215 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12216
12217 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12218 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12219
12220 VkPipelineLayout pipeline_layout;
12221 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12222
12223 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
12224 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12225 vp_state_create_info.viewportCount = 1;
12226 VkViewport viewport = {};
12227 vp_state_create_info.pViewports = &viewport;
12228 vp_state_create_info.scissorCount = 1;
12229 VkRect2D scissors = {};
12230 vp_state_create_info.pScissors = &scissors;
12231
12232 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
12233
12234 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
12235 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
12236 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
12237 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
12238
12239 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {
12240 vs.GetStageCreateInfo(),
12241 fs.GetStageCreateInfo()
12242 };
12243
12244 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
12245 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12246
12247 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
12248 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12249 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12250
12251 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
12252 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
12253 rasterization_state_create_info.pNext = nullptr;
12254 rasterization_state_create_info.lineWidth = 1.0f;
12255 rasterization_state_create_info.rasterizerDiscardEnable = true;
12256
12257 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
12258 color_blend_attachment_state.blendEnable = VK_FALSE;
12259 color_blend_attachment_state.colorWriteMask = 0xf;
12260
12261 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
12262 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12263 color_blend_state_create_info.attachmentCount = 1;
12264 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
12265
12266 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
12267 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12268 graphicspipe_create_info.stageCount = 2;
12269 graphicspipe_create_info.pStages = shader_stage_create_info;
12270 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
12271 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
12272 graphicspipe_create_info.pViewportState = &vp_state_create_info;
12273 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
12274 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
12275 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
12276 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12277 graphicspipe_create_info.layout = pipeline_layout;
12278 graphicspipe_create_info.renderPass = renderPass();
12279
12280 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
12281 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12282
12283 VkPipelineCache pipelineCache;
12284 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
12285
12286 // This structure maps constant ids to data locations.
12287 const VkSpecializationMapEntry entry =
12288 // id, offset, size
12289 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
12290
12291 uint32_t data = 1;
12292
12293 // Set up the info describing spec map and data
12294 const VkSpecializationInfo specialization_info = {
12295 1,
12296 &entry,
12297 1 * sizeof(float),
12298 &data,
12299 };
12300 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
12301
12302 VkPipeline pipeline;
12303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
12304 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
12305 m_errorMonitor->VerifyFound();
12306
12307 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
12308 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12309}
12310
12311TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
12312 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
12313
12314 ASSERT_NO_FATAL_FAILURE(InitState());
12315 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12316
12317 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
12318
12319 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
12320 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12321 descriptor_pool_type_count[0].descriptorCount = 1;
12322 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
12323 descriptor_pool_type_count[1].descriptorCount = 1;
12324
12325 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12326 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12327 descriptor_pool_create_info.maxSets = 1;
12328 descriptor_pool_create_info.poolSizeCount = 2;
12329 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
12330 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12331
12332 VkDescriptorPool descriptorset_pool;
12333 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
12334
12335 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
12336 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
12337 descriptorset_layout_binding.descriptorCount = 1;
12338 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12339
12340 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
12341 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12342 descriptorset_layout_create_info.bindingCount = 1;
12343 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12344
12345 VkDescriptorSetLayout descriptorset_layout;
12346 ASSERT_VK_SUCCESS(vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
12347
12348 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
12349 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12350 descriptorset_allocate_info.descriptorSetCount = 1;
12351 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12352 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
12353 VkDescriptorSet descriptorset;
12354 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
12355
12356 // Challenge core_validation with a non uniform buffer type.
12357 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
12358
Mark Mueller098c9cb2016-09-08 09:01:57 -060012359 char const *vsSource =
12360 "#version 450\n"
12361 "\n"
12362 "layout (std140, set = 0, binding = 0) uniform buf {\n"
12363 " mat4 mvp;\n"
12364 "} ubuf;\n"
12365 "out gl_PerVertex {\n"
12366 " vec4 gl_Position;\n"
12367 "};\n"
12368 "void main(){\n"
12369 " gl_Position = ubuf.mvp * vec4(1);\n"
12370 "}\n";
12371
12372 char const *fsSource =
12373 "#version 450\n"
12374 "\n"
12375 "layout(location = 0) out vec4 uFragColor;\n"
12376 "void main(){\n"
12377 " uFragColor = vec4(0,1,0,1);\n"
12378 "}\n";
12379
12380 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12381 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12382
12383 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12384 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12385 pipeline_layout_create_info.setLayoutCount = 1;
12386 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12387
12388 VkPipelineLayout pipeline_layout;
12389 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12390
12391 VkPipelineObj pipe(m_device);
12392 pipe.AddColorAttachment();
12393 pipe.AddShader(&vs);
12394 pipe.AddShader(&fs);
12395
12396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
12397 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12398 m_errorMonitor->VerifyFound();
12399
12400 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12401 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
12402 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
12403}
12404
12405TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
12406 TEST_DESCRIPTION(
12407 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
12408
12409 ASSERT_NO_FATAL_FAILURE(InitState());
12410 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12411
12412 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
12413
12414 VkDescriptorPoolSize descriptor_pool_type_count = {};
12415 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12416 descriptor_pool_type_count.descriptorCount = 1;
12417
12418 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12419 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12420 descriptor_pool_create_info.maxSets = 1;
12421 descriptor_pool_create_info.poolSizeCount = 1;
12422 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
12423 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12424
12425 VkDescriptorPool descriptorset_pool;
12426 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
12427
12428 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
12429 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12430 descriptorset_layout_binding.descriptorCount = 1;
12431 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
12432 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12433
12434 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
12435 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12436 descriptorset_layout_create_info.bindingCount = 1;
12437 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12438
12439 VkDescriptorSetLayout descriptorset_layout;
12440 ASSERT_VK_SUCCESS(vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info,
12441 nullptr, &descriptorset_layout));
12442
12443 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
12444 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12445 descriptorset_allocate_info.descriptorSetCount = 1;
12446 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12447 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
12448 VkDescriptorSet descriptorset;
12449 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
12450
12451 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12452
Mark Mueller098c9cb2016-09-08 09:01:57 -060012453 char const *vsSource =
12454 "#version 450\n"
12455 "\n"
12456 "layout (std140, set = 0, binding = 0) uniform buf {\n"
12457 " mat4 mvp;\n"
12458 "} ubuf;\n"
12459 "out gl_PerVertex {\n"
12460 " vec4 gl_Position;\n"
12461 "};\n"
12462 "void main(){\n"
12463 " gl_Position = ubuf.mvp * vec4(1);\n"
12464 "}\n";
12465
12466 char const *fsSource =
12467 "#version 450\n"
12468 "\n"
12469 "layout(location = 0) out vec4 uFragColor;\n"
12470 "void main(){\n"
12471 " uFragColor = vec4(0,1,0,1);\n"
12472 "}\n";
12473
12474 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12475 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12476
12477 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12478 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12479 pipeline_layout_create_info.setLayoutCount = 1;
12480 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12481
12482 VkPipelineLayout pipeline_layout;
12483 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12484
12485 VkPipelineObj pipe(m_device);
12486 pipe.AddColorAttachment();
12487 pipe.AddShader(&vs);
12488 pipe.AddShader(&fs);
12489
12490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
12491 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12492 m_errorMonitor->VerifyFound();
12493
12494 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12495 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
12496 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
12497}
12498
12499TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
12500 TEST_DESCRIPTION("Create a graphics pipleine in which a push constant range containing a push constant block member is not "
12501 "accessible from the current shader stage.");
12502
12503 ASSERT_NO_FATAL_FAILURE(InitState());
12504 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12505
12506 const char *push_constant_not_accessible_message =
12507 "Push constant range covering variable starting at offset 0 not accessible from stage VK_SHADER_STAGE_VERTEX_BIT";
12508
12509 char const *vsSource =
12510 "#version 450\n"
12511 "\n"
12512 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
12513 "out gl_PerVertex {\n"
12514 " vec4 gl_Position;\n"
12515 "};\n"
12516 "void main(){\n"
12517 " gl_Position = vec4(consts.x);\n"
12518 "}\n";
12519
12520 char const *fsSource =
12521 "#version 450\n"
12522 "\n"
12523 "layout(location = 0) out vec4 uFragColor;\n"
12524 "void main(){\n"
12525 " uFragColor = vec4(0,1,0,1);\n"
12526 "}\n";
12527
12528 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12529 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12530
12531 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12532 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12533
12534 // Set up a push constant range
12535 VkPushConstantRange push_constant_ranges = {};
12536 // Set to the wrong stage to challenge core_validation
12537 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12538 push_constant_ranges.size = 4;
12539
12540 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
12541 pipeline_layout_create_info.pushConstantRangeCount = 1;
12542
12543 VkPipelineLayout pipeline_layout;
12544 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12545
12546 VkPipelineObj pipe(m_device);
12547 pipe.AddColorAttachment();
12548 pipe.AddShader(&vs);
12549 pipe.AddShader(&fs);
12550
12551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
12552 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12553 m_errorMonitor->VerifyFound();
12554
12555 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12556}
12557
12558TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
12559 TEST_DESCRIPTION(
12560 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
12561
12562 ASSERT_NO_FATAL_FAILURE(InitState());
12563 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12564
12565 const char *feature_not_enabled_message =
12566 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
12567
12568 // Some awkward steps are required to test with custom device features.
12569 std::vector<const char *> device_extension_names;
12570 auto features = m_device->phy().features();
12571 // Disable support for 64 bit floats
12572 features.shaderFloat64 = false;
12573 // The sacrificial device object
12574 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12575
12576 char const *vsSource = "#version 450\n"
12577 "\n"
12578 "out gl_PerVertex {\n"
12579 " vec4 gl_Position;\n"
12580 "};\n"
12581 "void main(){\n"
12582 " gl_Position = vec4(1);\n"
12583 "}\n";
12584 char const *fsSource = "#version 450\n"
12585 "\n"
12586 "layout(location=0) out vec4 color;\n"
12587 "void main(){\n"
12588 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
12589 " color = vec4(green);\n"
12590 "}\n";
12591
12592 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12593 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12594
12595 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060012596
12597 VkPipelineObj pipe(&test_device);
12598 pipe.AddColorAttachment();
12599 pipe.AddShader(&vs);
12600 pipe.AddShader(&fs);
12601
12602 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12603 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12604 VkPipelineLayout pipeline_layout;
12605 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12606
12607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
12608 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
12609 m_errorMonitor->VerifyFound();
12610
12611 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
12612}
12613
12614TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
12615 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
12616
12617 ASSERT_NO_FATAL_FAILURE(InitState());
12618 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12619
12620 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
12621
12622 char const *vsSource = "#version 450\n"
12623 "\n"
12624 "out gl_PerVertex {\n"
12625 " vec4 gl_Position;\n"
12626 "};\n"
12627 "layout(xfb_buffer = 1) out;"
12628 "void main(){\n"
12629 " gl_Position = vec4(1);\n"
12630 "}\n";
12631 char const *fsSource = "#version 450\n"
12632 "\n"
12633 "layout(location=0) out vec4 color;\n"
12634 "void main(){\n"
12635 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
12636 " color = vec4(green);\n"
12637 "}\n";
12638
12639 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12640 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12641
12642 VkPipelineObj pipe(m_device);
12643 pipe.AddColorAttachment();
12644 pipe.AddShader(&vs);
12645 pipe.AddShader(&fs);
12646
12647 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12648 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12649 VkPipelineLayout pipeline_layout;
12650 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12651
12652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
12653 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12654 m_errorMonitor->VerifyFound();
12655
12656 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12657}
12658
Karl Schultz6addd812016-02-02 17:17:23 -070012659TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012660 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12661 "which is not present in the outputs of the previous stage");
12662
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012664
Chris Forbes59cb88d2015-05-25 11:13:13 +120012665 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012666 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012667
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012668 char const *vsSource = "#version 450\n"
12669 "\n"
12670 "out gl_PerVertex {\n"
12671 " vec4 gl_Position;\n"
12672 "};\n"
12673 "void main(){\n"
12674 " gl_Position = vec4(1);\n"
12675 "}\n";
12676 char const *fsSource = "#version 450\n"
12677 "\n"
12678 "layout(location=0) in float x;\n"
12679 "layout(location=0) out vec4 color;\n"
12680 "void main(){\n"
12681 " color = vec4(x);\n"
12682 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120012683
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012684 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12685 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012686
12687 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012688 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012689 pipe.AddShader(&vs);
12690 pipe.AddShader(&fs);
12691
Chris Forbes59cb88d2015-05-25 11:13:13 +120012692 VkDescriptorSetObj descriptorSet(m_device);
12693 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012694 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012695
Tony Barbour5781e8f2015-08-04 16:23:11 -060012696 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012697
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012698 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012699}
12700
Karl Schultz6addd812016-02-02 17:17:23 -070012701TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012702 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12703 "within an interace block, which is not present in the outputs "
12704 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012706
12707 ASSERT_NO_FATAL_FAILURE(InitState());
12708 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12709
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012710 char const *vsSource = "#version 450\n"
12711 "\n"
12712 "out gl_PerVertex {\n"
12713 " vec4 gl_Position;\n"
12714 "};\n"
12715 "void main(){\n"
12716 " gl_Position = vec4(1);\n"
12717 "}\n";
12718 char const *fsSource = "#version 450\n"
12719 "\n"
12720 "in block { layout(location=0) float x; } ins;\n"
12721 "layout(location=0) out vec4 color;\n"
12722 "void main(){\n"
12723 " color = vec4(ins.x);\n"
12724 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130012725
12726 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12727 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12728
12729 VkPipelineObj pipe(m_device);
12730 pipe.AddColorAttachment();
12731 pipe.AddShader(&vs);
12732 pipe.AddShader(&fs);
12733
12734 VkDescriptorSetObj descriptorSet(m_device);
12735 descriptorSet.AppendDummy();
12736 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12737
12738 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12739
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012740 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012741}
12742
Karl Schultz6addd812016-02-02 17:17:23 -070012743TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012744 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012745 "across the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0.0: 'ptr to "
12747 "output arr[2] of float32' vs 'ptr to "
12748 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130012749
12750 ASSERT_NO_FATAL_FAILURE(InitState());
12751 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12752
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012753 char const *vsSource = "#version 450\n"
12754 "\n"
12755 "layout(location=0) out float x[2];\n"
12756 "out gl_PerVertex {\n"
12757 " vec4 gl_Position;\n"
12758 "};\n"
12759 "void main(){\n"
12760 " x[0] = 0; x[1] = 0;\n"
12761 " gl_Position = vec4(1);\n"
12762 "}\n";
12763 char const *fsSource = "#version 450\n"
12764 "\n"
12765 "layout(location=0) in float x[3];\n"
12766 "layout(location=0) out vec4 color;\n"
12767 "void main(){\n"
12768 " color = vec4(x[0] + x[1] + x[2]);\n"
12769 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130012770
12771 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12772 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12773
12774 VkPipelineObj pipe(m_device);
12775 pipe.AddColorAttachment();
12776 pipe.AddShader(&vs);
12777 pipe.AddShader(&fs);
12778
12779 VkDescriptorSetObj descriptorSet(m_device);
12780 descriptorSet.AppendDummy();
12781 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12782
12783 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12784
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012785 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130012786}
12787
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060012788
Karl Schultz6addd812016-02-02 17:17:23 -070012789TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012790 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012791 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012793
Chris Forbesb56af562015-05-25 11:13:17 +120012794 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012795 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120012796
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012797 char const *vsSource = "#version 450\n"
12798 "\n"
12799 "layout(location=0) out int x;\n"
12800 "out gl_PerVertex {\n"
12801 " vec4 gl_Position;\n"
12802 "};\n"
12803 "void main(){\n"
12804 " x = 0;\n"
12805 " gl_Position = vec4(1);\n"
12806 "}\n";
12807 char const *fsSource = "#version 450\n"
12808 "\n"
12809 "layout(location=0) in float x;\n" /* VS writes int */
12810 "layout(location=0) out vec4 color;\n"
12811 "void main(){\n"
12812 " color = vec4(x);\n"
12813 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120012814
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012815 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12816 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120012817
12818 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012819 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120012820 pipe.AddShader(&vs);
12821 pipe.AddShader(&fs);
12822
Chris Forbesb56af562015-05-25 11:13:17 +120012823 VkDescriptorSetObj descriptorSet(m_device);
12824 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012825 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120012826
Tony Barbour5781e8f2015-08-04 16:23:11 -060012827 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120012828
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012829 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120012830}
12831
Karl Schultz6addd812016-02-02 17:17:23 -070012832TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012833 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012834 "the vertex->fragment shader interface, when the variable is contained within "
Chris Forbes1cc79542016-07-20 11:13:44 +120012835 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012837
12838 ASSERT_NO_FATAL_FAILURE(InitState());
12839 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12840
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012841 char const *vsSource = "#version 450\n"
12842 "\n"
12843 "out block { layout(location=0) int x; } outs;\n"
12844 "out gl_PerVertex {\n"
12845 " vec4 gl_Position;\n"
12846 "};\n"
12847 "void main(){\n"
12848 " outs.x = 0;\n"
12849 " gl_Position = vec4(1);\n"
12850 "}\n";
12851 char const *fsSource = "#version 450\n"
12852 "\n"
12853 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
12854 "layout(location=0) out vec4 color;\n"
12855 "void main(){\n"
12856 " color = vec4(ins.x);\n"
12857 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130012858
12859 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12860 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12861
12862 VkPipelineObj pipe(m_device);
12863 pipe.AddColorAttachment();
12864 pipe.AddShader(&vs);
12865 pipe.AddShader(&fs);
12866
12867 VkDescriptorSetObj descriptorSet(m_device);
12868 descriptorSet.AppendDummy();
12869 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12870
12871 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12872
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012873 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012874}
12875
12876TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012877 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012878 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
Chris Forbes1cc79542016-07-20 11:13:44 +120012879 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "location 0.0 which is not written by vertex shader");
Chris Forbese9928822016-02-17 14:44:52 +130012881
12882 ASSERT_NO_FATAL_FAILURE(InitState());
12883 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12884
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012885 char const *vsSource = "#version 450\n"
12886 "\n"
12887 "out block { layout(location=1) float x; } outs;\n"
12888 "out gl_PerVertex {\n"
12889 " vec4 gl_Position;\n"
12890 "};\n"
12891 "void main(){\n"
12892 " outs.x = 0;\n"
12893 " gl_Position = vec4(1);\n"
12894 "}\n";
12895 char const *fsSource = "#version 450\n"
12896 "\n"
12897 "in block { layout(location=0) float x; } ins;\n"
12898 "layout(location=0) out vec4 color;\n"
12899 "void main(){\n"
12900 " color = vec4(ins.x);\n"
12901 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130012902
12903 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12904 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12905
12906 VkPipelineObj pipe(m_device);
12907 pipe.AddColorAttachment();
12908 pipe.AddShader(&vs);
12909 pipe.AddShader(&fs);
12910
12911 VkDescriptorSetObj descriptorSet(m_device);
12912 descriptorSet.AppendDummy();
12913 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12914
12915 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12916
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012917 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012918}
12919
12920TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012921 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012922 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
Chris Forbes1cc79542016-07-20 11:13:44 +120012923 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "location 0.1 which is not written by vertex shader");
Chris Forbese9928822016-02-17 14:44:52 +130012925
12926 ASSERT_NO_FATAL_FAILURE(InitState());
12927 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12928
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012929 char const *vsSource = "#version 450\n"
12930 "\n"
12931 "out block { layout(location=0, component=0) float x; } outs;\n"
12932 "out gl_PerVertex {\n"
12933 " vec4 gl_Position;\n"
12934 "};\n"
12935 "void main(){\n"
12936 " outs.x = 0;\n"
12937 " gl_Position = vec4(1);\n"
12938 "}\n";
12939 char const *fsSource = "#version 450\n"
12940 "\n"
12941 "in block { layout(location=0, component=1) float x; } ins;\n"
12942 "layout(location=0) out vec4 color;\n"
12943 "void main(){\n"
12944 " color = vec4(ins.x);\n"
12945 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130012946
12947 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12948 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12949
12950 VkPipelineObj pipe(m_device);
12951 pipe.AddColorAttachment();
12952 pipe.AddShader(&vs);
12953 pipe.AddShader(&fs);
12954
12955 VkDescriptorSetObj descriptorSet(m_device);
12956 descriptorSet.AppendDummy();
12957 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12958
12959 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12960
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012961 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012962}
12963
Chris Forbes1f3b0152016-11-30 12:48:40 +130012964TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
12965 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
12966
12967 ASSERT_NO_FATAL_FAILURE(InitState());
12968 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12969
12970 char const *vsSource = "#version 450\n"
12971 "layout(location=0) out mediump float x;\n"
12972 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
12973 char const *fsSource = "#version 450\n"
12974 "layout(location=0) in highp float x;\n"
12975 "layout(location=0) out vec4 color;\n"
12976 "void main() { color = vec4(x); }\n";
12977
12978 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12979 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12980
12981 VkPipelineObj pipe(m_device);
12982 pipe.AddColorAttachment();
12983 pipe.AddShader(&vs);
12984 pipe.AddShader(&fs);
12985
12986 VkDescriptorSetObj descriptorSet(m_device);
12987 descriptorSet.AppendDummy();
12988 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12989
12990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
12991
12992 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12993
12994 m_errorMonitor->VerifyFound();
12995}
12996
Chris Forbes870a39e2016-11-30 12:55:56 +130012997TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
12998 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
12999
13000 ASSERT_NO_FATAL_FAILURE(InitState());
13001 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13002
13003 char const *vsSource = "#version 450\n"
13004 "out block { layout(location=0) mediump float x; };\n"
13005 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13006 char const *fsSource = "#version 450\n"
13007 "in block { layout(location=0) highp float x; };\n"
13008 "layout(location=0) out vec4 color;\n"
13009 "void main() { color = vec4(x); }\n";
13010
13011 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13012 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13013
13014 VkPipelineObj pipe(m_device);
13015 pipe.AddColorAttachment();
13016 pipe.AddShader(&vs);
13017 pipe.AddShader(&fs);
13018
13019 VkDescriptorSetObj descriptorSet(m_device);
13020 descriptorSet.AppendDummy();
13021 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13022
13023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
13024
13025 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13026
13027 m_errorMonitor->VerifyFound();
13028}
13029
Karl Schultz6addd812016-02-02 17:17:23 -070013030TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013031 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
13032 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013034
Chris Forbesde136e02015-05-25 11:13:28 +120013035 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120013037
13038 VkVertexInputBindingDescription input_binding;
13039 memset(&input_binding, 0, sizeof(input_binding));
13040
13041 VkVertexInputAttributeDescription input_attrib;
13042 memset(&input_attrib, 0, sizeof(input_attrib));
13043 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13044
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013045 char const *vsSource = "#version 450\n"
13046 "\n"
13047 "out gl_PerVertex {\n"
13048 " vec4 gl_Position;\n"
13049 "};\n"
13050 "void main(){\n"
13051 " gl_Position = vec4(1);\n"
13052 "}\n";
13053 char const *fsSource = "#version 450\n"
13054 "\n"
13055 "layout(location=0) out vec4 color;\n"
13056 "void main(){\n"
13057 " color = vec4(1);\n"
13058 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120013059
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013060 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13061 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120013062
13063 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013064 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120013065 pipe.AddShader(&vs);
13066 pipe.AddShader(&fs);
13067
13068 pipe.AddVertexInputBindings(&input_binding, 1);
13069 pipe.AddVertexInputAttribs(&input_attrib, 1);
13070
Chris Forbesde136e02015-05-25 11:13:28 +120013071 VkDescriptorSetObj descriptorSet(m_device);
13072 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013073 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120013074
Tony Barbour5781e8f2015-08-04 16:23:11 -060013075 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120013076
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013077 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120013078}
13079
Karl Schultz6addd812016-02-02 17:17:23 -070013080TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013081 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
13082 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130013084
13085 ASSERT_NO_FATAL_FAILURE(InitState());
13086 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13087
13088 VkVertexInputBindingDescription input_binding;
13089 memset(&input_binding, 0, sizeof(input_binding));
13090
13091 VkVertexInputAttributeDescription input_attrib;
13092 memset(&input_attrib, 0, sizeof(input_attrib));
13093 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13094
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013095 char const *vsSource = "#version 450\n"
13096 "\n"
13097 "layout(location=1) in float x;\n"
13098 "out gl_PerVertex {\n"
13099 " vec4 gl_Position;\n"
13100 "};\n"
13101 "void main(){\n"
13102 " gl_Position = vec4(x);\n"
13103 "}\n";
13104 char const *fsSource = "#version 450\n"
13105 "\n"
13106 "layout(location=0) out vec4 color;\n"
13107 "void main(){\n"
13108 " color = vec4(1);\n"
13109 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130013110
13111 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13112 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13113
13114 VkPipelineObj pipe(m_device);
13115 pipe.AddColorAttachment();
13116 pipe.AddShader(&vs);
13117 pipe.AddShader(&fs);
13118
13119 pipe.AddVertexInputBindings(&input_binding, 1);
13120 pipe.AddVertexInputAttribs(&input_attrib, 1);
13121
13122 VkDescriptorSetObj descriptorSet(m_device);
13123 descriptorSet.AppendDummy();
13124 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13125
13126 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13127
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013128 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130013129}
13130
Karl Schultz6addd812016-02-02 17:17:23 -070013131TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013132 TEST_DESCRIPTION("Test that an error is produced for a vertex shader input which is not "
Chris Forbes1cc79542016-07-20 11:13:44 +120013133 "provided by a vertex attribute");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013135
Chris Forbes62e8e502015-05-25 11:13:29 +120013136 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013137 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120013138
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013139 char const *vsSource = "#version 450\n"
13140 "\n"
13141 "layout(location=0) in vec4 x;\n" /* not provided */
13142 "out gl_PerVertex {\n"
13143 " vec4 gl_Position;\n"
13144 "};\n"
13145 "void main(){\n"
13146 " gl_Position = x;\n"
13147 "}\n";
13148 char const *fsSource = "#version 450\n"
13149 "\n"
13150 "layout(location=0) out vec4 color;\n"
13151 "void main(){\n"
13152 " color = vec4(1);\n"
13153 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120013154
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013155 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13156 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120013157
13158 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013159 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120013160 pipe.AddShader(&vs);
13161 pipe.AddShader(&fs);
13162
Chris Forbes62e8e502015-05-25 11:13:29 +120013163 VkDescriptorSetObj descriptorSet(m_device);
13164 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013165 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120013166
Tony Barbour5781e8f2015-08-04 16:23:11 -060013167 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120013168
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013169 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120013170}
13171
Karl Schultz6addd812016-02-02 17:17:23 -070013172TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013173 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
13174 "fundamental type (float/int/uint) of an attribute and the "
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013175 "vertex shader input that consumes it");
13176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "location 0 does not match vertex shader input type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013177
Chris Forbesc97d98e2015-05-25 11:13:31 +120013178 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013179 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013180
13181 VkVertexInputBindingDescription input_binding;
13182 memset(&input_binding, 0, sizeof(input_binding));
13183
13184 VkVertexInputAttributeDescription input_attrib;
13185 memset(&input_attrib, 0, sizeof(input_attrib));
13186 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13187
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013188 char const *vsSource = "#version 450\n"
13189 "\n"
13190 "layout(location=0) in int x;\n" /* attrib provided float */
13191 "out gl_PerVertex {\n"
13192 " vec4 gl_Position;\n"
13193 "};\n"
13194 "void main(){\n"
13195 " gl_Position = vec4(x);\n"
13196 "}\n";
13197 char const *fsSource = "#version 450\n"
13198 "\n"
13199 "layout(location=0) out vec4 color;\n"
13200 "void main(){\n"
13201 " color = vec4(1);\n"
13202 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120013203
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013204 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13205 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013206
13207 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013208 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013209 pipe.AddShader(&vs);
13210 pipe.AddShader(&fs);
13211
13212 pipe.AddVertexInputBindings(&input_binding, 1);
13213 pipe.AddVertexInputAttribs(&input_attrib, 1);
13214
Chris Forbesc97d98e2015-05-25 11:13:31 +120013215 VkDescriptorSetObj descriptorSet(m_device);
13216 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013217 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013218
Tony Barbour5781e8f2015-08-04 16:23:11 -060013219 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013220
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013221 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013222}
13223
Chris Forbesc68b43c2016-04-06 11:18:47 +120013224TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013225 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
13226 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13228 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120013229
13230 ASSERT_NO_FATAL_FAILURE(InitState());
13231 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13232
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013233 char const *vsSource = "#version 450\n"
13234 "\n"
13235 "out gl_PerVertex {\n"
13236 " vec4 gl_Position;\n"
13237 "};\n"
13238 "void main(){\n"
13239 " gl_Position = vec4(1);\n"
13240 "}\n";
13241 char const *fsSource = "#version 450\n"
13242 "\n"
13243 "layout(location=0) out vec4 color;\n"
13244 "void main(){\n"
13245 " color = vec4(1);\n"
13246 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120013247
13248 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13249 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13250
13251 VkPipelineObj pipe(m_device);
13252 pipe.AddColorAttachment();
13253 pipe.AddShader(&vs);
Mike Weiblencce7ec72016-10-17 19:33:05 -060013254 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120013255 pipe.AddShader(&fs);
13256
13257 VkDescriptorSetObj descriptorSet(m_device);
13258 descriptorSet.AppendDummy();
13259 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13260
13261 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13262
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013263 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120013264}
13265
Chris Forbes82ff92a2016-09-09 10:50:24 +120013266TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
13267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13268 "No entrypoint found named `foo`");
13269
13270 ASSERT_NO_FATAL_FAILURE(InitState());
13271 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13272
13273 char const *vsSource = "#version 450\n"
13274 "out gl_PerVertex {\n"
13275 " vec4 gl_Position;\n"
13276 "};\n"
13277 "void main(){\n"
13278 " gl_Position = vec4(0);\n"
13279 "}\n";
13280 char const *fsSource = "#version 450\n"
13281 "\n"
13282 "layout(location=0) out vec4 color;\n"
13283 "void main(){\n"
13284 " color = vec4(1);\n"
13285 "}\n";
13286
13287 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13288 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
13289
13290 VkPipelineObj pipe(m_device);
13291 pipe.AddColorAttachment();
13292 pipe.AddShader(&vs);
13293 pipe.AddShader(&fs);
13294
13295 VkDescriptorSetObj descriptorSet(m_device);
13296 descriptorSet.AppendDummy();
13297 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13298
13299 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13300
13301 m_errorMonitor->VerifyFound();
13302}
13303
Chris Forbesae9d8cd2016-09-13 16:32:57 +120013304TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
13305 m_errorMonitor->SetDesiredFailureMsg(
13306 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13307 "pDepthStencilState is NULL when rasterization is enabled and subpass "
13308 "uses a depth/stencil attachment");
13309
13310 ASSERT_NO_FATAL_FAILURE(InitState());
13311 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13312
13313 char const *vsSource = "#version 450\n"
13314 "void main(){ gl_Position = vec4(0); }\n";
13315 char const *fsSource = "#version 450\n"
13316 "\n"
13317 "layout(location=0) out vec4 color;\n"
13318 "void main(){\n"
13319 " color = vec4(1);\n"
13320 "}\n";
13321
13322 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13323 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13324
13325 VkPipelineObj pipe(m_device);
13326 pipe.AddColorAttachment();
13327 pipe.AddShader(&vs);
13328 pipe.AddShader(&fs);
13329
13330 VkDescriptorSetObj descriptorSet(m_device);
13331 descriptorSet.AppendDummy();
13332 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13333
13334 VkAttachmentDescription attachments[] = {
13335 { 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
13336 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13337 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13338 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
13339 },
13340 { 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT,
13341 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13342 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13343 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
13344 },
13345 };
13346 VkAttachmentReference refs[] = {
13347 { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL },
13348 { 1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL },
13349 };
13350 VkSubpassDescription subpass = {
13351 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
13352 1, &refs[0], nullptr, &refs[1],
13353 0, nullptr
13354 };
13355 VkRenderPassCreateInfo rpci = {
13356 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
13357 0, 2, attachments, 1, &subpass, 0, nullptr
13358 };
13359 VkRenderPass rp;
13360 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13361 ASSERT_VK_SUCCESS(err);
13362
13363 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
13364
13365 m_errorMonitor->VerifyFound();
13366
13367 vkDestroyRenderPass(m_device->device(), rp, nullptr);
13368}
13369
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013370TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013371 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
13372 "the TCS without the patch decoration, but consumed in the TES "
13373 "with the decoration.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is per-vertex in tessellation control shader stage "
13375 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120013376
13377 ASSERT_NO_FATAL_FAILURE(InitState());
13378 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13379
Chris Forbesc1e852d2016-04-04 19:26:42 +120013380 if (!m_device->phy().features().tessellationShader) {
13381 printf("Device does not support tessellation shaders; skipped.\n");
13382 return;
13383 }
13384
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013385 char const *vsSource = "#version 450\n"
13386 "void main(){}\n";
13387 char const *tcsSource = "#version 450\n"
13388 "layout(location=0) out int x[];\n"
13389 "layout(vertices=3) out;\n"
13390 "void main(){\n"
13391 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13392 " gl_TessLevelInner[0] = 1;\n"
13393 " x[gl_InvocationID] = gl_InvocationID;\n"
13394 "}\n";
13395 char const *tesSource = "#version 450\n"
13396 "layout(triangles, equal_spacing, cw) in;\n"
13397 "layout(location=0) patch in int x;\n"
13398 "out gl_PerVertex { vec4 gl_Position; };\n"
13399 "void main(){\n"
13400 " gl_Position.xyz = gl_TessCoord;\n"
13401 " gl_Position.w = x;\n"
13402 "}\n";
13403 char const *fsSource = "#version 450\n"
13404 "layout(location=0) out vec4 color;\n"
13405 "void main(){\n"
13406 " color = vec4(1);\n"
13407 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120013408
13409 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13410 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13411 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13412 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13413
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013414 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
13415 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120013416
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013417 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120013418
13419 VkPipelineObj pipe(m_device);
13420 pipe.SetInputAssembly(&iasci);
13421 pipe.SetTessellation(&tsci);
13422 pipe.AddColorAttachment();
13423 pipe.AddShader(&vs);
13424 pipe.AddShader(&tcs);
13425 pipe.AddShader(&tes);
13426 pipe.AddShader(&fs);
13427
13428 VkDescriptorSetObj descriptorSet(m_device);
13429 descriptorSet.AppendDummy();
13430 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13431
13432 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13433
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013434 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120013435}
13436
Karl Schultz6addd812016-02-02 17:17:23 -070013437TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013438 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
13439 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13441 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013442
Chris Forbes280ba2c2015-06-12 11:16:41 +120013443 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013444 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013445
13446 /* Two binding descriptions for binding 0 */
13447 VkVertexInputBindingDescription input_bindings[2];
13448 memset(input_bindings, 0, sizeof(input_bindings));
13449
13450 VkVertexInputAttributeDescription input_attrib;
13451 memset(&input_attrib, 0, sizeof(input_attrib));
13452 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13453
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013454 char const *vsSource = "#version 450\n"
13455 "\n"
13456 "layout(location=0) in float x;\n" /* attrib provided float */
13457 "out gl_PerVertex {\n"
13458 " vec4 gl_Position;\n"
13459 "};\n"
13460 "void main(){\n"
13461 " gl_Position = vec4(x);\n"
13462 "}\n";
13463 char const *fsSource = "#version 450\n"
13464 "\n"
13465 "layout(location=0) out vec4 color;\n"
13466 "void main(){\n"
13467 " color = vec4(1);\n"
13468 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120013469
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013470 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13471 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013472
13473 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013474 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013475 pipe.AddShader(&vs);
13476 pipe.AddShader(&fs);
13477
13478 pipe.AddVertexInputBindings(input_bindings, 2);
13479 pipe.AddVertexInputAttribs(&input_attrib, 1);
13480
Chris Forbes280ba2c2015-06-12 11:16:41 +120013481 VkDescriptorSetObj descriptorSet(m_device);
13482 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013483 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013484
Tony Barbour5781e8f2015-08-04 16:23:11 -060013485 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013486
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013487 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013488}
Chris Forbes8f68b562015-05-25 11:13:32 +120013489
Karl Schultz6addd812016-02-02 17:17:23 -070013490TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mike Weiblencce7ec72016-10-17 19:33:05 -060013491 TEST_DESCRIPTION("Test that an error is produced for a fragment shader which does not "
Chris Forbes1cc79542016-07-20 11:13:44 +120013492 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013494
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013495 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013496
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013497 char const *vsSource = "#version 450\n"
13498 "\n"
13499 "out gl_PerVertex {\n"
13500 " vec4 gl_Position;\n"
13501 "};\n"
13502 "void main(){\n"
13503 " gl_Position = vec4(1);\n"
13504 "}\n";
13505 char const *fsSource = "#version 450\n"
13506 "\n"
13507 "void main(){\n"
13508 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013509
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013510 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13511 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013512
13513 VkPipelineObj pipe(m_device);
13514 pipe.AddShader(&vs);
13515 pipe.AddShader(&fs);
13516
Chia-I Wu08accc62015-07-07 11:50:03 +080013517 /* set up CB 0, not written */
13518 pipe.AddColorAttachment();
13519 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013520
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013521 VkDescriptorSetObj descriptorSet(m_device);
13522 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013523 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013524
Tony Barbour5781e8f2015-08-04 16:23:11 -060013525 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013526
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013527 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013528}
13529
Karl Schultz6addd812016-02-02 17:17:23 -070013530TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mike Weiblencce7ec72016-10-17 19:33:05 -060013531 TEST_DESCRIPTION("Test that a warning is produced for a fragment shader which provides a spurious "
Chris Forbes1cc79542016-07-20 11:13:44 +120013532 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013534 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013535
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013536 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013537
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013538 char const *vsSource = "#version 450\n"
13539 "\n"
13540 "out gl_PerVertex {\n"
13541 " vec4 gl_Position;\n"
13542 "};\n"
13543 "void main(){\n"
13544 " gl_Position = vec4(1);\n"
13545 "}\n";
13546 char const *fsSource = "#version 450\n"
13547 "\n"
13548 "layout(location=0) out vec4 x;\n"
13549 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
13550 "void main(){\n"
13551 " x = vec4(1);\n"
13552 " y = vec4(1);\n"
13553 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013554
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013555 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13556 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013557
13558 VkPipelineObj pipe(m_device);
13559 pipe.AddShader(&vs);
13560 pipe.AddShader(&fs);
13561
Chia-I Wu08accc62015-07-07 11:50:03 +080013562 /* set up CB 0, not written */
13563 pipe.AddColorAttachment();
13564 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013565 /* FS writes CB 1, but we don't configure it */
13566
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013567 VkDescriptorSetObj descriptorSet(m_device);
13568 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013569 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013570
Tony Barbour5781e8f2015-08-04 16:23:11 -060013571 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013572
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013573 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013574}
13575
Karl Schultz6addd812016-02-02 17:17:23 -070013576TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013577 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
Mike Weiblencce7ec72016-10-17 19:33:05 -060013578 "type of an fragment shader output variable, and the format of the corresponding attachment");
13579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013580
Chris Forbesa36d69e2015-05-25 11:13:44 +120013581 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013582
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013583 char const *vsSource = "#version 450\n"
13584 "\n"
13585 "out gl_PerVertex {\n"
13586 " vec4 gl_Position;\n"
13587 "};\n"
13588 "void main(){\n"
13589 " gl_Position = vec4(1);\n"
13590 "}\n";
13591 char const *fsSource = "#version 450\n"
13592 "\n"
13593 "layout(location=0) out ivec4 x;\n" /* not UNORM */
13594 "void main(){\n"
13595 " x = ivec4(1);\n"
13596 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120013597
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013598 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13599 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013600
13601 VkPipelineObj pipe(m_device);
13602 pipe.AddShader(&vs);
13603 pipe.AddShader(&fs);
13604
Chia-I Wu08accc62015-07-07 11:50:03 +080013605 /* set up CB 0; type is UNORM by default */
13606 pipe.AddColorAttachment();
13607 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013608
Chris Forbesa36d69e2015-05-25 11:13:44 +120013609 VkDescriptorSetObj descriptorSet(m_device);
13610 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013611 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013612
Tony Barbour5781e8f2015-08-04 16:23:11 -060013613 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013614
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013615 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120013616}
Chris Forbes7b1b8932015-06-05 14:43:36 +120013617
Karl Schultz6addd812016-02-02 17:17:23 -070013618TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013619 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
13620 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013622
Chris Forbes556c76c2015-08-14 12:04:59 +120013623 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120013624
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013625 char const *vsSource = "#version 450\n"
13626 "\n"
13627 "out gl_PerVertex {\n"
13628 " vec4 gl_Position;\n"
13629 "};\n"
13630 "void main(){\n"
13631 " gl_Position = vec4(1);\n"
13632 "}\n";
13633 char const *fsSource = "#version 450\n"
13634 "\n"
13635 "layout(location=0) out vec4 x;\n"
13636 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
13637 "void main(){\n"
13638 " x = vec4(bar.y);\n"
13639 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120013640
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013641 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13642 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120013643
Chris Forbes556c76c2015-08-14 12:04:59 +120013644 VkPipelineObj pipe(m_device);
13645 pipe.AddShader(&vs);
13646 pipe.AddShader(&fs);
13647
13648 /* set up CB 0; type is UNORM by default */
13649 pipe.AddColorAttachment();
13650 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13651
13652 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013653 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120013654
13655 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13656
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013657 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120013658}
13659
Chris Forbes5c59e902016-02-26 16:56:09 +130013660TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013661 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
13662 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130013664
13665 ASSERT_NO_FATAL_FAILURE(InitState());
13666
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013667 char const *vsSource = "#version 450\n"
13668 "\n"
13669 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13670 "out gl_PerVertex {\n"
13671 " vec4 gl_Position;\n"
13672 "};\n"
13673 "void main(){\n"
13674 " gl_Position = vec4(consts.x);\n"
13675 "}\n";
13676 char const *fsSource = "#version 450\n"
13677 "\n"
13678 "layout(location=0) out vec4 x;\n"
13679 "void main(){\n"
13680 " x = vec4(1);\n"
13681 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130013682
13683 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13684 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13685
13686 VkPipelineObj pipe(m_device);
13687 pipe.AddShader(&vs);
13688 pipe.AddShader(&fs);
13689
13690 /* set up CB 0; type is UNORM by default */
13691 pipe.AddColorAttachment();
13692 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13693
13694 VkDescriptorSetObj descriptorSet(m_device);
13695 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13696
13697 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13698
13699 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013700 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130013701}
13702
Chris Forbes3fb17902016-08-22 14:57:55 +120013703TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
13704 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
13705 "which is not included in the subpass description");
13706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13707 "consumes input attachment index 0 but not provided in subpass");
13708
13709 ASSERT_NO_FATAL_FAILURE(InitState());
13710
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013711 char const *vsSource = "#version 450\n"
13712 "\n"
13713 "out gl_PerVertex {\n"
13714 " vec4 gl_Position;\n"
13715 "};\n"
13716 "void main(){\n"
13717 " gl_Position = vec4(1);\n"
13718 "}\n";
13719 char const *fsSource = "#version 450\n"
13720 "\n"
13721 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
13722 "layout(location=0) out vec4 color;\n"
13723 "void main() {\n"
13724 " color = subpassLoad(x);\n"
13725 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120013726
13727 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13728 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13729
13730 VkPipelineObj pipe(m_device);
13731 pipe.AddShader(&vs);
13732 pipe.AddShader(&fs);
13733 pipe.AddColorAttachment();
13734 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13735
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013736 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
13737 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120013738 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013739 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120013740 ASSERT_VK_SUCCESS(err);
13741
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013742 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120013743 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013744 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120013745 ASSERT_VK_SUCCESS(err);
13746
13747 // error here.
13748 pipe.CreateVKPipeline(pl, renderPass());
13749
13750 m_errorMonitor->VerifyFound();
13751
13752 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13753 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13754}
13755
Chris Forbes5a9a0472016-08-22 16:02:09 +120013756TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
13757 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
13758 "with a format having a different fundamental type");
13759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13760 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
13761
13762 ASSERT_NO_FATAL_FAILURE(InitState());
13763
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013764 char const *vsSource = "#version 450\n"
13765 "\n"
13766 "out gl_PerVertex {\n"
13767 " vec4 gl_Position;\n"
13768 "};\n"
13769 "void main(){\n"
13770 " gl_Position = vec4(1);\n"
13771 "}\n";
13772 char const *fsSource = "#version 450\n"
13773 "\n"
13774 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
13775 "layout(location=0) out vec4 color;\n"
13776 "void main() {\n"
13777 " color = subpassLoad(x);\n"
13778 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120013779
13780 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13781 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13782
13783 VkPipelineObj pipe(m_device);
13784 pipe.AddShader(&vs);
13785 pipe.AddShader(&fs);
13786 pipe.AddColorAttachment();
13787 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13788
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013789 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
13790 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013791 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013792 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120013793 ASSERT_VK_SUCCESS(err);
13794
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013795 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013796 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013797 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120013798 ASSERT_VK_SUCCESS(err);
13799
13800 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013801 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
13802 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
13803 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
13804 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
13805 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL},
Chris Forbes5a9a0472016-08-22 16:02:09 +120013806 };
13807 VkAttachmentReference color = {
13808 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
13809 };
13810 VkAttachmentReference input = {
13811 1, VK_IMAGE_LAYOUT_GENERAL,
13812 };
13813
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013814 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013815
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013816 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013817 VkRenderPass rp;
13818 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13819 ASSERT_VK_SUCCESS(err);
13820
13821 // error here.
13822 pipe.CreateVKPipeline(pl, rp);
13823
13824 m_errorMonitor->VerifyFound();
13825
13826 vkDestroyRenderPass(m_device->device(), rp, nullptr);
13827 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13828 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13829}
13830
Chris Forbes541f7b02016-08-22 15:30:27 +120013831TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
13832 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
13833 "which is not included in the subpass description -- array case");
13834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13835 "consumes input attachment index 1 but not provided in subpass");
13836
13837 ASSERT_NO_FATAL_FAILURE(InitState());
13838
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013839 char const *vsSource = "#version 450\n"
13840 "\n"
13841 "out gl_PerVertex {\n"
13842 " vec4 gl_Position;\n"
13843 "};\n"
13844 "void main(){\n"
13845 " gl_Position = vec4(1);\n"
13846 "}\n";
13847 char const *fsSource = "#version 450\n"
13848 "\n"
13849 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[2];\n"
13850 "layout(location=0) out vec4 color;\n"
13851 "void main() {\n"
13852 " color = subpassLoad(xs[1]);\n"
13853 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120013854
13855 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13856 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13857
13858 VkPipelineObj pipe(m_device);
13859 pipe.AddShader(&vs);
13860 pipe.AddShader(&fs);
13861 pipe.AddColorAttachment();
13862 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13863
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013864 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
13865 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120013866 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013867 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120013868 ASSERT_VK_SUCCESS(err);
13869
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013870 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120013871 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013872 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120013873 ASSERT_VK_SUCCESS(err);
13874
13875 // error here.
13876 pipe.CreateVKPipeline(pl, renderPass());
13877
13878 m_errorMonitor->VerifyFound();
13879
13880 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13881 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13882}
13883
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013884TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013885 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
13886 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013888
13889 ASSERT_NO_FATAL_FAILURE(InitState());
13890
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013891 char const *csSource = "#version 450\n"
13892 "\n"
13893 "layout(local_size_x=1) in;\n"
13894 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13895 "void main(){\n"
13896 " x = vec4(1);\n"
13897 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013898
13899 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13900
13901 VkDescriptorSetObj descriptorSet(m_device);
13902 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13903
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013904 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13905 nullptr,
13906 0,
13907 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
13908 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
13909 descriptorSet.GetPipelineLayout(),
13910 VK_NULL_HANDLE,
13911 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013912
13913 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013914 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013915
13916 m_errorMonitor->VerifyFound();
13917
13918 if (err == VK_SUCCESS) {
13919 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13920 }
13921}
13922
Chris Forbes22a9b092016-07-19 14:34:05 +120013923TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013924 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
13925 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13927 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120013928
13929 ASSERT_NO_FATAL_FAILURE(InitState());
13930
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013931 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
13932 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120013933 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013934 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120013935 ASSERT_VK_SUCCESS(err);
13936
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013937 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120013938 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013939 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120013940 ASSERT_VK_SUCCESS(err);
13941
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013942 char const *csSource = "#version 450\n"
13943 "\n"
13944 "layout(local_size_x=1) in;\n"
13945 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13946 "void main() {\n"
13947 " x.x = 1.0f;\n"
13948 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120013949 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13950
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013951 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13952 nullptr,
13953 0,
13954 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
13955 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
13956 pl,
13957 VK_NULL_HANDLE,
13958 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120013959
13960 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013961 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120013962
13963 m_errorMonitor->VerifyFound();
13964
13965 if (err == VK_SUCCESS) {
13966 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13967 }
13968
13969 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13970 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13971}
13972
Chris Forbes50020592016-07-27 13:52:41 +120013973TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
13974 TEST_DESCRIPTION("Test that an error is produced when an image view type "
13975 "does not match the dimensionality declared in the shader");
13976
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
Chris Forbes50020592016-07-27 13:52:41 +120013978
13979 ASSERT_NO_FATAL_FAILURE(InitState());
13980 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13981
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013982 char const *vsSource = "#version 450\n"
13983 "\n"
13984 "out gl_PerVertex { vec4 gl_Position; };\n"
13985 "void main() { gl_Position = vec4(0); }\n";
13986 char const *fsSource = "#version 450\n"
13987 "\n"
13988 "layout(set=0, binding=0) uniform sampler3D s;\n"
13989 "layout(location=0) out vec4 color;\n"
13990 "void main() {\n"
13991 " color = texture(s, vec3(0));\n"
13992 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120013993 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13994 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13995
13996 VkPipelineObj pipe(m_device);
13997 pipe.AddShader(&vs);
13998 pipe.AddShader(&fs);
13999 pipe.AddColorAttachment();
14000
14001 VkTextureObj texture(m_device, nullptr);
14002 VkSamplerObj sampler(m_device);
14003
14004 VkDescriptorSetObj descriptorSet(m_device);
14005 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14006 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14007
14008 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14009 ASSERT_VK_SUCCESS(err);
14010
14011 BeginCommandBuffer();
14012
14013 m_commandBuffer->BindPipeline(pipe);
14014 m_commandBuffer->BindDescriptorSet(descriptorSet);
14015
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014016 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120014017 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014018 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120014019 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14020
14021 // error produced here.
14022 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14023
14024 m_errorMonitor->VerifyFound();
14025
14026 EndCommandBuffer();
14027}
14028
Chris Forbes5533bfc2016-07-27 14:12:34 +120014029TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
14030 TEST_DESCRIPTION("Test that an error is produced when a multisampled images "
14031 "are consumed via singlesample images types in the shader, or vice versa.");
14032
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120014034
14035 ASSERT_NO_FATAL_FAILURE(InitState());
14036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14037
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014038 char const *vsSource = "#version 450\n"
14039 "\n"
14040 "out gl_PerVertex { vec4 gl_Position; };\n"
14041 "void main() { gl_Position = vec4(0); }\n";
14042 char const *fsSource = "#version 450\n"
14043 "\n"
14044 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
14045 "layout(location=0) out vec4 color;\n"
14046 "void main() {\n"
14047 " color = texelFetch(s, ivec2(0), 0);\n"
14048 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120014049 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14050 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14051
14052 VkPipelineObj pipe(m_device);
14053 pipe.AddShader(&vs);
14054 pipe.AddShader(&fs);
14055 pipe.AddColorAttachment();
14056
14057 VkTextureObj texture(m_device, nullptr);
14058 VkSamplerObj sampler(m_device);
14059
14060 VkDescriptorSetObj descriptorSet(m_device);
14061 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14062 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14063
14064 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14065 ASSERT_VK_SUCCESS(err);
14066
14067 BeginCommandBuffer();
14068
14069 m_commandBuffer->BindPipeline(pipe);
14070 m_commandBuffer->BindDescriptorSet(descriptorSet);
14071
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014072 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120014073 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014074 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120014075 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14076
14077 // error produced here.
14078 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14079
14080 m_errorMonitor->VerifyFound();
14081
14082 EndCommandBuffer();
14083}
14084
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014085#endif // SHADER_CHECKER_TESTS
14086
14087#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060014088TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014090
14091 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014092
14093 // Create an image
14094 VkImage image;
14095
Karl Schultz6addd812016-02-02 17:17:23 -070014096 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14097 const int32_t tex_width = 32;
14098 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014099
14100 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014101 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14102 image_create_info.pNext = NULL;
14103 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14104 image_create_info.format = tex_format;
14105 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014106 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070014107 image_create_info.extent.depth = 1;
14108 image_create_info.mipLevels = 1;
14109 image_create_info.arrayLayers = 1;
14110 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14111 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14112 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14113 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014114
14115 // Introduce error by sending down a bogus width extent
14116 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014117 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014118
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014119 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014120}
14121
Mark Youngc48c4c12016-04-11 14:26:49 -060014122TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14124 "CreateImage extents is 0 for at least one required dimension");
Mark Youngc48c4c12016-04-11 14:26:49 -060014125
14126 ASSERT_NO_FATAL_FAILURE(InitState());
14127
14128 // Create an image
14129 VkImage image;
14130
14131 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14132 const int32_t tex_width = 32;
14133 const int32_t tex_height = 32;
14134
14135 VkImageCreateInfo image_create_info = {};
14136 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14137 image_create_info.pNext = NULL;
14138 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14139 image_create_info.format = tex_format;
14140 image_create_info.extent.width = tex_width;
14141 image_create_info.extent.height = tex_height;
14142 image_create_info.extent.depth = 1;
14143 image_create_info.mipLevels = 1;
14144 image_create_info.arrayLayers = 1;
14145 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14146 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14147 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14148 image_create_info.flags = 0;
14149
14150 // Introduce error by sending down a bogus width extent
14151 image_create_info.extent.width = 0;
14152 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14153
14154 m_errorMonitor->VerifyFound();
14155}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014156#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120014157
Tobin Ehliscde08892015-09-22 10:11:37 -060014158#if IMAGE_TESTS
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070014159
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014160TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
14161 TEST_DESCRIPTION("Create a render pass with an attachment description "
14162 "format set to VK_FORMAT_UNDEFINED");
14163
14164 ASSERT_NO_FATAL_FAILURE(InitState());
14165 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14166
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014168
14169 VkAttachmentReference color_attach = {};
14170 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
14171 color_attach.attachment = 0;
14172 VkSubpassDescription subpass = {};
14173 subpass.colorAttachmentCount = 1;
14174 subpass.pColorAttachments = &color_attach;
14175
14176 VkRenderPassCreateInfo rpci = {};
14177 rpci.subpassCount = 1;
14178 rpci.pSubpasses = &subpass;
14179 rpci.attachmentCount = 1;
14180 VkAttachmentDescription attach_desc = {};
14181 attach_desc.format = VK_FORMAT_UNDEFINED;
14182 rpci.pAttachments = &attach_desc;
14183 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
14184 VkRenderPass rp;
14185 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
14186
14187 m_errorMonitor->VerifyFound();
14188
14189 if (result == VK_SUCCESS) {
14190 vkDestroyRenderPass(m_device->device(), rp, NULL);
14191 }
14192}
14193
Karl Schultz6addd812016-02-02 17:17:23 -070014194TEST_F(VkLayerTest, InvalidImageView) {
14195 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060014196
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseMipLevel 10 ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014198
Tobin Ehliscde08892015-09-22 10:11:37 -060014199 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060014200
Mike Stroyana3082432015-09-25 13:39:21 -060014201 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070014202 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060014203
Karl Schultz6addd812016-02-02 17:17:23 -070014204 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14205 const int32_t tex_width = 32;
14206 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060014207
14208 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014209 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14210 image_create_info.pNext = NULL;
14211 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14212 image_create_info.format = tex_format;
14213 image_create_info.extent.width = tex_width;
14214 image_create_info.extent.height = tex_height;
14215 image_create_info.extent.depth = 1;
14216 image_create_info.mipLevels = 1;
14217 image_create_info.arrayLayers = 1;
14218 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14219 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14220 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14221 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060014222
Chia-I Wuf7458c52015-10-26 21:10:41 +080014223 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060014224 ASSERT_VK_SUCCESS(err);
14225
14226 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130014227 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070014228 image_view_create_info.image = image;
14229 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14230 image_view_create_info.format = tex_format;
14231 image_view_create_info.subresourceRange.layerCount = 1;
14232 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
14233 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014234 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060014235
14236 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014237 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060014238
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014239 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060014240 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060014241}
Mike Stroyana3082432015-09-25 13:39:21 -060014242
Mark Youngd339ba32016-05-30 13:28:35 -060014243TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
14244 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060014245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060014246 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060014247
14248 ASSERT_NO_FATAL_FAILURE(InitState());
14249
14250 // Create an image and try to create a view with no memory backing the image
14251 VkImage image;
14252
14253 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14254 const int32_t tex_width = 32;
14255 const int32_t tex_height = 32;
14256
14257 VkImageCreateInfo image_create_info = {};
14258 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14259 image_create_info.pNext = NULL;
14260 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14261 image_create_info.format = tex_format;
14262 image_create_info.extent.width = tex_width;
14263 image_create_info.extent.height = tex_height;
14264 image_create_info.extent.depth = 1;
14265 image_create_info.mipLevels = 1;
14266 image_create_info.arrayLayers = 1;
14267 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14268 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14269 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14270 image_create_info.flags = 0;
14271
14272 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14273 ASSERT_VK_SUCCESS(err);
14274
14275 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130014276 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060014277 image_view_create_info.image = image;
14278 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14279 image_view_create_info.format = tex_format;
14280 image_view_create_info.subresourceRange.layerCount = 1;
14281 image_view_create_info.subresourceRange.baseMipLevel = 0;
14282 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014283 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060014284
14285 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014286 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060014287
14288 m_errorMonitor->VerifyFound();
14289 vkDestroyImage(m_device->device(), image, NULL);
14290 // If last error is success, it still created the view, so delete it.
14291 if (err == VK_SUCCESS) {
14292 vkDestroyImageView(m_device->device(), view, NULL);
14293 }
Mark Youngd339ba32016-05-30 13:28:35 -060014294}
14295
Karl Schultz6addd812016-02-02 17:17:23 -070014296TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014297 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView(): Color image "
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014299 "formats must have ONLY the "
14300 "VK_IMAGE_ASPECT_COLOR_BIT set");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014301 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14302 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014303
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014304 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014305
Karl Schultz6addd812016-02-02 17:17:23 -070014306 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014307 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014308 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014309 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014310
14311 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014312 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014313 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070014314 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14315 image_view_create_info.format = tex_format;
14316 image_view_create_info.subresourceRange.baseMipLevel = 0;
14317 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014318 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014319 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014320 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014321
14322 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014323 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014324
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014325 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014326}
14327
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014328TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070014329 VkResult err;
14330 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014331
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14333 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014334
Mike Stroyana3082432015-09-25 13:39:21 -060014335 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014336
14337 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014338 VkImage srcImage;
14339 VkImage dstImage;
14340 VkDeviceMemory srcMem;
14341 VkDeviceMemory destMem;
14342 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014343
14344 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014345 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14346 image_create_info.pNext = NULL;
14347 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14348 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14349 image_create_info.extent.width = 32;
14350 image_create_info.extent.height = 32;
14351 image_create_info.extent.depth = 1;
14352 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014353 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070014354 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14355 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14356 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14357 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014358
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014359 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014360 ASSERT_VK_SUCCESS(err);
14361
Mark Lobodzinski867787a2016-10-14 11:49:55 -060014362 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014363 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014364 ASSERT_VK_SUCCESS(err);
14365
14366 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014367 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014368 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14369 memAlloc.pNext = NULL;
14370 memAlloc.allocationSize = 0;
14371 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014372
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014373 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014374 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014375 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014376 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014377 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014378 ASSERT_VK_SUCCESS(err);
14379
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014380 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014381 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014382 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014383 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014384 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014385 ASSERT_VK_SUCCESS(err);
14386
14387 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14388 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014389 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014390 ASSERT_VK_SUCCESS(err);
14391
14392 BeginCommandBuffer();
14393 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014394 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014395 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014396 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014397 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060014398 copyRegion.srcOffset.x = 0;
14399 copyRegion.srcOffset.y = 0;
14400 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014401 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014402 copyRegion.dstSubresource.mipLevel = 0;
14403 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014404 // Introduce failure by forcing the dst layerCount to differ from src
14405 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014406 copyRegion.dstOffset.x = 0;
14407 copyRegion.dstOffset.y = 0;
14408 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014409 copyRegion.extent.width = 1;
14410 copyRegion.extent.height = 1;
14411 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014412 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014413 EndCommandBuffer();
14414
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014415 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014416
Chia-I Wuf7458c52015-10-26 21:10:41 +080014417 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014418 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014419 vkFreeMemory(m_device->device(), srcMem, NULL);
14420 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014421}
14422
Tony Barbourd6673642016-05-05 14:46:39 -060014423TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
14424
14425 TEST_DESCRIPTION("Creating images with unsuported formats ");
14426
14427 ASSERT_NO_FATAL_FAILURE(InitState());
14428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14429 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014430 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Tony Barbourd6673642016-05-05 14:46:39 -060014431 VK_IMAGE_TILING_OPTIMAL, 0);
14432 ASSERT_TRUE(image.initialized());
14433
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014434 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130014435 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014436 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014437 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14438 image_create_info.format = VK_FORMAT_UNDEFINED;
14439 image_create_info.extent.width = 32;
14440 image_create_info.extent.height = 32;
14441 image_create_info.extent.depth = 1;
14442 image_create_info.mipLevels = 1;
14443 image_create_info.arrayLayers = 1;
14444 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14445 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14446 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014447
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14449 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014450
14451 VkImage localImage;
14452 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
14453 m_errorMonitor->VerifyFound();
14454
Tony Barbourd6673642016-05-05 14:46:39 -060014455 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014456 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060014457 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
14458 VkFormat format = static_cast<VkFormat>(f);
14459 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014460 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060014461 unsupported = format;
14462 break;
14463 }
14464 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014465
Tony Barbourd6673642016-05-05 14:46:39 -060014466 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060014467 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060014469
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014470 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060014471 m_errorMonitor->VerifyFound();
14472 }
14473}
14474
14475TEST_F(VkLayerTest, ImageLayerViewTests) {
14476 VkResult ret;
14477 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
14478
14479 ASSERT_NO_FATAL_FAILURE(InitState());
14480
14481 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014482 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Tony Barbourd6673642016-05-05 14:46:39 -060014483 VK_IMAGE_TILING_OPTIMAL, 0);
14484 ASSERT_TRUE(image.initialized());
14485
14486 VkImageView imgView;
14487 VkImageViewCreateInfo imgViewInfo = {};
14488 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
14489 imgViewInfo.image = image.handle();
14490 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
14491 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14492 imgViewInfo.subresourceRange.layerCount = 1;
14493 imgViewInfo.subresourceRange.baseMipLevel = 0;
14494 imgViewInfo.subresourceRange.levelCount = 1;
14495 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14496
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseMipLevel");
Tony Barbourd6673642016-05-05 14:46:39 -060014498 // View can't have baseMipLevel >= image's mipLevels - Expect
14499 // VIEW_CREATE_ERROR
14500 imgViewInfo.subresourceRange.baseMipLevel = 1;
14501 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14502 m_errorMonitor->VerifyFound();
14503 imgViewInfo.subresourceRange.baseMipLevel = 0;
14504
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseArrayLayer");
Tony Barbourd6673642016-05-05 14:46:39 -060014506 // View can't have baseArrayLayer >= image's arraySize - Expect
14507 // VIEW_CREATE_ERROR
14508 imgViewInfo.subresourceRange.baseArrayLayer = 1;
14509 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14510 m_errorMonitor->VerifyFound();
14511 imgViewInfo.subresourceRange.baseArrayLayer = 0;
14512
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with 0 in "
14514 "pCreateInfo->subresourceRange."
14515 "levelCount");
Tony Barbourd6673642016-05-05 14:46:39 -060014516 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
14517 imgViewInfo.subresourceRange.levelCount = 0;
14518 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14519 m_errorMonitor->VerifyFound();
14520 imgViewInfo.subresourceRange.levelCount = 1;
14521
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with 0 in "
14523 "pCreateInfo->subresourceRange."
14524 "layerCount");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014525 m_errorMonitor->SetDesiredFailureMsg(
14526 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14527 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060014528 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
14529 imgViewInfo.subresourceRange.layerCount = 0;
14530 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14531 m_errorMonitor->VerifyFound();
14532 imgViewInfo.subresourceRange.layerCount = 1;
14533
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "but both must be color formats");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Formats MUST be IDENTICAL unless "
14536 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
14537 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060014538 // Can't use depth format for view into color image - Expect INVALID_FORMAT
14539 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
14540 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14541 m_errorMonitor->VerifyFound();
14542 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14543
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Formats MUST be IDENTICAL unless "
14545 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
14546 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060014547 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
14548 // VIEW_CREATE_ERROR
14549 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
14550 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14551 m_errorMonitor->VerifyFound();
14552 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14553
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "can support ImageViews with "
14555 "differing formats but they must be "
14556 "in the same compatibility class.");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014557 // TODO: Update framework to easily passing mutable flag into ImageObj init
14558 // For now just allowing image for this one test to not have memory bound
14559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14560 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060014561 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
14562 // VIEW_CREATE_ERROR
14563 VkImageCreateInfo mutImgInfo = image.create_info();
14564 VkImage mutImage;
14565 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014566 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060014567 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
14568 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14569 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
14570 ASSERT_VK_SUCCESS(ret);
14571 imgViewInfo.image = mutImage;
14572 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14573 m_errorMonitor->VerifyFound();
14574 imgViewInfo.image = image.handle();
14575 vkDestroyImage(m_device->handle(), mutImage, NULL);
14576}
14577
14578TEST_F(VkLayerTest, MiscImageLayerTests) {
14579
14580 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
14581
14582 ASSERT_NO_FATAL_FAILURE(InitState());
14583
14584 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014585 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Tony Barbourd6673642016-05-05 14:46:39 -060014586 VK_IMAGE_TILING_OPTIMAL, 0);
14587 ASSERT_TRUE(image.initialized());
14588
Tony Barbourd6673642016-05-05 14:46:39 -060014589 vk_testing::Buffer buffer;
14590 VkMemoryPropertyFlags reqs = 0;
14591 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
14592 VkBufferImageCopy region = {};
14593 region.bufferRowLength = 128;
14594 region.bufferImageHeight = 128;
14595 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14596 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070014597 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060014598 region.imageExtent.height = 4;
14599 region.imageExtent.width = 4;
14600 region.imageExtent.depth = 1;
14601 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060014602
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070014603 // Image must have offset.z of 0 and extent.depth of 1
14604 // Introduce failure by setting imageExtent.depth to 0
14605 region.imageExtent.depth = 0;
14606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
14607 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14608 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
14609 m_errorMonitor->VerifyFound();
14610
14611 region.imageExtent.depth = 1;
14612
14613 // Image must have offset.z of 0 and extent.depth of 1
14614 // Introduce failure by setting imageOffset.z to 4
14615 region.imageOffset.z = 4;
14616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
14617 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14618 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
14619 m_errorMonitor->VerifyFound();
14620
14621 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014622 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
14623 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
14624 region.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014626 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14627 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014628 m_errorMonitor->VerifyFound();
14629
14630 // BufferOffset must be a multiple of 4
14631 // Introduce failure by setting bufferOffset to a value not divisible by 4
14632 region.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014634 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14635 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014636 m_errorMonitor->VerifyFound();
14637
14638 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
14639 region.bufferOffset = 0;
14640 region.imageExtent.height = 128;
14641 region.imageExtent.width = 128;
14642 // Introduce failure by setting bufferRowLength > 0 but less than width
14643 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014645 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14646 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014647 m_errorMonitor->VerifyFound();
14648
14649 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
14650 region.bufferRowLength = 128;
14651 // Introduce failure by setting bufferRowHeight > 0 but less than height
14652 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014654 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14655 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014656 m_errorMonitor->VerifyFound();
14657
14658 region.bufferImageHeight = 128;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14660 "If the format of srcImage is a depth, stencil, depth stencil or "
14661 "integer-based format then filter must be VK_FILTER_NEAREST");
Tony Barbourd6673642016-05-05 14:46:39 -060014662 // Expect INVALID_FILTER
14663 VkImageObj intImage1(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014664 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060014665 VkImageObj intImage2(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014666 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060014667 VkImageBlit blitRegion = {};
14668 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14669 blitRegion.srcSubresource.baseArrayLayer = 0;
14670 blitRegion.srcSubresource.layerCount = 1;
14671 blitRegion.srcSubresource.mipLevel = 0;
14672 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14673 blitRegion.dstSubresource.baseArrayLayer = 0;
14674 blitRegion.dstSubresource.layerCount = 1;
14675 blitRegion.dstSubresource.mipLevel = 0;
14676
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014677 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
14678 intImage2.layout(), 16, &blitRegion, VK_FILTER_LINEAR);
Tony Barbourd6673642016-05-05 14:46:39 -060014679 m_errorMonitor->VerifyFound();
14680
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060014681 // Look for NULL-blit warning
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "Offsets specify a zero-volume area.");
14683 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
14684 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060014685 m_errorMonitor->VerifyFound();
14686
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with 0 in ppMemoryBarriers");
Tony Barbourd6673642016-05-05 14:46:39 -060014688 VkImageMemoryBarrier img_barrier;
14689 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
14690 img_barrier.pNext = NULL;
14691 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
14692 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
14693 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14694 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14695 img_barrier.image = image.handle();
14696 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14697 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14698 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14699 img_barrier.subresourceRange.baseArrayLayer = 0;
14700 img_barrier.subresourceRange.baseMipLevel = 0;
14701 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
14702 img_barrier.subresourceRange.layerCount = 0;
14703 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014704 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
14705 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060014706 m_errorMonitor->VerifyFound();
14707 img_barrier.subresourceRange.layerCount = 1;
14708}
14709
14710TEST_F(VkLayerTest, ImageFormatLimits) {
14711
14712 TEST_DESCRIPTION("Exceed the limits of image format ");
14713
Cody Northropc31a84f2016-08-22 10:41:47 -060014714 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060014716 VkImageCreateInfo image_create_info = {};
14717 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14718 image_create_info.pNext = NULL;
14719 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14720 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14721 image_create_info.extent.width = 32;
14722 image_create_info.extent.height = 32;
14723 image_create_info.extent.depth = 1;
14724 image_create_info.mipLevels = 1;
14725 image_create_info.arrayLayers = 1;
14726 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14727 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14728 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14729 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14730 image_create_info.flags = 0;
14731
14732 VkImage nullImg;
14733 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014734 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
14735 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Tony Barbourd6673642016-05-05 14:46:39 -060014736 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
14737 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14738 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14739 m_errorMonitor->VerifyFound();
14740 image_create_info.extent.depth = 1;
14741
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060014743 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
14744 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14745 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14746 m_errorMonitor->VerifyFound();
14747 image_create_info.mipLevels = 1;
14748
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014749 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060014750 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
14751 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14752 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14753 m_errorMonitor->VerifyFound();
14754 image_create_info.arrayLayers = 1;
14755
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014756 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060014757 int samples = imgFmtProps.sampleCounts >> 1;
14758 image_create_info.samples = (VkSampleCountFlagBits)samples;
14759 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14760 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14761 m_errorMonitor->VerifyFound();
14762 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14763
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pCreateInfo->initialLayout, must be "
14765 "VK_IMAGE_LAYOUT_UNDEFINED or "
14766 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060014767 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14768 // Expect INVALID_LAYOUT
14769 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14770 m_errorMonitor->VerifyFound();
14771 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14772}
14773
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014774TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
14775
14776 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060014777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014778
14779 ASSERT_NO_FATAL_FAILURE(InitState());
14780
14781 VkImageObj src_image(m_device);
14782 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
14783 VkImageObj dst_image(m_device);
14784 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
14785
14786 BeginCommandBuffer();
14787 VkImageCopy copy_region;
14788 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14789 copy_region.srcSubresource.mipLevel = 0;
14790 copy_region.srcSubresource.baseArrayLayer = 0;
14791 copy_region.srcSubresource.layerCount = 0;
14792 copy_region.srcOffset.x = 0;
14793 copy_region.srcOffset.y = 0;
14794 copy_region.srcOffset.z = 0;
14795 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14796 copy_region.dstSubresource.mipLevel = 0;
14797 copy_region.dstSubresource.baseArrayLayer = 0;
14798 copy_region.dstSubresource.layerCount = 0;
14799 copy_region.dstOffset.x = 0;
14800 copy_region.dstOffset.y = 0;
14801 copy_region.dstOffset.z = 0;
14802 copy_region.extent.width = 64;
14803 copy_region.extent.height = 64;
14804 copy_region.extent.depth = 1;
14805 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
14806 &copy_region);
14807 EndCommandBuffer();
14808
14809 m_errorMonitor->VerifyFound();
14810}
14811
14812TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
14813
14814 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060014815 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014816
14817 ASSERT_NO_FATAL_FAILURE(InitState());
14818
14819 VkImageObj src_image(m_device);
14820 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
14821 VkImageObj dst_image(m_device);
14822 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
14823
14824 BeginCommandBuffer();
14825 VkImageCopy copy_region;
14826 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14827 copy_region.srcSubresource.mipLevel = 0;
14828 copy_region.srcSubresource.baseArrayLayer = 0;
14829 copy_region.srcSubresource.layerCount = 0;
14830 copy_region.srcOffset.x = 0;
14831 copy_region.srcOffset.y = 0;
14832 copy_region.srcOffset.z = 0;
14833 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14834 copy_region.dstSubresource.mipLevel = 0;
14835 copy_region.dstSubresource.baseArrayLayer = 0;
14836 copy_region.dstSubresource.layerCount = 0;
14837 copy_region.dstOffset.x = 0;
14838 copy_region.dstOffset.y = 0;
14839 copy_region.dstOffset.z = 0;
14840 copy_region.extent.width = 64;
14841 copy_region.extent.height = 64;
14842 copy_region.extent.depth = 1;
14843 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
14844 &copy_region);
14845 EndCommandBuffer();
14846
14847 m_errorMonitor->VerifyFound();
14848}
14849
Karl Schultz6addd812016-02-02 17:17:23 -070014850TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060014851 VkResult err;
14852 bool pass;
14853
14854 // Create color images with different format sizes and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14856 "vkCmdCopyImage called with unmatched source and dest image format sizes");
Karl Schultzbdb75952016-04-19 11:36:49 -060014857
14858 ASSERT_NO_FATAL_FAILURE(InitState());
14859
14860 // Create two images of different types and try to copy between them
14861 VkImage srcImage;
14862 VkImage dstImage;
14863 VkDeviceMemory srcMem;
14864 VkDeviceMemory destMem;
14865 VkMemoryRequirements memReqs;
14866
14867 VkImageCreateInfo image_create_info = {};
14868 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14869 image_create_info.pNext = NULL;
14870 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14871 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14872 image_create_info.extent.width = 32;
14873 image_create_info.extent.height = 32;
14874 image_create_info.extent.depth = 1;
14875 image_create_info.mipLevels = 1;
14876 image_create_info.arrayLayers = 1;
14877 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14878 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14879 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14880 image_create_info.flags = 0;
14881
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014882 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060014883 ASSERT_VK_SUCCESS(err);
14884
14885 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14886 // Introduce failure by creating second image with a different-sized format.
14887 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
14888
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014889 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060014890 ASSERT_VK_SUCCESS(err);
14891
14892 // Allocate memory
14893 VkMemoryAllocateInfo memAlloc = {};
14894 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14895 memAlloc.pNext = NULL;
14896 memAlloc.allocationSize = 0;
14897 memAlloc.memoryTypeIndex = 0;
14898
14899 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
14900 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014901 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060014902 ASSERT_TRUE(pass);
14903 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
14904 ASSERT_VK_SUCCESS(err);
14905
14906 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
14907 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014908 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060014909 ASSERT_TRUE(pass);
14910 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
14911 ASSERT_VK_SUCCESS(err);
14912
14913 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14914 ASSERT_VK_SUCCESS(err);
14915 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
14916 ASSERT_VK_SUCCESS(err);
14917
14918 BeginCommandBuffer();
14919 VkImageCopy copyRegion;
14920 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14921 copyRegion.srcSubresource.mipLevel = 0;
14922 copyRegion.srcSubresource.baseArrayLayer = 0;
14923 copyRegion.srcSubresource.layerCount = 0;
14924 copyRegion.srcOffset.x = 0;
14925 copyRegion.srcOffset.y = 0;
14926 copyRegion.srcOffset.z = 0;
14927 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14928 copyRegion.dstSubresource.mipLevel = 0;
14929 copyRegion.dstSubresource.baseArrayLayer = 0;
14930 copyRegion.dstSubresource.layerCount = 0;
14931 copyRegion.dstOffset.x = 0;
14932 copyRegion.dstOffset.y = 0;
14933 copyRegion.dstOffset.z = 0;
14934 copyRegion.extent.width = 1;
14935 copyRegion.extent.height = 1;
14936 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014937 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Karl Schultzbdb75952016-04-19 11:36:49 -060014938 EndCommandBuffer();
14939
14940 m_errorMonitor->VerifyFound();
14941
14942 vkDestroyImage(m_device->device(), srcImage, NULL);
14943 vkDestroyImage(m_device->device(), dstImage, NULL);
14944 vkFreeMemory(m_device->device(), srcMem, NULL);
14945 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014946}
14947
Karl Schultz6addd812016-02-02 17:17:23 -070014948TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
14949 VkResult err;
14950 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014951
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014952 // Create a color image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14954 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014955
Mike Stroyana3082432015-09-25 13:39:21 -060014956 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014957
14958 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014959 VkImage srcImage;
14960 VkImage dstImage;
14961 VkDeviceMemory srcMem;
14962 VkDeviceMemory destMem;
14963 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014964
14965 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014966 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14967 image_create_info.pNext = NULL;
14968 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14969 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14970 image_create_info.extent.width = 32;
14971 image_create_info.extent.height = 32;
14972 image_create_info.extent.depth = 1;
14973 image_create_info.mipLevels = 1;
14974 image_create_info.arrayLayers = 1;
14975 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14976 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14977 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14978 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014979
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014980 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014981 ASSERT_VK_SUCCESS(err);
14982
Karl Schultzbdb75952016-04-19 11:36:49 -060014983 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14984
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014985 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070014986 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014987 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060014988 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014989
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014990 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014991 ASSERT_VK_SUCCESS(err);
14992
14993 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014994 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014995 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14996 memAlloc.pNext = NULL;
14997 memAlloc.allocationSize = 0;
14998 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014999
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015000 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015001 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015002 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015003 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015004 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015005 ASSERT_VK_SUCCESS(err);
15006
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015007 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015008 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015009 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015010 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015011 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015012 ASSERT_VK_SUCCESS(err);
15013
15014 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15015 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015016 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015017 ASSERT_VK_SUCCESS(err);
15018
15019 BeginCommandBuffer();
15020 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015021 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015022 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015023 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015024 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015025 copyRegion.srcOffset.x = 0;
15026 copyRegion.srcOffset.y = 0;
15027 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015028 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015029 copyRegion.dstSubresource.mipLevel = 0;
15030 copyRegion.dstSubresource.baseArrayLayer = 0;
15031 copyRegion.dstSubresource.layerCount = 0;
15032 copyRegion.dstOffset.x = 0;
15033 copyRegion.dstOffset.y = 0;
15034 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015035 copyRegion.extent.width = 1;
15036 copyRegion.extent.height = 1;
15037 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015038 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015039 EndCommandBuffer();
15040
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015041 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015042
Chia-I Wuf7458c52015-10-26 21:10:41 +080015043 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015044 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015045 vkFreeMemory(m_device->device(), srcMem, NULL);
15046 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015047}
15048
Karl Schultz6addd812016-02-02 17:17:23 -070015049TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
15050 VkResult err;
15051 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015052
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15054 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015055
Mike Stroyana3082432015-09-25 13:39:21 -060015056 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015057
15058 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015059 VkImage srcImage;
15060 VkImage dstImage;
15061 VkDeviceMemory srcMem;
15062 VkDeviceMemory destMem;
15063 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015064
15065 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015066 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15067 image_create_info.pNext = NULL;
15068 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15069 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15070 image_create_info.extent.width = 32;
15071 image_create_info.extent.height = 1;
15072 image_create_info.extent.depth = 1;
15073 image_create_info.mipLevels = 1;
15074 image_create_info.arrayLayers = 1;
15075 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15076 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15077 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15078 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015079
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015080 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015081 ASSERT_VK_SUCCESS(err);
15082
Karl Schultz6addd812016-02-02 17:17:23 -070015083 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015084
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015085 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015086 ASSERT_VK_SUCCESS(err);
15087
15088 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015089 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015090 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15091 memAlloc.pNext = NULL;
15092 memAlloc.allocationSize = 0;
15093 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015094
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015095 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015096 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015097 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015098 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015099 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015100 ASSERT_VK_SUCCESS(err);
15101
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015102 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015103 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015104 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015105 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015106 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015107 ASSERT_VK_SUCCESS(err);
15108
15109 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15110 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015111 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015112 ASSERT_VK_SUCCESS(err);
15113
15114 BeginCommandBuffer();
15115 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015116 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15117 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015118 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015119 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015120 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015121 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015122 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015123 resolveRegion.srcOffset.x = 0;
15124 resolveRegion.srcOffset.y = 0;
15125 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015126 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015127 resolveRegion.dstSubresource.mipLevel = 0;
15128 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015129 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015130 resolveRegion.dstOffset.x = 0;
15131 resolveRegion.dstOffset.y = 0;
15132 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015133 resolveRegion.extent.width = 1;
15134 resolveRegion.extent.height = 1;
15135 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015136 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015137 EndCommandBuffer();
15138
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015139 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015140
Chia-I Wuf7458c52015-10-26 21:10:41 +080015141 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015142 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015143 vkFreeMemory(m_device->device(), srcMem, NULL);
15144 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015145}
15146
Karl Schultz6addd812016-02-02 17:17:23 -070015147TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
15148 VkResult err;
15149 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015150
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15152 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015153
Mike Stroyana3082432015-09-25 13:39:21 -060015154 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015155
Chris Forbesa7530692016-05-08 12:35:39 +120015156 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015157 VkImage srcImage;
15158 VkImage dstImage;
15159 VkDeviceMemory srcMem;
15160 VkDeviceMemory destMem;
15161 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015162
15163 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015164 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15165 image_create_info.pNext = NULL;
15166 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15167 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15168 image_create_info.extent.width = 32;
15169 image_create_info.extent.height = 1;
15170 image_create_info.extent.depth = 1;
15171 image_create_info.mipLevels = 1;
15172 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120015173 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015174 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15175 // Note: Some implementations expect color attachment usage for any
15176 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015177 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015178 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015179
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015180 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015181 ASSERT_VK_SUCCESS(err);
15182
Karl Schultz6addd812016-02-02 17:17:23 -070015183 // Note: Some implementations expect color attachment usage for any
15184 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015185 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015186
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015187 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015188 ASSERT_VK_SUCCESS(err);
15189
15190 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015191 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015192 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15193 memAlloc.pNext = NULL;
15194 memAlloc.allocationSize = 0;
15195 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015196
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015197 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015198 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015199 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015200 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015201 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015202 ASSERT_VK_SUCCESS(err);
15203
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015204 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015205 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015206 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015207 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015208 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015209 ASSERT_VK_SUCCESS(err);
15210
15211 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15212 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015213 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015214 ASSERT_VK_SUCCESS(err);
15215
15216 BeginCommandBuffer();
15217 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015218 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15219 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015220 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015221 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015222 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015223 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015224 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015225 resolveRegion.srcOffset.x = 0;
15226 resolveRegion.srcOffset.y = 0;
15227 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015228 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015229 resolveRegion.dstSubresource.mipLevel = 0;
15230 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015231 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015232 resolveRegion.dstOffset.x = 0;
15233 resolveRegion.dstOffset.y = 0;
15234 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015235 resolveRegion.extent.width = 1;
15236 resolveRegion.extent.height = 1;
15237 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015238 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015239 EndCommandBuffer();
15240
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015241 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015242
Chia-I Wuf7458c52015-10-26 21:10:41 +080015243 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015244 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015245 vkFreeMemory(m_device->device(), srcMem, NULL);
15246 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015247}
15248
Karl Schultz6addd812016-02-02 17:17:23 -070015249TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
15250 VkResult err;
15251 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015252
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15254 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015255
Mike Stroyana3082432015-09-25 13:39:21 -060015256 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015257
15258 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015259 VkImage srcImage;
15260 VkImage dstImage;
15261 VkDeviceMemory srcMem;
15262 VkDeviceMemory destMem;
15263 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015264
15265 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015266 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15267 image_create_info.pNext = NULL;
15268 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15269 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15270 image_create_info.extent.width = 32;
15271 image_create_info.extent.height = 1;
15272 image_create_info.extent.depth = 1;
15273 image_create_info.mipLevels = 1;
15274 image_create_info.arrayLayers = 1;
15275 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15276 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15277 // Note: Some implementations expect color attachment usage for any
15278 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015279 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015280 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015281
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015282 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015283 ASSERT_VK_SUCCESS(err);
15284
Karl Schultz6addd812016-02-02 17:17:23 -070015285 // Set format to something other than source image
15286 image_create_info.format = VK_FORMAT_R32_SFLOAT;
15287 // Note: Some implementations expect color attachment usage for any
15288 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015289 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015290 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015291
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015292 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015293 ASSERT_VK_SUCCESS(err);
15294
15295 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015296 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015297 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15298 memAlloc.pNext = NULL;
15299 memAlloc.allocationSize = 0;
15300 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015301
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015302 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015303 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015304 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015305 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015306 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015307 ASSERT_VK_SUCCESS(err);
15308
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015309 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015310 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015311 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015312 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015313 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015314 ASSERT_VK_SUCCESS(err);
15315
15316 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15317 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015318 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015319 ASSERT_VK_SUCCESS(err);
15320
15321 BeginCommandBuffer();
15322 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015323 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15324 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015325 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015326 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015327 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015328 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015329 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015330 resolveRegion.srcOffset.x = 0;
15331 resolveRegion.srcOffset.y = 0;
15332 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015333 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015334 resolveRegion.dstSubresource.mipLevel = 0;
15335 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015336 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015337 resolveRegion.dstOffset.x = 0;
15338 resolveRegion.dstOffset.y = 0;
15339 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015340 resolveRegion.extent.width = 1;
15341 resolveRegion.extent.height = 1;
15342 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015343 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015344 EndCommandBuffer();
15345
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015346 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015347
Chia-I Wuf7458c52015-10-26 21:10:41 +080015348 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015349 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015350 vkFreeMemory(m_device->device(), srcMem, NULL);
15351 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015352}
15353
Karl Schultz6addd812016-02-02 17:17:23 -070015354TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
15355 VkResult err;
15356 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015357
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15359 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015360
Mike Stroyana3082432015-09-25 13:39:21 -060015361 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015362
15363 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015364 VkImage srcImage;
15365 VkImage dstImage;
15366 VkDeviceMemory srcMem;
15367 VkDeviceMemory destMem;
15368 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015369
15370 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015371 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15372 image_create_info.pNext = NULL;
15373 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15374 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15375 image_create_info.extent.width = 32;
15376 image_create_info.extent.height = 1;
15377 image_create_info.extent.depth = 1;
15378 image_create_info.mipLevels = 1;
15379 image_create_info.arrayLayers = 1;
15380 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15381 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15382 // Note: Some implementations expect color attachment usage for any
15383 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015384 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015385 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015386
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015387 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015388 ASSERT_VK_SUCCESS(err);
15389
Karl Schultz6addd812016-02-02 17:17:23 -070015390 image_create_info.imageType = VK_IMAGE_TYPE_1D;
15391 // Note: Some implementations expect color attachment usage for any
15392 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015393 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015394 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015395
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015396 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015397 ASSERT_VK_SUCCESS(err);
15398
15399 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015400 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015401 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15402 memAlloc.pNext = NULL;
15403 memAlloc.allocationSize = 0;
15404 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015405
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015406 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015407 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015408 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015409 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015410 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015411 ASSERT_VK_SUCCESS(err);
15412
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015413 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015414 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015415 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015416 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015417 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015418 ASSERT_VK_SUCCESS(err);
15419
15420 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15421 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015422 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015423 ASSERT_VK_SUCCESS(err);
15424
15425 BeginCommandBuffer();
15426 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015427 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15428 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015429 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015430 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015431 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015432 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015433 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015434 resolveRegion.srcOffset.x = 0;
15435 resolveRegion.srcOffset.y = 0;
15436 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015437 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015438 resolveRegion.dstSubresource.mipLevel = 0;
15439 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015440 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015441 resolveRegion.dstOffset.x = 0;
15442 resolveRegion.dstOffset.y = 0;
15443 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015444 resolveRegion.extent.width = 1;
15445 resolveRegion.extent.height = 1;
15446 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015447 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015448 EndCommandBuffer();
15449
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015450 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015451
Chia-I Wuf7458c52015-10-26 21:10:41 +080015452 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015453 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015454 vkFreeMemory(m_device->device(), srcMem, NULL);
15455 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015456}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015457
Karl Schultz6addd812016-02-02 17:17:23 -070015458TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015459 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070015460 // to using a DS format, then cause it to hit error due to COLOR_BIT not
15461 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015462 // The image format check comes 2nd in validation so we trigger it first,
15463 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070015464 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015465
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15467 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015468
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015469 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015470
Chia-I Wu1b99bb22015-10-27 19:25:11 +080015471 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015472 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15473 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015474
15475 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015476 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
15477 ds_pool_ci.pNext = NULL;
15478 ds_pool_ci.maxSets = 1;
15479 ds_pool_ci.poolSizeCount = 1;
15480 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015481
15482 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015483 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015484 ASSERT_VK_SUCCESS(err);
15485
15486 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015487 dsl_binding.binding = 0;
15488 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15489 dsl_binding.descriptorCount = 1;
15490 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
15491 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015492
15493 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015494 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
15495 ds_layout_ci.pNext = NULL;
15496 ds_layout_ci.bindingCount = 1;
15497 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015498 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015499 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015500 ASSERT_VK_SUCCESS(err);
15501
15502 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015503 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080015504 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070015505 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015506 alloc_info.descriptorPool = ds_pool;
15507 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015508 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015509 ASSERT_VK_SUCCESS(err);
15510
Karl Schultz6addd812016-02-02 17:17:23 -070015511 VkImage image_bad;
15512 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015513 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060015514 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015515 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070015516 const int32_t tex_width = 32;
15517 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015518
15519 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015520 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15521 image_create_info.pNext = NULL;
15522 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15523 image_create_info.format = tex_format_bad;
15524 image_create_info.extent.width = tex_width;
15525 image_create_info.extent.height = tex_height;
15526 image_create_info.extent.depth = 1;
15527 image_create_info.mipLevels = 1;
15528 image_create_info.arrayLayers = 1;
15529 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15530 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015531 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015532 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015533
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015534 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015535 ASSERT_VK_SUCCESS(err);
15536 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015537 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15538 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015539 ASSERT_VK_SUCCESS(err);
15540
15541 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015542 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015543 image_view_create_info.image = image_bad;
15544 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15545 image_view_create_info.format = tex_format_bad;
15546 image_view_create_info.subresourceRange.baseArrayLayer = 0;
15547 image_view_create_info.subresourceRange.baseMipLevel = 0;
15548 image_view_create_info.subresourceRange.layerCount = 1;
15549 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015550 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015551
15552 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015553 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015554
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015555 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015556
Chia-I Wuf7458c52015-10-26 21:10:41 +080015557 vkDestroyImage(m_device->device(), image_bad, NULL);
15558 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015559 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
15560 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015561}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015562
15563TEST_F(VkLayerTest, ClearImageErrors) {
15564 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
15565 "ClearDepthStencilImage with a color image.");
15566
15567 ASSERT_NO_FATAL_FAILURE(InitState());
15568 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15569
15570 // Renderpass is started here so end it as Clear cmds can't be in renderpass
15571 BeginCommandBuffer();
15572 m_commandBuffer->EndRenderPass();
15573
15574 // Color image
15575 VkClearColorValue clear_color;
15576 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
15577 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
15578 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
15579 const int32_t img_width = 32;
15580 const int32_t img_height = 32;
15581 VkImageCreateInfo image_create_info = {};
15582 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15583 image_create_info.pNext = NULL;
15584 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15585 image_create_info.format = color_format;
15586 image_create_info.extent.width = img_width;
15587 image_create_info.extent.height = img_height;
15588 image_create_info.extent.depth = 1;
15589 image_create_info.mipLevels = 1;
15590 image_create_info.arrayLayers = 1;
15591 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15592 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15593 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15594
15595 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015596 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015597
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015598 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015599
15600 // Depth/Stencil image
15601 VkClearDepthStencilValue clear_value = {0};
15602 reqs = 0; // don't need HOST_VISIBLE DS image
15603 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
15604 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
15605 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
15606 ds_image_create_info.extent.width = 64;
15607 ds_image_create_info.extent.height = 64;
15608 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15609 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
15610
15611 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015612 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015613
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015614 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015615
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015617
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015618 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015619 &color_range);
15620
15621 m_errorMonitor->VerifyFound();
15622
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with "
15624 "image created without "
15625 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060015626
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015627 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060015628 &color_range);
15629
15630 m_errorMonitor->VerifyFound();
15631
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015632 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15634 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015635
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015636 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(),
15637 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015638
15639 m_errorMonitor->VerifyFound();
15640}
Tobin Ehliscde08892015-09-22 10:11:37 -060015641#endif // IMAGE_TESTS
15642
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060015643
15644// WSI Enabled Tests
15645//
Chris Forbes09368e42016-10-13 11:59:22 +130015646#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060015647TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
15648
15649#if defined(VK_USE_PLATFORM_XCB_KHR)
15650 VkSurfaceKHR surface = VK_NULL_HANDLE;
15651
15652 VkResult err;
15653 bool pass;
15654 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
15655 VkSwapchainCreateInfoKHR swapchain_create_info = {};
15656 // uint32_t swapchain_image_count = 0;
15657 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
15658 // uint32_t image_index = 0;
15659 // VkPresentInfoKHR present_info = {};
15660
15661 ASSERT_NO_FATAL_FAILURE(InitState());
15662
15663 // Use the create function from one of the VK_KHR_*_surface extension in
15664 // order to create a surface, testing all known errors in the process,
15665 // before successfully creating a surface:
15666 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
15667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
15668 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
15669 pass = (err != VK_SUCCESS);
15670 ASSERT_TRUE(pass);
15671 m_errorMonitor->VerifyFound();
15672
15673 // Next, try to create a surface with the wrong
15674 // VkXcbSurfaceCreateInfoKHR::sType:
15675 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
15676 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
15677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
15678 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
15679 pass = (err != VK_SUCCESS);
15680 ASSERT_TRUE(pass);
15681 m_errorMonitor->VerifyFound();
15682
15683 // Create a native window, and then correctly create a surface:
15684 xcb_connection_t *connection;
15685 xcb_screen_t *screen;
15686 xcb_window_t xcb_window;
15687 xcb_intern_atom_reply_t *atom_wm_delete_window;
15688
15689 const xcb_setup_t *setup;
15690 xcb_screen_iterator_t iter;
15691 int scr;
15692 uint32_t value_mask, value_list[32];
15693 int width = 1;
15694 int height = 1;
15695
15696 connection = xcb_connect(NULL, &scr);
15697 ASSERT_TRUE(connection != NULL);
15698 setup = xcb_get_setup(connection);
15699 iter = xcb_setup_roots_iterator(setup);
15700 while (scr-- > 0)
15701 xcb_screen_next(&iter);
15702 screen = iter.data;
15703
15704 xcb_window = xcb_generate_id(connection);
15705
15706 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
15707 value_list[0] = screen->black_pixel;
15708 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
15709
15710 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
15711 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
15712
15713 /* Magic code that will send notification when window is destroyed */
15714 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
15715 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
15716
15717 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
15718 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
15719 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
15720 free(reply);
15721
15722 xcb_map_window(connection, xcb_window);
15723
15724 // Force the x/y coordinates to 100,100 results are identical in consecutive
15725 // runs
15726 const uint32_t coords[] = { 100, 100 };
15727 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
15728
15729 // Finally, try to correctly create a surface:
15730 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
15731 xcb_create_info.pNext = NULL;
15732 xcb_create_info.flags = 0;
15733 xcb_create_info.connection = connection;
15734 xcb_create_info.window = xcb_window;
15735 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
15736 pass = (err == VK_SUCCESS);
15737 ASSERT_TRUE(pass);
15738
15739 // Check if surface supports presentation:
15740
15741 // 1st, do so without having queried the queue families:
15742 VkBool32 supported = false;
15743 // TODO: Get the following error to come out:
15744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15745 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
15746 "function");
15747 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
15748 pass = (err != VK_SUCCESS);
15749 // ASSERT_TRUE(pass);
15750 // m_errorMonitor->VerifyFound();
15751
15752 // Next, query a queue family index that's too large:
15753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
15754 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
15755 pass = (err != VK_SUCCESS);
15756 ASSERT_TRUE(pass);
15757 m_errorMonitor->VerifyFound();
15758
15759 // Finally, do so correctly:
15760 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
15761 // SUPPORTED
15762 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
15763 pass = (err == VK_SUCCESS);
15764 ASSERT_TRUE(pass);
15765
15766 // Before proceeding, try to create a swapchain without having called
15767 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
15768 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
15769 swapchain_create_info.pNext = NULL;
15770 swapchain_create_info.flags = 0;
15771 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15772 swapchain_create_info.surface = surface;
15773 swapchain_create_info.imageArrayLayers = 1;
15774 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
15775 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
15776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15777 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
15778 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15779 pass = (err != VK_SUCCESS);
15780 ASSERT_TRUE(pass);
15781 m_errorMonitor->VerifyFound();
15782
15783 // Get the surface capabilities:
15784 VkSurfaceCapabilitiesKHR surface_capabilities;
15785
15786 // Do so correctly (only error logged by this entrypoint is if the
15787 // extension isn't enabled):
15788 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
15789 pass = (err == VK_SUCCESS);
15790 ASSERT_TRUE(pass);
15791
15792 // Get the surface formats:
15793 uint32_t surface_format_count;
15794
15795 // First, try without a pointer to surface_format_count:
15796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
15797 "specified as NULL");
15798 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
15799 pass = (err == VK_SUCCESS);
15800 ASSERT_TRUE(pass);
15801 m_errorMonitor->VerifyFound();
15802
15803 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
15804 // correctly done a 1st try (to get the count):
15805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
15806 surface_format_count = 0;
15807 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
15808 pass = (err == VK_SUCCESS);
15809 ASSERT_TRUE(pass);
15810 m_errorMonitor->VerifyFound();
15811
15812 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
15813 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
15814 pass = (err == VK_SUCCESS);
15815 ASSERT_TRUE(pass);
15816
15817 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
15818 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
15819
15820 // Next, do a 2nd try with surface_format_count being set too high:
15821 surface_format_count += 5;
15822 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
15823 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
15824 pass = (err == VK_SUCCESS);
15825 ASSERT_TRUE(pass);
15826 m_errorMonitor->VerifyFound();
15827
15828 // Finally, do a correct 1st and 2nd try:
15829 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
15830 pass = (err == VK_SUCCESS);
15831 ASSERT_TRUE(pass);
15832 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
15833 pass = (err == VK_SUCCESS);
15834 ASSERT_TRUE(pass);
15835
15836 // Get the surface present modes:
15837 uint32_t surface_present_mode_count;
15838
15839 // First, try without a pointer to surface_format_count:
15840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
15841 "specified as NULL");
15842
15843 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
15844 pass = (err == VK_SUCCESS);
15845 ASSERT_TRUE(pass);
15846 m_errorMonitor->VerifyFound();
15847
15848 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
15849 // correctly done a 1st try (to get the count):
15850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
15851 surface_present_mode_count = 0;
15852 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
15853 (VkPresentModeKHR *)&surface_present_mode_count);
15854 pass = (err == VK_SUCCESS);
15855 ASSERT_TRUE(pass);
15856 m_errorMonitor->VerifyFound();
15857
15858 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
15859 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
15860 pass = (err == VK_SUCCESS);
15861 ASSERT_TRUE(pass);
15862
15863 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
15864 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
15865
15866 // Next, do a 2nd try with surface_format_count being set too high:
15867 surface_present_mode_count += 5;
15868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
15869 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
15870 pass = (err == VK_SUCCESS);
15871 ASSERT_TRUE(pass);
15872 m_errorMonitor->VerifyFound();
15873
15874 // Finally, do a correct 1st and 2nd try:
15875 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
15876 pass = (err == VK_SUCCESS);
15877 ASSERT_TRUE(pass);
15878 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
15879 pass = (err == VK_SUCCESS);
15880 ASSERT_TRUE(pass);
15881
15882 // Create a swapchain:
15883
15884 // First, try without a pointer to swapchain_create_info:
15885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
15886 "specified as NULL");
15887
15888 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
15889 pass = (err != VK_SUCCESS);
15890 ASSERT_TRUE(pass);
15891 m_errorMonitor->VerifyFound();
15892
15893 // Next, call with a non-NULL swapchain_create_info, that has the wrong
15894 // sType:
15895 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
15896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
15897
15898 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15899 pass = (err != VK_SUCCESS);
15900 ASSERT_TRUE(pass);
15901 m_errorMonitor->VerifyFound();
15902
15903 // Next, call with a NULL swapchain pointer:
15904 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
15905 swapchain_create_info.pNext = NULL;
15906 swapchain_create_info.flags = 0;
15907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
15908 "specified as NULL");
15909
15910 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
15911 pass = (err != VK_SUCCESS);
15912 ASSERT_TRUE(pass);
15913 m_errorMonitor->VerifyFound();
15914
15915 // TODO: Enhance swapchain layer so that
15916 // swapchain_create_info.queueFamilyIndexCount is checked against something?
15917
15918 // Next, call with a queue family index that's too large:
15919 uint32_t queueFamilyIndex[2] = { 100000, 0 };
15920 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
15921 swapchain_create_info.queueFamilyIndexCount = 2;
15922 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
15923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
15924 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15925 pass = (err != VK_SUCCESS);
15926 ASSERT_TRUE(pass);
15927 m_errorMonitor->VerifyFound();
15928
15929 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
15930 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
15931 swapchain_create_info.queueFamilyIndexCount = 1;
15932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15933 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
15934 "pCreateInfo->pQueueFamilyIndices).");
15935 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15936 pass = (err != VK_SUCCESS);
15937 ASSERT_TRUE(pass);
15938 m_errorMonitor->VerifyFound();
15939
15940 // Next, call with an invalid imageSharingMode:
15941 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
15942 swapchain_create_info.queueFamilyIndexCount = 1;
15943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15944 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
15945 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15946 pass = (err != VK_SUCCESS);
15947 ASSERT_TRUE(pass);
15948 m_errorMonitor->VerifyFound();
15949 // Fix for the future:
15950 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
15951 // SUPPORTED
15952 swapchain_create_info.queueFamilyIndexCount = 0;
15953 queueFamilyIndex[0] = 0;
15954 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
15955
15956 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
15957 // Get the images from a swapchain:
15958 // Acquire an image from a swapchain:
15959 // Present an image to a swapchain:
15960 // Destroy the swapchain:
15961
15962 // TODOs:
15963 //
15964 // - Try destroying the device without first destroying the swapchain
15965 //
15966 // - Try destroying the device without first destroying the surface
15967 //
15968 // - Try destroying the surface without first destroying the swapchain
15969
15970 // Destroy the surface:
15971 vkDestroySurfaceKHR(instance(), surface, NULL);
15972
15973 // Tear down the window:
15974 xcb_destroy_window(connection, xcb_window);
15975 xcb_disconnect(connection);
15976
15977#else // VK_USE_PLATFORM_XCB_KHR
15978 return;
15979#endif // VK_USE_PLATFORM_XCB_KHR
15980}
Chris Forbes09368e42016-10-13 11:59:22 +130015981#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060015982
15983//
15984// POSITIVE VALIDATION TESTS
15985//
15986// These tests do not expect to encounter ANY validation errors pass only if this is true
15987
Tobin Ehlise0006882016-11-03 10:14:28 -060015988TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
15989 TEST_DESCRIPTION("Perform an image layout transition in a secondary command buffer followed "
15990 "by a transition in the primary.");
15991 VkResult err;
15992 m_errorMonitor->ExpectSuccess();
15993 ASSERT_NO_FATAL_FAILURE(InitState());
15994 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15995 // Allocate a secondary and primary cmd buffer
15996 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
15997 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
15998 command_buffer_allocate_info.commandPool = m_commandPool;
15999 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
16000 command_buffer_allocate_info.commandBufferCount = 1;
16001
16002 VkCommandBuffer secondary_command_buffer;
16003 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
16004 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
16005 VkCommandBuffer primary_command_buffer;
16006 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
16007 VkCommandBufferBeginInfo command_buffer_begin_info = {};
16008 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
16009 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
16010 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
16011 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
16012 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
16013
16014 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
16015 ASSERT_VK_SUCCESS(err);
16016 VkImageObj image(m_device);
16017 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
16018 ASSERT_TRUE(image.initialized());
16019 VkImageMemoryBarrier img_barrier = {};
16020 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16021 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16022 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16023 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16024 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16025 img_barrier.image = image.handle();
16026 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16027 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16028 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16029 img_barrier.subresourceRange.baseArrayLayer = 0;
16030 img_barrier.subresourceRange.baseMipLevel = 0;
16031 img_barrier.subresourceRange.layerCount = 1;
16032 img_barrier.subresourceRange.levelCount = 1;
16033 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
16034 0, nullptr, 1, &img_barrier);
16035 err = vkEndCommandBuffer(secondary_command_buffer);
16036 ASSERT_VK_SUCCESS(err);
16037
16038 // Now update primary cmd buffer to execute secondary and transitions image
16039 command_buffer_begin_info.pInheritanceInfo = nullptr;
16040 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
16041 ASSERT_VK_SUCCESS(err);
16042 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
16043 VkImageMemoryBarrier img_barrier2 = {};
16044 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16045 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16046 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16047 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16048 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16049 img_barrier2.image = image.handle();
16050 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16051 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16052 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16053 img_barrier2.subresourceRange.baseArrayLayer = 0;
16054 img_barrier2.subresourceRange.baseMipLevel = 0;
16055 img_barrier2.subresourceRange.layerCount = 1;
16056 img_barrier2.subresourceRange.levelCount = 1;
16057 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
16058 nullptr, 1, &img_barrier2);
16059 err = vkEndCommandBuffer(primary_command_buffer);
16060 ASSERT_VK_SUCCESS(err);
16061 VkSubmitInfo submit_info = {};
16062 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
16063 submit_info.commandBufferCount = 1;
16064 submit_info.pCommandBuffers = &primary_command_buffer;
16065 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
16066 ASSERT_VK_SUCCESS(err);
16067 m_errorMonitor->VerifyNotFound();
16068 err = vkDeviceWaitIdle(m_device->device());
16069 ASSERT_VK_SUCCESS(err);
16070 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &secondary_command_buffer);
16071 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &primary_command_buffer);
16072}
16073
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016074// This is a positive test. No failures are expected.
16075TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
16076 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSets validation code "
16077 "is ignoring VkWriteDescriptorSet members that are not "
16078 "related to the descriptor type specified by "
16079 "VkWriteDescriptorSet::descriptorType. Correct "
16080 "validation behavior will result in the test running to "
16081 "completion without validation errors.");
16082
16083 const uintptr_t invalid_ptr = 0xcdcdcdcd;
16084
16085 ASSERT_NO_FATAL_FAILURE(InitState());
16086
16087 // Image Case
16088 {
16089 m_errorMonitor->ExpectSuccess();
16090
16091 VkImage image;
16092 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16093 const int32_t tex_width = 32;
16094 const int32_t tex_height = 32;
16095 VkImageCreateInfo image_create_info = {};
16096 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16097 image_create_info.pNext = NULL;
16098 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16099 image_create_info.format = tex_format;
16100 image_create_info.extent.width = tex_width;
16101 image_create_info.extent.height = tex_height;
16102 image_create_info.extent.depth = 1;
16103 image_create_info.mipLevels = 1;
16104 image_create_info.arrayLayers = 1;
16105 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16106 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16107 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16108 image_create_info.flags = 0;
16109 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16110 ASSERT_VK_SUCCESS(err);
16111
16112 VkMemoryRequirements memory_reqs;
16113 VkDeviceMemory image_memory;
16114 bool pass;
16115 VkMemoryAllocateInfo memory_info = {};
16116 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16117 memory_info.pNext = NULL;
16118 memory_info.allocationSize = 0;
16119 memory_info.memoryTypeIndex = 0;
16120 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
16121 memory_info.allocationSize = memory_reqs.size;
16122 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16123 ASSERT_TRUE(pass);
16124 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
16125 ASSERT_VK_SUCCESS(err);
16126 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
16127 ASSERT_VK_SUCCESS(err);
16128
16129 VkImageViewCreateInfo image_view_create_info = {};
16130 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16131 image_view_create_info.image = image;
16132 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16133 image_view_create_info.format = tex_format;
16134 image_view_create_info.subresourceRange.layerCount = 1;
16135 image_view_create_info.subresourceRange.baseMipLevel = 0;
16136 image_view_create_info.subresourceRange.levelCount = 1;
16137 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16138
16139 VkImageView view;
16140 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
16141 ASSERT_VK_SUCCESS(err);
16142
16143 VkDescriptorPoolSize ds_type_count = {};
16144 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16145 ds_type_count.descriptorCount = 1;
16146
16147 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16148 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16149 ds_pool_ci.pNext = NULL;
16150 ds_pool_ci.maxSets = 1;
16151 ds_pool_ci.poolSizeCount = 1;
16152 ds_pool_ci.pPoolSizes = &ds_type_count;
16153
16154 VkDescriptorPool ds_pool;
16155 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16156 ASSERT_VK_SUCCESS(err);
16157
16158 VkDescriptorSetLayoutBinding dsl_binding = {};
16159 dsl_binding.binding = 0;
16160 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16161 dsl_binding.descriptorCount = 1;
16162 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16163 dsl_binding.pImmutableSamplers = NULL;
16164
16165 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16166 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16167 ds_layout_ci.pNext = NULL;
16168 ds_layout_ci.bindingCount = 1;
16169 ds_layout_ci.pBindings = &dsl_binding;
16170 VkDescriptorSetLayout ds_layout;
16171 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16172 ASSERT_VK_SUCCESS(err);
16173
16174 VkDescriptorSet descriptor_set;
16175 VkDescriptorSetAllocateInfo alloc_info = {};
16176 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16177 alloc_info.descriptorSetCount = 1;
16178 alloc_info.descriptorPool = ds_pool;
16179 alloc_info.pSetLayouts = &ds_layout;
16180 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16181 ASSERT_VK_SUCCESS(err);
16182
16183 VkDescriptorImageInfo image_info = {};
16184 image_info.imageView = view;
16185 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
16186
16187 VkWriteDescriptorSet descriptor_write;
16188 memset(&descriptor_write, 0, sizeof(descriptor_write));
16189 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16190 descriptor_write.dstSet = descriptor_set;
16191 descriptor_write.dstBinding = 0;
16192 descriptor_write.descriptorCount = 1;
16193 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16194 descriptor_write.pImageInfo = &image_info;
16195
16196 // Set pBufferInfo and pTexelBufferView to invalid values, which should
16197 // be
16198 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
16199 // This will most likely produce a crash if the parameter_validation
16200 // layer
16201 // does not correctly ignore pBufferInfo.
16202 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
16203 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
16204
16205 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16206
16207 m_errorMonitor->VerifyNotFound();
16208
16209 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16210 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16211 vkDestroyImageView(m_device->device(), view, NULL);
16212 vkDestroyImage(m_device->device(), image, NULL);
16213 vkFreeMemory(m_device->device(), image_memory, NULL);
16214 }
16215
16216 // Buffer Case
16217 {
16218 m_errorMonitor->ExpectSuccess();
16219
16220 VkBuffer buffer;
16221 uint32_t queue_family_index = 0;
16222 VkBufferCreateInfo buffer_create_info = {};
16223 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16224 buffer_create_info.size = 1024;
16225 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16226 buffer_create_info.queueFamilyIndexCount = 1;
16227 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
16228
16229 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
16230 ASSERT_VK_SUCCESS(err);
16231
16232 VkMemoryRequirements memory_reqs;
16233 VkDeviceMemory buffer_memory;
16234 bool pass;
16235 VkMemoryAllocateInfo memory_info = {};
16236 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16237 memory_info.pNext = NULL;
16238 memory_info.allocationSize = 0;
16239 memory_info.memoryTypeIndex = 0;
16240
16241 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
16242 memory_info.allocationSize = memory_reqs.size;
16243 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16244 ASSERT_TRUE(pass);
16245
16246 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
16247 ASSERT_VK_SUCCESS(err);
16248 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
16249 ASSERT_VK_SUCCESS(err);
16250
16251 VkDescriptorPoolSize ds_type_count = {};
16252 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16253 ds_type_count.descriptorCount = 1;
16254
16255 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16256 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16257 ds_pool_ci.pNext = NULL;
16258 ds_pool_ci.maxSets = 1;
16259 ds_pool_ci.poolSizeCount = 1;
16260 ds_pool_ci.pPoolSizes = &ds_type_count;
16261
16262 VkDescriptorPool ds_pool;
16263 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16264 ASSERT_VK_SUCCESS(err);
16265
16266 VkDescriptorSetLayoutBinding dsl_binding = {};
16267 dsl_binding.binding = 0;
16268 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16269 dsl_binding.descriptorCount = 1;
16270 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16271 dsl_binding.pImmutableSamplers = NULL;
16272
16273 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16274 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16275 ds_layout_ci.pNext = NULL;
16276 ds_layout_ci.bindingCount = 1;
16277 ds_layout_ci.pBindings = &dsl_binding;
16278 VkDescriptorSetLayout ds_layout;
16279 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16280 ASSERT_VK_SUCCESS(err);
16281
16282 VkDescriptorSet descriptor_set;
16283 VkDescriptorSetAllocateInfo alloc_info = {};
16284 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16285 alloc_info.descriptorSetCount = 1;
16286 alloc_info.descriptorPool = ds_pool;
16287 alloc_info.pSetLayouts = &ds_layout;
16288 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16289 ASSERT_VK_SUCCESS(err);
16290
16291 VkDescriptorBufferInfo buffer_info = {};
16292 buffer_info.buffer = buffer;
16293 buffer_info.offset = 0;
16294 buffer_info.range = 1024;
16295
16296 VkWriteDescriptorSet descriptor_write;
16297 memset(&descriptor_write, 0, sizeof(descriptor_write));
16298 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16299 descriptor_write.dstSet = descriptor_set;
16300 descriptor_write.dstBinding = 0;
16301 descriptor_write.descriptorCount = 1;
16302 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16303 descriptor_write.pBufferInfo = &buffer_info;
16304
16305 // Set pImageInfo and pTexelBufferView to invalid values, which should
16306 // be
16307 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
16308 // This will most likely produce a crash if the parameter_validation
16309 // layer
16310 // does not correctly ignore pImageInfo.
16311 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
16312 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
16313
16314 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16315
16316 m_errorMonitor->VerifyNotFound();
16317
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016318 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16319 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16320 vkDestroyBuffer(m_device->device(), buffer, NULL);
16321 vkFreeMemory(m_device->device(), buffer_memory, NULL);
16322 }
16323
16324 // Texel Buffer Case
16325 {
16326 m_errorMonitor->ExpectSuccess();
16327
16328 VkBuffer buffer;
16329 uint32_t queue_family_index = 0;
16330 VkBufferCreateInfo buffer_create_info = {};
16331 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16332 buffer_create_info.size = 1024;
16333 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
16334 buffer_create_info.queueFamilyIndexCount = 1;
16335 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
16336
16337 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
16338 ASSERT_VK_SUCCESS(err);
16339
16340 VkMemoryRequirements memory_reqs;
16341 VkDeviceMemory buffer_memory;
16342 bool pass;
16343 VkMemoryAllocateInfo memory_info = {};
16344 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16345 memory_info.pNext = NULL;
16346 memory_info.allocationSize = 0;
16347 memory_info.memoryTypeIndex = 0;
16348
16349 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
16350 memory_info.allocationSize = memory_reqs.size;
16351 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16352 ASSERT_TRUE(pass);
16353
16354 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
16355 ASSERT_VK_SUCCESS(err);
16356 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
16357 ASSERT_VK_SUCCESS(err);
16358
16359 VkBufferViewCreateInfo buff_view_ci = {};
16360 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
16361 buff_view_ci.buffer = buffer;
16362 buff_view_ci.format = VK_FORMAT_R8_UNORM;
16363 buff_view_ci.range = VK_WHOLE_SIZE;
16364 VkBufferView buffer_view;
16365 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
16366
16367 VkDescriptorPoolSize ds_type_count = {};
16368 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16369 ds_type_count.descriptorCount = 1;
16370
16371 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16372 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16373 ds_pool_ci.pNext = NULL;
16374 ds_pool_ci.maxSets = 1;
16375 ds_pool_ci.poolSizeCount = 1;
16376 ds_pool_ci.pPoolSizes = &ds_type_count;
16377
16378 VkDescriptorPool ds_pool;
16379 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16380 ASSERT_VK_SUCCESS(err);
16381
16382 VkDescriptorSetLayoutBinding dsl_binding = {};
16383 dsl_binding.binding = 0;
16384 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16385 dsl_binding.descriptorCount = 1;
16386 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16387 dsl_binding.pImmutableSamplers = NULL;
16388
16389 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16390 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16391 ds_layout_ci.pNext = NULL;
16392 ds_layout_ci.bindingCount = 1;
16393 ds_layout_ci.pBindings = &dsl_binding;
16394 VkDescriptorSetLayout ds_layout;
16395 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16396 ASSERT_VK_SUCCESS(err);
16397
16398 VkDescriptorSet descriptor_set;
16399 VkDescriptorSetAllocateInfo alloc_info = {};
16400 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16401 alloc_info.descriptorSetCount = 1;
16402 alloc_info.descriptorPool = ds_pool;
16403 alloc_info.pSetLayouts = &ds_layout;
16404 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16405 ASSERT_VK_SUCCESS(err);
16406
16407 VkWriteDescriptorSet descriptor_write;
16408 memset(&descriptor_write, 0, sizeof(descriptor_write));
16409 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16410 descriptor_write.dstSet = descriptor_set;
16411 descriptor_write.dstBinding = 0;
16412 descriptor_write.descriptorCount = 1;
16413 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16414 descriptor_write.pTexelBufferView = &buffer_view;
16415
16416 // Set pImageInfo and pBufferInfo to invalid values, which should be
16417 // ignored for descriptorType ==
16418 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
16419 // This will most likely produce a crash if the parameter_validation
16420 // layer
16421 // does not correctly ignore pImageInfo and pBufferInfo.
16422 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
16423 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
16424
16425 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16426
16427 m_errorMonitor->VerifyNotFound();
16428
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016429 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16430 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16431 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
16432 vkDestroyBuffer(m_device->device(), buffer, NULL);
16433 vkFreeMemory(m_device->device(), buffer_memory, NULL);
16434 }
16435}
16436
Tobin Ehlisf7428442016-10-25 07:58:24 -060016437TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
16438 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
16439
16440 ASSERT_NO_FATAL_FAILURE(InitState());
16441 // Create layout where two binding #s are "1"
16442 static const uint32_t NUM_BINDINGS = 3;
16443 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
16444 dsl_binding[0].binding = 1;
16445 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16446 dsl_binding[0].descriptorCount = 1;
16447 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16448 dsl_binding[0].pImmutableSamplers = NULL;
16449 dsl_binding[1].binding = 0;
16450 dsl_binding[1].descriptorCount = 1;
16451 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16452 dsl_binding[1].descriptorCount = 1;
16453 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16454 dsl_binding[1].pImmutableSamplers = NULL;
16455 dsl_binding[2].binding = 1; // Duplicate binding should cause error
16456 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16457 dsl_binding[2].descriptorCount = 1;
16458 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16459 dsl_binding[2].pImmutableSamplers = NULL;
16460
16461 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16462 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16463 ds_layout_ci.pNext = NULL;
16464 ds_layout_ci.bindingCount = NUM_BINDINGS;
16465 ds_layout_ci.pBindings = dsl_binding;
16466 VkDescriptorSetLayout ds_layout;
16467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
16468 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16469 m_errorMonitor->VerifyFound();
16470}
16471
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060016472TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016473 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
16474
16475 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016476
16477 BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016478
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060016479 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
16480
16481 {
16482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
16483 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
16484 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16485 m_errorMonitor->VerifyFound();
16486 }
16487
16488 {
16489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
16490 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
16491 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16492 m_errorMonitor->VerifyFound();
16493 }
16494
16495 {
16496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
16497 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
16498 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16499 m_errorMonitor->VerifyFound();
16500 }
16501
16502 {
16503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
16504 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
16505 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16506 m_errorMonitor->VerifyFound();
16507 }
16508
16509 {
16510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
16511 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
16512 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16513 m_errorMonitor->VerifyFound();
16514 }
16515
16516 {
16517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
16518 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
16519 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16520 m_errorMonitor->VerifyFound();
16521 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016522
16523 {
16524 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
16525 VkRect2D scissor = {{-1, 0}, {16, 16}};
16526 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16527 m_errorMonitor->VerifyFound();
16528 }
16529
16530 {
16531 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
16532 VkRect2D scissor = {{0, -2}, {16, 16}};
16533 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16534 m_errorMonitor->VerifyFound();
16535 }
16536
16537 {
16538 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
16539 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
16540 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16541 m_errorMonitor->VerifyFound();
16542 }
16543
16544 {
16545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
16546 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
16547 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16548 m_errorMonitor->VerifyFound();
16549 }
16550
16551 EndCommandBuffer();
16552}
16553
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016554// This is a positive test. No failures are expected.
16555TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
16556 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
16557 VkResult err;
16558
16559 ASSERT_NO_FATAL_FAILURE(InitState());
16560 m_errorMonitor->ExpectSuccess();
16561 VkDescriptorPoolSize ds_type_count = {};
16562 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16563 ds_type_count.descriptorCount = 2;
16564
16565 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16566 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16567 ds_pool_ci.pNext = NULL;
16568 ds_pool_ci.maxSets = 1;
16569 ds_pool_ci.poolSizeCount = 1;
16570 ds_pool_ci.pPoolSizes = &ds_type_count;
16571
16572 VkDescriptorPool ds_pool;
16573 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16574 ASSERT_VK_SUCCESS(err);
16575
16576 // Create layout with two uniform buffer descriptors w/ empty binding between them
16577 static const uint32_t NUM_BINDINGS = 3;
16578 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
16579 dsl_binding[0].binding = 0;
16580 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16581 dsl_binding[0].descriptorCount = 1;
16582 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
16583 dsl_binding[0].pImmutableSamplers = NULL;
16584 dsl_binding[1].binding = 1;
16585 dsl_binding[1].descriptorCount = 0; // empty binding
16586 dsl_binding[2].binding = 2;
16587 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16588 dsl_binding[2].descriptorCount = 1;
16589 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
16590 dsl_binding[2].pImmutableSamplers = NULL;
16591
16592 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16593 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16594 ds_layout_ci.pNext = NULL;
16595 ds_layout_ci.bindingCount = NUM_BINDINGS;
16596 ds_layout_ci.pBindings = dsl_binding;
16597 VkDescriptorSetLayout ds_layout;
16598 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16599 ASSERT_VK_SUCCESS(err);
16600
16601 VkDescriptorSet descriptor_set = {};
16602 VkDescriptorSetAllocateInfo alloc_info = {};
16603 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16604 alloc_info.descriptorSetCount = 1;
16605 alloc_info.descriptorPool = ds_pool;
16606 alloc_info.pSetLayouts = &ds_layout;
16607 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16608 ASSERT_VK_SUCCESS(err);
16609
16610 // Create a buffer to be used for update
16611 VkBufferCreateInfo buff_ci = {};
16612 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16613 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16614 buff_ci.size = 256;
16615 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16616 VkBuffer buffer;
16617 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
16618 ASSERT_VK_SUCCESS(err);
16619 // Have to bind memory to buffer before descriptor update
16620 VkMemoryAllocateInfo mem_alloc = {};
16621 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16622 mem_alloc.pNext = NULL;
16623 mem_alloc.allocationSize = 512; // one allocation for both buffers
16624 mem_alloc.memoryTypeIndex = 0;
16625
16626 VkMemoryRequirements mem_reqs;
16627 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
16628 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
16629 if (!pass) {
16630 vkDestroyBuffer(m_device->device(), buffer, NULL);
16631 return;
16632 }
16633
16634 VkDeviceMemory mem;
16635 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
16636 ASSERT_VK_SUCCESS(err);
16637 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
16638 ASSERT_VK_SUCCESS(err);
16639
16640 // Only update the descriptor at binding 2
16641 VkDescriptorBufferInfo buff_info = {};
16642 buff_info.buffer = buffer;
16643 buff_info.offset = 0;
16644 buff_info.range = VK_WHOLE_SIZE;
16645 VkWriteDescriptorSet descriptor_write = {};
16646 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16647 descriptor_write.dstBinding = 2;
16648 descriptor_write.descriptorCount = 1;
16649 descriptor_write.pTexelBufferView = nullptr;
16650 descriptor_write.pBufferInfo = &buff_info;
16651 descriptor_write.pImageInfo = nullptr;
16652 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16653 descriptor_write.dstSet = descriptor_set;
16654
16655 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16656
16657 m_errorMonitor->VerifyNotFound();
16658 // Cleanup
16659 vkFreeMemory(m_device->device(), mem, NULL);
16660 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16661 vkDestroyBuffer(m_device->device(), buffer, NULL);
16662 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16663}
16664
16665// This is a positive test. No failures are expected.
16666TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
16667 VkResult err;
16668 bool pass;
16669
16670 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
16671 "the buffer, create an image, and bind the same memory to "
16672 "it");
16673
16674 m_errorMonitor->ExpectSuccess();
16675
16676 ASSERT_NO_FATAL_FAILURE(InitState());
16677
16678 VkBuffer buffer;
16679 VkImage image;
16680 VkDeviceMemory mem;
16681 VkMemoryRequirements mem_reqs;
16682
16683 VkBufferCreateInfo buf_info = {};
16684 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16685 buf_info.pNext = NULL;
16686 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16687 buf_info.size = 256;
16688 buf_info.queueFamilyIndexCount = 0;
16689 buf_info.pQueueFamilyIndices = NULL;
16690 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16691 buf_info.flags = 0;
16692 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
16693 ASSERT_VK_SUCCESS(err);
16694
16695 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
16696
16697 VkMemoryAllocateInfo alloc_info = {};
16698 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16699 alloc_info.pNext = NULL;
16700 alloc_info.memoryTypeIndex = 0;
16701
16702 // Ensure memory is big enough for both bindings
16703 alloc_info.allocationSize = 0x10000;
16704
16705 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
16706 if (!pass) {
16707 vkDestroyBuffer(m_device->device(), buffer, NULL);
16708 return;
16709 }
16710
16711 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
16712 ASSERT_VK_SUCCESS(err);
16713
16714 uint8_t *pData;
16715 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
16716 ASSERT_VK_SUCCESS(err);
16717
16718 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
16719
16720 vkUnmapMemory(m_device->device(), mem);
16721
16722 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
16723 ASSERT_VK_SUCCESS(err);
16724
16725 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
16726 // memory. In fact, it was never used by the GPU.
16727 // Just be be sure, wait for idle.
16728 vkDestroyBuffer(m_device->device(), buffer, NULL);
16729 vkDeviceWaitIdle(m_device->device());
16730
16731 VkImageCreateInfo image_create_info = {};
16732 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16733 image_create_info.pNext = NULL;
16734 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16735 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
16736 image_create_info.extent.width = 64;
16737 image_create_info.extent.height = 64;
16738 image_create_info.extent.depth = 1;
16739 image_create_info.mipLevels = 1;
16740 image_create_info.arrayLayers = 1;
16741 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16742 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16743 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
16744 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16745 image_create_info.queueFamilyIndexCount = 0;
16746 image_create_info.pQueueFamilyIndices = NULL;
16747 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16748 image_create_info.flags = 0;
16749
16750 VkMemoryAllocateInfo mem_alloc = {};
16751 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16752 mem_alloc.pNext = NULL;
16753 mem_alloc.allocationSize = 0;
16754 mem_alloc.memoryTypeIndex = 0;
16755
16756 /* Create a mappable image. It will be the texture if linear images are ok
16757 * to be textures or it will be the staging image if they are not.
16758 */
16759 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16760 ASSERT_VK_SUCCESS(err);
16761
16762 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
16763
16764 mem_alloc.allocationSize = mem_reqs.size;
16765
16766 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
16767 if (!pass) {
16768 vkDestroyImage(m_device->device(), image, NULL);
16769 return;
16770 }
16771
16772 // VALIDATION FAILURE:
16773 err = vkBindImageMemory(m_device->device(), image, mem, 0);
16774 ASSERT_VK_SUCCESS(err);
16775
16776 m_errorMonitor->VerifyNotFound();
16777
16778 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016779 vkDestroyImage(m_device->device(), image, NULL);
16780}
16781
Tobin Ehlis953e8392016-11-17 10:54:13 -070016782TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
16783 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
16784 // We previously had a bug where dynamic offset of inactive bindings was still being used
16785 VkResult err;
16786 m_errorMonitor->ExpectSuccess();
16787
16788 ASSERT_NO_FATAL_FAILURE(InitState());
16789 ASSERT_NO_FATAL_FAILURE(InitViewport());
16790 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16791
16792 VkDescriptorPoolSize ds_type_count = {};
16793 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16794 ds_type_count.descriptorCount = 3;
16795
16796 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16797 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16798 ds_pool_ci.pNext = NULL;
16799 ds_pool_ci.maxSets = 1;
16800 ds_pool_ci.poolSizeCount = 1;
16801 ds_pool_ci.pPoolSizes = &ds_type_count;
16802
16803 VkDescriptorPool ds_pool;
16804 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16805 ASSERT_VK_SUCCESS(err);
16806
16807 const uint32_t BINDING_COUNT = 3;
16808 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070016809 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070016810 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16811 dsl_binding[0].descriptorCount = 1;
16812 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16813 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070016814 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070016815 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16816 dsl_binding[1].descriptorCount = 1;
16817 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16818 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070016819 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070016820 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16821 dsl_binding[2].descriptorCount = 1;
16822 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16823 dsl_binding[2].pImmutableSamplers = NULL;
16824
16825 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16826 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16827 ds_layout_ci.pNext = NULL;
16828 ds_layout_ci.bindingCount = BINDING_COUNT;
16829 ds_layout_ci.pBindings = dsl_binding;
16830 VkDescriptorSetLayout ds_layout;
16831 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16832 ASSERT_VK_SUCCESS(err);
16833
16834 VkDescriptorSet descriptor_set;
16835 VkDescriptorSetAllocateInfo alloc_info = {};
16836 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16837 alloc_info.descriptorSetCount = 1;
16838 alloc_info.descriptorPool = ds_pool;
16839 alloc_info.pSetLayouts = &ds_layout;
16840 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16841 ASSERT_VK_SUCCESS(err);
16842
16843 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
16844 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
16845 pipeline_layout_ci.pNext = NULL;
16846 pipeline_layout_ci.setLayoutCount = 1;
16847 pipeline_layout_ci.pSetLayouts = &ds_layout;
16848
16849 VkPipelineLayout pipeline_layout;
16850 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
16851 ASSERT_VK_SUCCESS(err);
16852
16853 // Create two buffers to update the descriptors with
16854 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
16855 uint32_t qfi = 0;
16856 VkBufferCreateInfo buffCI = {};
16857 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16858 buffCI.size = 2048;
16859 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16860 buffCI.queueFamilyIndexCount = 1;
16861 buffCI.pQueueFamilyIndices = &qfi;
16862
16863 VkBuffer dyub1;
16864 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
16865 ASSERT_VK_SUCCESS(err);
16866 // buffer2
16867 buffCI.size = 1024;
16868 VkBuffer dyub2;
16869 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
16870 ASSERT_VK_SUCCESS(err);
16871 // Allocate memory and bind to buffers
16872 VkMemoryAllocateInfo mem_alloc[2] = {};
16873 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16874 mem_alloc[0].pNext = NULL;
16875 mem_alloc[0].memoryTypeIndex = 0;
16876 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16877 mem_alloc[1].pNext = NULL;
16878 mem_alloc[1].memoryTypeIndex = 0;
16879
16880 VkMemoryRequirements mem_reqs1;
16881 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
16882 VkMemoryRequirements mem_reqs2;
16883 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
16884 mem_alloc[0].allocationSize = mem_reqs1.size;
16885 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
16886 mem_alloc[1].allocationSize = mem_reqs2.size;
16887 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
16888 if (!pass) {
16889 vkDestroyBuffer(m_device->device(), dyub1, NULL);
16890 vkDestroyBuffer(m_device->device(), dyub2, NULL);
16891 return;
16892 }
16893
16894 VkDeviceMemory mem1;
16895 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
16896 ASSERT_VK_SUCCESS(err);
16897 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
16898 ASSERT_VK_SUCCESS(err);
16899 VkDeviceMemory mem2;
16900 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
16901 ASSERT_VK_SUCCESS(err);
16902 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
16903 ASSERT_VK_SUCCESS(err);
16904 // Update descriptors
16905 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
16906 buff_info[0].buffer = dyub1;
16907 buff_info[0].offset = 0;
16908 buff_info[0].range = 256;
16909 buff_info[1].buffer = dyub1;
16910 buff_info[1].offset = 256;
16911 buff_info[1].range = 512;
16912 buff_info[2].buffer = dyub2;
16913 buff_info[2].offset = 0;
16914 buff_info[2].range = 512;
16915
16916 VkWriteDescriptorSet descriptor_write;
16917 memset(&descriptor_write, 0, sizeof(descriptor_write));
16918 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16919 descriptor_write.dstSet = descriptor_set;
16920 descriptor_write.dstBinding = 0;
16921 descriptor_write.descriptorCount = BINDING_COUNT;
16922 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16923 descriptor_write.pBufferInfo = buff_info;
16924
16925 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16926
16927 BeginCommandBuffer();
16928
16929 // Create PSO to be used for draw-time errors below
16930 char const *vsSource = "#version 450\n"
16931 "\n"
16932 "out gl_PerVertex { \n"
16933 " vec4 gl_Position;\n"
16934 "};\n"
16935 "void main(){\n"
16936 " gl_Position = vec4(1);\n"
16937 "}\n";
16938 char const *fsSource = "#version 450\n"
16939 "\n"
16940 "layout(location=0) out vec4 x;\n"
16941 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
16942 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
16943 "void main(){\n"
16944 " x = vec4(bar1.y) + vec4(bar2.y);\n"
16945 "}\n";
16946 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16947 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16948 VkPipelineObj pipe(m_device);
16949 pipe.SetViewport(m_viewports);
16950 pipe.SetScissor(m_scissors);
16951 pipe.AddShader(&vs);
16952 pipe.AddShader(&fs);
16953 pipe.AddColorAttachment();
16954 pipe.CreateVKPipeline(pipeline_layout, renderPass());
16955
16956 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
16957 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
16958 // we used to have a bug in this case.
16959 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
16960 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
16961 &descriptor_set, BINDING_COUNT, dyn_off);
16962 Draw(1, 0, 0, 0);
16963 m_errorMonitor->VerifyNotFound();
16964
16965 vkDestroyBuffer(m_device->device(), dyub1, NULL);
16966 vkDestroyBuffer(m_device->device(), dyub2, NULL);
16967 vkFreeMemory(m_device->device(), mem1, NULL);
16968 vkFreeMemory(m_device->device(), mem2, NULL);
16969
16970 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
16971 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16972 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16973}
16974
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016975TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
16976
16977 TEST_DESCRIPTION("Ensure that validations handling of non-coherent memory "
16978 "mapping while using VK_WHOLE_SIZE does not cause access "
16979 "violations");
16980 VkResult err;
16981 uint8_t *pData;
16982 ASSERT_NO_FATAL_FAILURE(InitState());
16983
16984 VkDeviceMemory mem;
16985 VkMemoryRequirements mem_reqs;
16986 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070016987 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016988 VkMemoryAllocateInfo alloc_info = {};
16989 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16990 alloc_info.pNext = NULL;
16991 alloc_info.memoryTypeIndex = 0;
16992
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070016993 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016994 alloc_info.allocationSize = allocation_size;
16995
16996 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
16997 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
16998 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
16999 if (!pass) {
17000 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
17001 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
17002 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
17003 if (!pass) {
17004 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
17005 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
17006 VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
17007 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
17008 if (!pass) {
17009 return;
17010 }
17011 }
17012 }
17013
17014 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
17015 ASSERT_VK_SUCCESS(err);
17016
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017017 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017018 m_errorMonitor->ExpectSuccess();
17019 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
17020 ASSERT_VK_SUCCESS(err);
17021 VkMappedMemoryRange mmr = {};
17022 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17023 mmr.memory = mem;
17024 mmr.offset = 0;
17025 mmr.size = VK_WHOLE_SIZE;
17026 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17027 ASSERT_VK_SUCCESS(err);
17028 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17029 ASSERT_VK_SUCCESS(err);
17030 m_errorMonitor->VerifyNotFound();
17031 vkUnmapMemory(m_device->device(), mem);
17032
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017033 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017034 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017035 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017036 ASSERT_VK_SUCCESS(err);
17037 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17038 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017039 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017040 mmr.size = VK_WHOLE_SIZE;
17041 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17042 ASSERT_VK_SUCCESS(err);
17043 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17044 ASSERT_VK_SUCCESS(err);
17045 m_errorMonitor->VerifyNotFound();
17046 vkUnmapMemory(m_device->device(), mem);
17047
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017048 // Map with offset and size
17049 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017050 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017051 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017052 ASSERT_VK_SUCCESS(err);
17053 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17054 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017055 mmr.offset = 4 * atom_size;
17056 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017057 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17058 ASSERT_VK_SUCCESS(err);
17059 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17060 ASSERT_VK_SUCCESS(err);
17061 m_errorMonitor->VerifyNotFound();
17062 vkUnmapMemory(m_device->device(), mem);
17063
17064 // Map without offset and flush WHOLE_SIZE with two separate offsets
17065 m_errorMonitor->ExpectSuccess();
17066 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
17067 ASSERT_VK_SUCCESS(err);
17068 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17069 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017070 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017071 mmr.size = VK_WHOLE_SIZE;
17072 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17073 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017074 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017075 mmr.size = VK_WHOLE_SIZE;
17076 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17077 ASSERT_VK_SUCCESS(err);
17078 m_errorMonitor->VerifyNotFound();
17079 vkUnmapMemory(m_device->device(), mem);
17080
17081 vkFreeMemory(m_device->device(), mem, NULL);
17082}
17083
17084// This is a positive test. We used to expect error in this case but spec now allows it
17085TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
17086 m_errorMonitor->ExpectSuccess();
17087 vk_testing::Fence testFence;
17088 VkFenceCreateInfo fenceInfo = {};
17089 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
17090 fenceInfo.pNext = NULL;
17091
17092 ASSERT_NO_FATAL_FAILURE(InitState());
17093 testFence.init(*m_device, fenceInfo);
17094 VkFence fences[1] = { testFence.handle() };
17095 VkResult result = vkResetFences(m_device->device(), 1, fences);
17096 ASSERT_VK_SUCCESS(result);
17097
17098 m_errorMonitor->VerifyNotFound();
17099}
17100
17101TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
17102 m_errorMonitor->ExpectSuccess();
17103
17104 ASSERT_NO_FATAL_FAILURE(InitState());
17105 VkResult err;
17106
17107 // Record (empty!) command buffer that can be submitted multiple times
17108 // simultaneously.
17109 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
17110 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr };
17111 m_commandBuffer->BeginCommandBuffer(&cbbi);
17112 m_commandBuffer->EndCommandBuffer();
17113
17114 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
17115 VkFence fence;
17116 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
17117 ASSERT_VK_SUCCESS(err);
17118
17119 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
17120 VkSemaphore s1, s2;
17121 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
17122 ASSERT_VK_SUCCESS(err);
17123 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
17124 ASSERT_VK_SUCCESS(err);
17125
17126 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
17127 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1 };
17128 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
17129 ASSERT_VK_SUCCESS(err);
17130
17131 // Submit CB again, signaling s2.
17132 si.pSignalSemaphores = &s2;
17133 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
17134 ASSERT_VK_SUCCESS(err);
17135
17136 // Wait for fence.
17137 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
17138 ASSERT_VK_SUCCESS(err);
17139
17140 // CB is still in flight from second submission, but semaphore s1 is no
17141 // longer in flight. delete it.
17142 vkDestroySemaphore(m_device->device(), s1, nullptr);
17143
17144 m_errorMonitor->VerifyNotFound();
17145
17146 // Force device idle and clean up remaining objects
17147 vkDeviceWaitIdle(m_device->device());
17148 vkDestroySemaphore(m_device->device(), s2, nullptr);
17149 vkDestroyFence(m_device->device(), fence, nullptr);
17150}
17151
17152TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
17153 m_errorMonitor->ExpectSuccess();
17154
17155 ASSERT_NO_FATAL_FAILURE(InitState());
17156 VkResult err;
17157
17158 // A fence created signaled
17159 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
17160 VkFence f1;
17161 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
17162 ASSERT_VK_SUCCESS(err);
17163
17164 // A fence created not
17165 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
17166 VkFence f2;
17167 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
17168 ASSERT_VK_SUCCESS(err);
17169
17170 // Submit the unsignaled fence
17171 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr };
17172 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
17173
17174 // Wait on both fences, with signaled first.
17175 VkFence fences[] = { f1, f2 };
17176 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
17177
17178 // Should have both retired!
17179 vkDestroyFence(m_device->device(), f1, nullptr);
17180 vkDestroyFence(m_device->device(), f2, nullptr);
17181
17182 m_errorMonitor->VerifyNotFound();
17183}
17184
17185TEST_F(VkPositiveLayerTest, ValidUsage) {
17186 TEST_DESCRIPTION("Verify that creating an image view from an image with valid usage "
17187 "doesn't generate validation errors");
17188
17189 ASSERT_NO_FATAL_FAILURE(InitState());
17190
17191 m_errorMonitor->ExpectSuccess();
17192 // Verify that we can create a view with usage INPUT_ATTACHMENT
17193 VkImageObj image(m_device);
17194 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17195 ASSERT_TRUE(image.initialized());
17196 VkImageView imageView;
17197 VkImageViewCreateInfo ivci = {};
17198 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
17199 ivci.image = image.handle();
17200 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
17201 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
17202 ivci.subresourceRange.layerCount = 1;
17203 ivci.subresourceRange.baseMipLevel = 0;
17204 ivci.subresourceRange.levelCount = 1;
17205 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17206
17207 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
17208 m_errorMonitor->VerifyNotFound();
17209 vkDestroyImageView(m_device->device(), imageView, NULL);
17210}
17211
17212// This is a positive test. No failures are expected.
17213TEST_F(VkPositiveLayerTest, BindSparse) {
17214 TEST_DESCRIPTION("Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
17215 "and then free the memory");
17216
17217 ASSERT_NO_FATAL_FAILURE(InitState());
17218
17219 auto index = m_device->graphics_queue_node_index_;
17220 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT))
17221 return;
17222
17223 m_errorMonitor->ExpectSuccess();
17224
17225 VkImage image;
17226 VkImageCreateInfo image_create_info = {};
17227 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17228 image_create_info.pNext = NULL;
17229 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17230 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17231 image_create_info.extent.width = 64;
17232 image_create_info.extent.height = 64;
17233 image_create_info.extent.depth = 1;
17234 image_create_info.mipLevels = 1;
17235 image_create_info.arrayLayers = 1;
17236 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17237 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17238 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
17239 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
17240 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
17241 ASSERT_VK_SUCCESS(err);
17242
17243 VkMemoryRequirements memory_reqs;
17244 VkDeviceMemory memory_one, memory_two;
17245 bool pass;
17246 VkMemoryAllocateInfo memory_info = {};
17247 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17248 memory_info.pNext = NULL;
17249 memory_info.allocationSize = 0;
17250 memory_info.memoryTypeIndex = 0;
17251 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
17252 // Find an image big enough to allow sparse mapping of 2 memory regions
17253 // Increase the image size until it is at least twice the
17254 // size of the required alignment, to ensure we can bind both
17255 // allocated memory blocks to the image on aligned offsets.
17256 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
17257 vkDestroyImage(m_device->device(), image, nullptr);
17258 image_create_info.extent.width *= 2;
17259 image_create_info.extent.height *= 2;
17260 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
17261 ASSERT_VK_SUCCESS(err);
17262 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
17263 }
17264 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
17265 // at the end of the first
17266 memory_info.allocationSize = memory_reqs.alignment;
17267 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17268 ASSERT_TRUE(pass);
17269 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
17270 ASSERT_VK_SUCCESS(err);
17271 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
17272 ASSERT_VK_SUCCESS(err);
17273 VkSparseMemoryBind binds[2];
17274 binds[0].flags = 0;
17275 binds[0].memory = memory_one;
17276 binds[0].memoryOffset = 0;
17277 binds[0].resourceOffset = 0;
17278 binds[0].size = memory_info.allocationSize;
17279 binds[1].flags = 0;
17280 binds[1].memory = memory_two;
17281 binds[1].memoryOffset = 0;
17282 binds[1].resourceOffset = memory_info.allocationSize;
17283 binds[1].size = memory_info.allocationSize;
17284
17285 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
17286 opaqueBindInfo.image = image;
17287 opaqueBindInfo.bindCount = 2;
17288 opaqueBindInfo.pBinds = binds;
17289
17290 VkFence fence = VK_NULL_HANDLE;
17291 VkBindSparseInfo bindSparseInfo = {};
17292 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
17293 bindSparseInfo.imageOpaqueBindCount = 1;
17294 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
17295
17296 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
17297 vkQueueWaitIdle(m_device->m_queue);
17298 vkDestroyImage(m_device->device(), image, NULL);
17299 vkFreeMemory(m_device->device(), memory_one, NULL);
17300 vkFreeMemory(m_device->device(), memory_two, NULL);
17301 m_errorMonitor->VerifyNotFound();
17302}
17303
17304TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
17305 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
17306 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
17307 "the command buffer has prior knowledge of that "
17308 "attachment's layout.");
17309
17310 m_errorMonitor->ExpectSuccess();
17311
17312 ASSERT_NO_FATAL_FAILURE(InitState());
17313
17314 // A renderpass with one color attachment.
17315 VkAttachmentDescription attachment = { 0,
17316 VK_FORMAT_R8G8B8A8_UNORM,
17317 VK_SAMPLE_COUNT_1_BIT,
17318 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17319 VK_ATTACHMENT_STORE_OP_STORE,
17320 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17321 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17322 VK_IMAGE_LAYOUT_UNDEFINED,
17323 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17324
17325 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17326
17327 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17328
17329 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr };
17330
17331 VkRenderPass rp;
17332 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17333 ASSERT_VK_SUCCESS(err);
17334
17335 // A compatible framebuffer.
17336 VkImageObj image(m_device);
17337 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17338 ASSERT_TRUE(image.initialized());
17339
17340 VkImageViewCreateInfo ivci = {
17341 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17342 nullptr,
17343 0,
17344 image.handle(),
17345 VK_IMAGE_VIEW_TYPE_2D,
17346 VK_FORMAT_R8G8B8A8_UNORM,
17347 { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17348 VK_COMPONENT_SWIZZLE_IDENTITY },
17349 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
17350 };
17351 VkImageView view;
17352 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17353 ASSERT_VK_SUCCESS(err);
17354
17355 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17356 VkFramebuffer fb;
17357 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17358 ASSERT_VK_SUCCESS(err);
17359
17360 // Record a single command buffer which uses this renderpass twice. The
17361 // bug is triggered at the beginning of the second renderpass, when the
17362 // command buffer already has a layout recorded for the attachment.
17363 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17364 BeginCommandBuffer();
17365 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17366 vkCmdEndRenderPass(m_commandBuffer->handle());
17367 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17368
17369 m_errorMonitor->VerifyNotFound();
17370
17371 vkCmdEndRenderPass(m_commandBuffer->handle());
17372 EndCommandBuffer();
17373
17374 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17375 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17376 vkDestroyImageView(m_device->device(), view, nullptr);
17377}
17378
17379TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
17380 TEST_DESCRIPTION("This test should pass. Create a Framebuffer and "
17381 "command buffer, bind them together, then destroy "
17382 "command pool and framebuffer and verify there are no "
17383 "errors.");
17384
17385 m_errorMonitor->ExpectSuccess();
17386
17387 ASSERT_NO_FATAL_FAILURE(InitState());
17388
17389 // A renderpass with one color attachment.
17390 VkAttachmentDescription attachment = { 0,
17391 VK_FORMAT_R8G8B8A8_UNORM,
17392 VK_SAMPLE_COUNT_1_BIT,
17393 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17394 VK_ATTACHMENT_STORE_OP_STORE,
17395 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17396 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17397 VK_IMAGE_LAYOUT_UNDEFINED,
17398 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17399
17400 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17401
17402 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17403
17404 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr };
17405
17406 VkRenderPass rp;
17407 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17408 ASSERT_VK_SUCCESS(err);
17409
17410 // A compatible framebuffer.
17411 VkImageObj image(m_device);
17412 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17413 ASSERT_TRUE(image.initialized());
17414
17415 VkImageViewCreateInfo ivci = {
17416 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17417 nullptr,
17418 0,
17419 image.handle(),
17420 VK_IMAGE_VIEW_TYPE_2D,
17421 VK_FORMAT_R8G8B8A8_UNORM,
17422 { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17423 VK_COMPONENT_SWIZZLE_IDENTITY },
17424 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
17425 };
17426 VkImageView view;
17427 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17428 ASSERT_VK_SUCCESS(err);
17429
17430 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17431 VkFramebuffer fb;
17432 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17433 ASSERT_VK_SUCCESS(err);
17434
17435 // Explicitly create a command buffer to bind the FB to so that we can then
17436 // destroy the command pool in order to implicitly free command buffer
17437 VkCommandPool command_pool;
17438 VkCommandPoolCreateInfo pool_create_info{};
17439 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17440 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17441 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17442 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17443
17444 VkCommandBuffer command_buffer;
17445 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17446 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17447 command_buffer_allocate_info.commandPool = command_pool;
17448 command_buffer_allocate_info.commandBufferCount = 1;
17449 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17450 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
17451
17452 // Begin our cmd buffer with renderpass using our framebuffer
17453 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17454 VkCommandBufferBeginInfo begin_info{};
17455 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17456 vkBeginCommandBuffer(command_buffer, &begin_info);
17457
17458 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17459 vkCmdEndRenderPass(command_buffer);
17460 vkEndCommandBuffer(command_buffer);
17461 vkDestroyImageView(m_device->device(), view, nullptr);
17462 // Destroy command pool to implicitly free command buffer
17463 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
17464 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17465 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17466 m_errorMonitor->VerifyNotFound();
17467}
17468
17469TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
17470 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
17471 "transitions for the first subpass");
17472
17473 m_errorMonitor->ExpectSuccess();
17474
17475 ASSERT_NO_FATAL_FAILURE(InitState());
17476
17477 // A renderpass with one color attachment.
17478 VkAttachmentDescription attachment = { 0,
17479 VK_FORMAT_R8G8B8A8_UNORM,
17480 VK_SAMPLE_COUNT_1_BIT,
17481 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17482 VK_ATTACHMENT_STORE_OP_STORE,
17483 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17484 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17485 VK_IMAGE_LAYOUT_UNDEFINED,
17486 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17487
17488 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17489
17490 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17491
17492 VkSubpassDependency dep = { 0,
17493 0,
17494 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17495 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17496 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17497 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17498 VK_DEPENDENCY_BY_REGION_BIT };
17499
17500 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep };
17501
17502 VkResult err;
17503 VkRenderPass rp;
17504 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17505 ASSERT_VK_SUCCESS(err);
17506
17507 // A compatible framebuffer.
17508 VkImageObj image(m_device);
17509 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17510 ASSERT_TRUE(image.initialized());
17511
17512 VkImageViewCreateInfo ivci = {
17513 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17514 nullptr,
17515 0,
17516 image.handle(),
17517 VK_IMAGE_VIEW_TYPE_2D,
17518 VK_FORMAT_R8G8B8A8_UNORM,
17519 { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17520 VK_COMPONENT_SWIZZLE_IDENTITY },
17521 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
17522 };
17523 VkImageView view;
17524 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17525 ASSERT_VK_SUCCESS(err);
17526
17527 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17528 VkFramebuffer fb;
17529 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17530 ASSERT_VK_SUCCESS(err);
17531
17532 // Record a single command buffer which issues a pipeline barrier w/
17533 // image memory barrier for the attachment. This detects the previously
17534 // missing tracking of the subpass layout by throwing a validation error
17535 // if it doesn't occur.
17536 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17537 BeginCommandBuffer();
17538 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17539
17540 VkImageMemoryBarrier imb = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
17541 nullptr,
17542 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17543 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17544 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
17545 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
17546 VK_QUEUE_FAMILY_IGNORED,
17547 VK_QUEUE_FAMILY_IGNORED,
17548 image.handle(),
17549 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } };
17550 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17551 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
17552 &imb);
17553
17554 vkCmdEndRenderPass(m_commandBuffer->handle());
17555 m_errorMonitor->VerifyNotFound();
17556 EndCommandBuffer();
17557
17558 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17559 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17560 vkDestroyImageView(m_device->device(), view, nullptr);
17561}
17562
17563TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
17564 TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
17565 "is used as a depth/stencil framebuffer attachment, the "
17566 "aspectMask is ignored and both depth and stencil image "
17567 "subresources are used.");
17568
17569 VkFormatProperties format_properties;
17570 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
17571 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
17572 return;
17573 }
17574
17575 m_errorMonitor->ExpectSuccess();
17576
17577 ASSERT_NO_FATAL_FAILURE(InitState());
17578
17579 VkAttachmentDescription attachment = { 0,
17580 VK_FORMAT_D32_SFLOAT_S8_UINT,
17581 VK_SAMPLE_COUNT_1_BIT,
17582 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17583 VK_ATTACHMENT_STORE_OP_STORE,
17584 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17585 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17586 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
17587 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL };
17588
17589 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL };
17590
17591 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr };
17592
17593 VkSubpassDependency dep = { 0,
17594 0,
17595 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17596 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17597 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17598 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17599 VK_DEPENDENCY_BY_REGION_BIT};
17600
17601 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep };
17602
17603 VkResult err;
17604 VkRenderPass rp;
17605 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17606 ASSERT_VK_SUCCESS(err);
17607
17608 VkImageObj image(m_device);
17609 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
17610 0x26, // usage
17611 VK_IMAGE_TILING_OPTIMAL, 0);
17612 ASSERT_TRUE(image.initialized());
17613 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
17614
17615 VkImageViewCreateInfo ivci = {
17616 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17617 nullptr,
17618 0,
17619 image.handle(),
17620 VK_IMAGE_VIEW_TYPE_2D,
17621 VK_FORMAT_D32_SFLOAT_S8_UINT,
17622 { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A },
17623 { 0x2, 0, 1, 0, 1 },
17624 };
17625 VkImageView view;
17626 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17627 ASSERT_VK_SUCCESS(err);
17628
17629 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17630 VkFramebuffer fb;
17631 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17632 ASSERT_VK_SUCCESS(err);
17633
17634 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17635 BeginCommandBuffer();
17636 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17637
17638 VkImageMemoryBarrier imb = {};
17639 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17640 imb.pNext = nullptr;
17641 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
17642 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17643 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17644 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
17645 imb.srcQueueFamilyIndex = 0;
17646 imb.dstQueueFamilyIndex = 0;
17647 imb.image = image.handle();
17648 imb.subresourceRange.aspectMask = 0x6;
17649 imb.subresourceRange.baseMipLevel = 0;
17650 imb.subresourceRange.levelCount = 0x1;
17651 imb.subresourceRange.baseArrayLayer = 0;
17652 imb.subresourceRange.layerCount = 0x1;
17653
17654 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17655 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
17656 &imb);
17657
17658 vkCmdEndRenderPass(m_commandBuffer->handle());
17659 EndCommandBuffer();
17660 QueueCommandBuffer(false);
17661 m_errorMonitor->VerifyNotFound();
17662
17663 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17664 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17665 vkDestroyImageView(m_device->device(), view, nullptr);
17666}
17667
17668TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
17669 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
17670 "errors, when an attachment reference is "
17671 "VK_ATTACHMENT_UNUSED");
17672
17673 m_errorMonitor->ExpectSuccess();
17674
17675 ASSERT_NO_FATAL_FAILURE(InitState());
17676
17677 // A renderpass with no attachments
17678 VkAttachmentReference att_ref = { VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17679
17680 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17681
17682 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr };
17683
17684 VkRenderPass rp;
17685 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17686 ASSERT_VK_SUCCESS(err);
17687
17688 // A compatible framebuffer.
17689 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1 };
17690 VkFramebuffer fb;
17691 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17692 ASSERT_VK_SUCCESS(err);
17693
17694 // Record a command buffer which just begins and ends the renderpass. The
17695 // bug manifests in BeginRenderPass.
17696 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17697 BeginCommandBuffer();
17698 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17699 vkCmdEndRenderPass(m_commandBuffer->handle());
17700 m_errorMonitor->VerifyNotFound();
17701 EndCommandBuffer();
17702
17703 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17704 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17705}
17706
17707// This is a positive test. No errors are expected.
17708TEST_F(VkPositiveLayerTest, StencilLoadOp) {
17709 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
17710 "CLEAR. stencil[Load|Store]Op used to be ignored.");
17711 VkResult result = VK_SUCCESS;
17712 VkImageFormatProperties formatProps;
17713 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17714 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
17715 &formatProps);
17716 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
17717 return;
17718 }
17719
17720 ASSERT_NO_FATAL_FAILURE(InitState());
17721 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
17722 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
17723 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
17724 VkAttachmentDescription att = {};
17725 VkAttachmentReference ref = {};
17726 att.format = depth_stencil_fmt;
17727 att.samples = VK_SAMPLE_COUNT_1_BIT;
17728 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
17729 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
17730 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
17731 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
17732 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17733 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17734
17735 VkClearValue clear;
17736 clear.depthStencil.depth = 1.0;
17737 clear.depthStencil.stencil = 0;
17738 ref.attachment = 0;
17739 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17740
17741 VkSubpassDescription subpass = {};
17742 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
17743 subpass.flags = 0;
17744 subpass.inputAttachmentCount = 0;
17745 subpass.pInputAttachments = NULL;
17746 subpass.colorAttachmentCount = 0;
17747 subpass.pColorAttachments = NULL;
17748 subpass.pResolveAttachments = NULL;
17749 subpass.pDepthStencilAttachment = &ref;
17750 subpass.preserveAttachmentCount = 0;
17751 subpass.pPreserveAttachments = NULL;
17752
17753 VkRenderPass rp;
17754 VkRenderPassCreateInfo rp_info = {};
17755 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
17756 rp_info.attachmentCount = 1;
17757 rp_info.pAttachments = &att;
17758 rp_info.subpassCount = 1;
17759 rp_info.pSubpasses = &subpass;
17760 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
17761 ASSERT_VK_SUCCESS(result);
17762
17763 VkImageView *depthView = m_depthStencil->BindInfo();
17764 VkFramebufferCreateInfo fb_info = {};
17765 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
17766 fb_info.pNext = NULL;
17767 fb_info.renderPass = rp;
17768 fb_info.attachmentCount = 1;
17769 fb_info.pAttachments = depthView;
17770 fb_info.width = 100;
17771 fb_info.height = 100;
17772 fb_info.layers = 1;
17773 VkFramebuffer fb;
17774 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
17775 ASSERT_VK_SUCCESS(result);
17776
17777 VkRenderPassBeginInfo rpbinfo = {};
17778 rpbinfo.clearValueCount = 1;
17779 rpbinfo.pClearValues = &clear;
17780 rpbinfo.pNext = NULL;
17781 rpbinfo.renderPass = rp;
17782 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
17783 rpbinfo.renderArea.extent.width = 100;
17784 rpbinfo.renderArea.extent.height = 100;
17785 rpbinfo.renderArea.offset.x = 0;
17786 rpbinfo.renderArea.offset.y = 0;
17787 rpbinfo.framebuffer = fb;
17788
17789 VkFence fence = {};
17790 VkFenceCreateInfo fence_ci = {};
17791 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
17792 fence_ci.pNext = nullptr;
17793 fence_ci.flags = 0;
17794 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
17795 ASSERT_VK_SUCCESS(result);
17796
17797 m_commandBuffer->BeginCommandBuffer();
17798 m_commandBuffer->BeginRenderPass(rpbinfo);
17799 m_commandBuffer->EndRenderPass();
17800 m_commandBuffer->EndCommandBuffer();
17801 m_commandBuffer->QueueCommandBuffer(fence);
17802
17803 VkImageObj destImage(m_device);
17804 destImage.init(100, 100, depth_stencil_fmt, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17805 VK_IMAGE_TILING_OPTIMAL, 0);
17806 VkImageMemoryBarrier barrier = {};
17807 VkImageSubresourceRange range;
17808 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17809 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
17810 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
17811 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17812 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
17813 barrier.image = m_depthStencil->handle();
17814 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17815 range.baseMipLevel = 0;
17816 range.levelCount = 1;
17817 range.baseArrayLayer = 0;
17818 range.layerCount = 1;
17819 barrier.subresourceRange = range;
17820 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
17821 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
17822 cmdbuf.BeginCommandBuffer();
17823 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
17824 &barrier);
17825 barrier.srcAccessMask = 0;
17826 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17827 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
17828 barrier.image = destImage.handle();
17829 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
17830 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
17831 &barrier);
17832 VkImageCopy cregion;
17833 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17834 cregion.srcSubresource.mipLevel = 0;
17835 cregion.srcSubresource.baseArrayLayer = 0;
17836 cregion.srcSubresource.layerCount = 1;
17837 cregion.srcOffset.x = 0;
17838 cregion.srcOffset.y = 0;
17839 cregion.srcOffset.z = 0;
17840 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17841 cregion.dstSubresource.mipLevel = 0;
17842 cregion.dstSubresource.baseArrayLayer = 0;
17843 cregion.dstSubresource.layerCount = 1;
17844 cregion.dstOffset.x = 0;
17845 cregion.dstOffset.y = 0;
17846 cregion.dstOffset.z = 0;
17847 cregion.extent.width = 100;
17848 cregion.extent.height = 100;
17849 cregion.extent.depth = 1;
17850 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
17851 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
17852 cmdbuf.EndCommandBuffer();
17853
17854 VkSubmitInfo submit_info;
17855 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17856 submit_info.pNext = NULL;
17857 submit_info.waitSemaphoreCount = 0;
17858 submit_info.pWaitSemaphores = NULL;
17859 submit_info.pWaitDstStageMask = NULL;
17860 submit_info.commandBufferCount = 1;
17861 submit_info.pCommandBuffers = &cmdbuf.handle();
17862 submit_info.signalSemaphoreCount = 0;
17863 submit_info.pSignalSemaphores = NULL;
17864
17865 m_errorMonitor->ExpectSuccess();
17866 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
17867 m_errorMonitor->VerifyNotFound();
17868
17869 vkQueueWaitIdle(m_device->m_queue);
17870 vkDestroyFence(m_device->device(), fence, nullptr);
17871 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17872 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17873}
17874
17875// This is a positive test. No errors should be generated.
17876TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
17877 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
17878
17879 m_errorMonitor->ExpectSuccess();
17880 ASSERT_NO_FATAL_FAILURE(InitState());
17881
17882 VkEvent event;
17883 VkEventCreateInfo event_create_info{};
17884 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
17885 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
17886
17887 VkCommandPool command_pool;
17888 VkCommandPoolCreateInfo pool_create_info{};
17889 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17890 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17891 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17892 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17893
17894 VkCommandBuffer command_buffer;
17895 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17896 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17897 command_buffer_allocate_info.commandPool = command_pool;
17898 command_buffer_allocate_info.commandBufferCount = 1;
17899 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17900 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
17901
17902 VkQueue queue = VK_NULL_HANDLE;
17903 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
17904
17905 {
17906 VkCommandBufferBeginInfo begin_info{};
17907 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17908 vkBeginCommandBuffer(command_buffer, &begin_info);
17909
17910 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
17911 nullptr, 0, nullptr);
17912 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
17913 vkEndCommandBuffer(command_buffer);
17914 }
17915 {
17916 VkSubmitInfo submit_info{};
17917 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17918 submit_info.commandBufferCount = 1;
17919 submit_info.pCommandBuffers = &command_buffer;
17920 submit_info.signalSemaphoreCount = 0;
17921 submit_info.pSignalSemaphores = nullptr;
17922 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
17923 }
17924 { vkSetEvent(m_device->device(), event); }
17925
17926 vkQueueWaitIdle(queue);
17927
17928 vkDestroyEvent(m_device->device(), event, nullptr);
17929 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
17930 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
17931
17932 m_errorMonitor->VerifyNotFound();
17933}
17934// This is a positive test. No errors should be generated.
17935TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
17936 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
17937
17938 ASSERT_NO_FATAL_FAILURE(InitState());
17939 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
17940 return;
17941
17942 m_errorMonitor->ExpectSuccess();
17943
17944 VkQueryPool query_pool;
17945 VkQueryPoolCreateInfo query_pool_create_info{};
17946 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
17947 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
17948 query_pool_create_info.queryCount = 1;
17949 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
17950
17951 VkCommandPool command_pool;
17952 VkCommandPoolCreateInfo pool_create_info{};
17953 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17954 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17955 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17956 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17957
17958 VkCommandBuffer command_buffer;
17959 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17960 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17961 command_buffer_allocate_info.commandPool = command_pool;
17962 command_buffer_allocate_info.commandBufferCount = 1;
17963 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17964 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
17965
17966 VkCommandBuffer secondary_command_buffer;
17967 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
17968 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
17969
17970 VkQueue queue = VK_NULL_HANDLE;
17971 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
17972
17973 uint32_t qfi = 0;
17974 VkBufferCreateInfo buff_create_info = {};
17975 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17976 buff_create_info.size = 1024;
17977 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
17978 buff_create_info.queueFamilyIndexCount = 1;
17979 buff_create_info.pQueueFamilyIndices = &qfi;
17980
17981 VkResult err;
17982 VkBuffer buffer;
17983 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
17984 ASSERT_VK_SUCCESS(err);
17985 VkMemoryAllocateInfo mem_alloc = {};
17986 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17987 mem_alloc.pNext = NULL;
17988 mem_alloc.allocationSize = 1024;
17989 mem_alloc.memoryTypeIndex = 0;
17990
17991 VkMemoryRequirements memReqs;
17992 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
17993 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
17994 if (!pass) {
17995 vkDestroyBuffer(m_device->device(), buffer, NULL);
17996 return;
17997 }
17998
17999 VkDeviceMemory mem;
18000 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
18001 ASSERT_VK_SUCCESS(err);
18002 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
18003 ASSERT_VK_SUCCESS(err);
18004
18005 VkCommandBufferInheritanceInfo hinfo = {};
18006 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18007 hinfo.renderPass = VK_NULL_HANDLE;
18008 hinfo.subpass = 0;
18009 hinfo.framebuffer = VK_NULL_HANDLE;
18010 hinfo.occlusionQueryEnable = VK_FALSE;
18011 hinfo.queryFlags = 0;
18012 hinfo.pipelineStatistics = 0;
18013
18014 {
18015 VkCommandBufferBeginInfo begin_info{};
18016 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18017 begin_info.pInheritanceInfo = &hinfo;
18018 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
18019
18020 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
18021 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
18022
18023 vkEndCommandBuffer(secondary_command_buffer);
18024
18025 begin_info.pInheritanceInfo = nullptr;
18026 vkBeginCommandBuffer(command_buffer, &begin_info);
18027
18028 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
18029 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
18030
18031 vkEndCommandBuffer(command_buffer);
18032 }
18033 {
18034 VkSubmitInfo submit_info{};
18035 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18036 submit_info.commandBufferCount = 1;
18037 submit_info.pCommandBuffers = &command_buffer;
18038 submit_info.signalSemaphoreCount = 0;
18039 submit_info.pSignalSemaphores = nullptr;
18040 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18041 }
18042
18043 vkQueueWaitIdle(queue);
18044
18045 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
18046 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
18047 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
18048 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18049 vkDestroyBuffer(m_device->device(), buffer, NULL);
18050 vkFreeMemory(m_device->device(), mem, NULL);
18051
18052 m_errorMonitor->VerifyNotFound();
18053}
18054
18055// This is a positive test. No errors should be generated.
18056TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
18057 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
18058
18059 ASSERT_NO_FATAL_FAILURE(InitState());
18060 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18061 return;
18062
18063 m_errorMonitor->ExpectSuccess();
18064
18065 VkQueryPool query_pool;
18066 VkQueryPoolCreateInfo query_pool_create_info{};
18067 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
18068 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
18069 query_pool_create_info.queryCount = 1;
18070 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
18071
18072 VkCommandPool command_pool;
18073 VkCommandPoolCreateInfo pool_create_info{};
18074 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18075 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18076 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18077 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18078
18079 VkCommandBuffer command_buffer[2];
18080 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18081 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18082 command_buffer_allocate_info.commandPool = command_pool;
18083 command_buffer_allocate_info.commandBufferCount = 2;
18084 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18085 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18086
18087 VkQueue queue = VK_NULL_HANDLE;
18088 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18089
18090 uint32_t qfi = 0;
18091 VkBufferCreateInfo buff_create_info = {};
18092 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18093 buff_create_info.size = 1024;
18094 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
18095 buff_create_info.queueFamilyIndexCount = 1;
18096 buff_create_info.pQueueFamilyIndices = &qfi;
18097
18098 VkResult err;
18099 VkBuffer buffer;
18100 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
18101 ASSERT_VK_SUCCESS(err);
18102 VkMemoryAllocateInfo mem_alloc = {};
18103 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18104 mem_alloc.pNext = NULL;
18105 mem_alloc.allocationSize = 1024;
18106 mem_alloc.memoryTypeIndex = 0;
18107
18108 VkMemoryRequirements memReqs;
18109 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
18110 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
18111 if (!pass) {
18112 vkDestroyBuffer(m_device->device(), buffer, NULL);
18113 return;
18114 }
18115
18116 VkDeviceMemory mem;
18117 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
18118 ASSERT_VK_SUCCESS(err);
18119 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
18120 ASSERT_VK_SUCCESS(err);
18121
18122 {
18123 VkCommandBufferBeginInfo begin_info{};
18124 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18125 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18126
18127 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
18128 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
18129
18130 vkEndCommandBuffer(command_buffer[0]);
18131
18132 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18133
18134 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
18135
18136 vkEndCommandBuffer(command_buffer[1]);
18137 }
18138 {
18139 VkSubmitInfo submit_info{};
18140 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18141 submit_info.commandBufferCount = 2;
18142 submit_info.pCommandBuffers = command_buffer;
18143 submit_info.signalSemaphoreCount = 0;
18144 submit_info.pSignalSemaphores = nullptr;
18145 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18146 }
18147
18148 vkQueueWaitIdle(queue);
18149
18150 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
18151 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
18152 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18153 vkDestroyBuffer(m_device->device(), buffer, NULL);
18154 vkFreeMemory(m_device->device(), mem, NULL);
18155
18156 m_errorMonitor->VerifyNotFound();
18157}
18158
Tony Barbourc46924f2016-11-04 11:49:52 -060018159TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018160 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
18161
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018162 ASSERT_NO_FATAL_FAILURE(InitState());
18163 VkEvent event;
18164 VkEventCreateInfo event_create_info{};
18165 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
18166 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
18167
18168 VkCommandPool command_pool;
18169 VkCommandPoolCreateInfo pool_create_info{};
18170 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18171 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18172 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18173 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18174
18175 VkCommandBuffer command_buffer;
18176 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18177 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18178 command_buffer_allocate_info.commandPool = command_pool;
18179 command_buffer_allocate_info.commandBufferCount = 1;
18180 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18181 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
18182
18183 VkQueue queue = VK_NULL_HANDLE;
18184 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
18185
18186 {
18187 VkCommandBufferBeginInfo begin_info{};
18188 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18189 vkBeginCommandBuffer(command_buffer, &begin_info);
18190
18191 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018192 vkEndCommandBuffer(command_buffer);
18193 }
18194 {
18195 VkSubmitInfo submit_info{};
18196 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18197 submit_info.commandBufferCount = 1;
18198 submit_info.pCommandBuffers = &command_buffer;
18199 submit_info.signalSemaphoreCount = 0;
18200 submit_info.pSignalSemaphores = nullptr;
18201 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18202 }
18203 {
18204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is already in use by a "
18205 "command buffer.");
18206 vkSetEvent(m_device->device(), event);
18207 m_errorMonitor->VerifyFound();
18208 }
18209
18210 vkQueueWaitIdle(queue);
18211
18212 vkDestroyEvent(m_device->device(), event, nullptr);
18213 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
18214 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18215}
18216
18217// This is a positive test. No errors should be generated.
18218TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
18219 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
18220 "run through a Submit & WaitForFences cycle 3 times. This "
18221 "previously revealed a bug so running this positive test "
18222 "to prevent a regression.");
18223 m_errorMonitor->ExpectSuccess();
18224
18225 ASSERT_NO_FATAL_FAILURE(InitState());
18226 VkQueue queue = VK_NULL_HANDLE;
18227 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
18228
18229 static const uint32_t NUM_OBJECTS = 2;
18230 static const uint32_t NUM_FRAMES = 3;
18231 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
18232 VkFence fences[NUM_OBJECTS] = {};
18233
18234 VkCommandPool cmd_pool;
18235 VkCommandPoolCreateInfo cmd_pool_ci = {};
18236 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18237 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
18238 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18239 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
18240 ASSERT_VK_SUCCESS(err);
18241
18242 VkCommandBufferAllocateInfo cmd_buf_info = {};
18243 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18244 cmd_buf_info.commandPool = cmd_pool;
18245 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18246 cmd_buf_info.commandBufferCount = 1;
18247
18248 VkFenceCreateInfo fence_ci = {};
18249 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18250 fence_ci.pNext = nullptr;
18251 fence_ci.flags = 0;
18252
18253 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
18254 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
18255 ASSERT_VK_SUCCESS(err);
18256 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
18257 ASSERT_VK_SUCCESS(err);
18258 }
18259
18260 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
18261 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
18262 // Create empty cmd buffer
18263 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
18264 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18265
18266 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
18267 ASSERT_VK_SUCCESS(err);
18268 err = vkEndCommandBuffer(cmd_buffers[obj]);
18269 ASSERT_VK_SUCCESS(err);
18270
18271 VkSubmitInfo submit_info = {};
18272 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18273 submit_info.commandBufferCount = 1;
18274 submit_info.pCommandBuffers = &cmd_buffers[obj];
18275 // Submit cmd buffer and wait for fence
18276 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
18277 ASSERT_VK_SUCCESS(err);
18278 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
18279 ASSERT_VK_SUCCESS(err);
18280 err = vkResetFences(m_device->device(), 1, &fences[obj]);
18281 ASSERT_VK_SUCCESS(err);
18282 }
18283 }
18284 m_errorMonitor->VerifyNotFound();
18285 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
18286 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
18287 vkDestroyFence(m_device->device(), fences[i], nullptr);
18288 }
18289}
18290// This is a positive test. No errors should be generated.
18291TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
18292
18293 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18294 "submitted on separate queues followed by a QueueWaitIdle.");
18295
18296 ASSERT_NO_FATAL_FAILURE(InitState());
18297 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18298 return;
18299
18300 m_errorMonitor->ExpectSuccess();
18301
18302 VkSemaphore semaphore;
18303 VkSemaphoreCreateInfo semaphore_create_info{};
18304 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18305 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18306
18307 VkCommandPool command_pool;
18308 VkCommandPoolCreateInfo pool_create_info{};
18309 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18310 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18311 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18312 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18313
18314 VkCommandBuffer command_buffer[2];
18315 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18316 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18317 command_buffer_allocate_info.commandPool = command_pool;
18318 command_buffer_allocate_info.commandBufferCount = 2;
18319 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18320 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18321
18322 VkQueue queue = VK_NULL_HANDLE;
18323 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18324
18325 {
18326 VkCommandBufferBeginInfo begin_info{};
18327 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18328 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18329
18330 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18331 nullptr, 0, nullptr, 0, nullptr);
18332
18333 VkViewport viewport{};
18334 viewport.maxDepth = 1.0f;
18335 viewport.minDepth = 0.0f;
18336 viewport.width = 512;
18337 viewport.height = 512;
18338 viewport.x = 0;
18339 viewport.y = 0;
18340 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18341 vkEndCommandBuffer(command_buffer[0]);
18342 }
18343 {
18344 VkCommandBufferBeginInfo begin_info{};
18345 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18346 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18347
18348 VkViewport viewport{};
18349 viewport.maxDepth = 1.0f;
18350 viewport.minDepth = 0.0f;
18351 viewport.width = 512;
18352 viewport.height = 512;
18353 viewport.x = 0;
18354 viewport.y = 0;
18355 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18356 vkEndCommandBuffer(command_buffer[1]);
18357 }
18358 {
18359 VkSubmitInfo submit_info{};
18360 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18361 submit_info.commandBufferCount = 1;
18362 submit_info.pCommandBuffers = &command_buffer[0];
18363 submit_info.signalSemaphoreCount = 1;
18364 submit_info.pSignalSemaphores = &semaphore;
18365 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18366 }
18367 {
18368 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18369 VkSubmitInfo submit_info{};
18370 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18371 submit_info.commandBufferCount = 1;
18372 submit_info.pCommandBuffers = &command_buffer[1];
18373 submit_info.waitSemaphoreCount = 1;
18374 submit_info.pWaitSemaphores = &semaphore;
18375 submit_info.pWaitDstStageMask = flags;
18376 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18377 }
18378
18379 vkQueueWaitIdle(m_device->m_queue);
18380
18381 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18382 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18383 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18384
18385 m_errorMonitor->VerifyNotFound();
18386}
18387
18388// This is a positive test. No errors should be generated.
18389TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
18390
18391 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18392 "submitted on separate queues, the second having a fence"
18393 "followed by a QueueWaitIdle.");
18394
18395 ASSERT_NO_FATAL_FAILURE(InitState());
18396 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18397 return;
18398
18399 m_errorMonitor->ExpectSuccess();
18400
18401 VkFence fence;
18402 VkFenceCreateInfo fence_create_info{};
18403 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18404 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18405
18406 VkSemaphore semaphore;
18407 VkSemaphoreCreateInfo semaphore_create_info{};
18408 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18409 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18410
18411 VkCommandPool command_pool;
18412 VkCommandPoolCreateInfo pool_create_info{};
18413 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18414 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18415 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18416 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18417
18418 VkCommandBuffer command_buffer[2];
18419 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18420 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18421 command_buffer_allocate_info.commandPool = command_pool;
18422 command_buffer_allocate_info.commandBufferCount = 2;
18423 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18424 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18425
18426 VkQueue queue = VK_NULL_HANDLE;
18427 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18428
18429 {
18430 VkCommandBufferBeginInfo begin_info{};
18431 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18432 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18433
18434 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18435 nullptr, 0, nullptr, 0, nullptr);
18436
18437 VkViewport viewport{};
18438 viewport.maxDepth = 1.0f;
18439 viewport.minDepth = 0.0f;
18440 viewport.width = 512;
18441 viewport.height = 512;
18442 viewport.x = 0;
18443 viewport.y = 0;
18444 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18445 vkEndCommandBuffer(command_buffer[0]);
18446 }
18447 {
18448 VkCommandBufferBeginInfo begin_info{};
18449 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18450 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18451
18452 VkViewport viewport{};
18453 viewport.maxDepth = 1.0f;
18454 viewport.minDepth = 0.0f;
18455 viewport.width = 512;
18456 viewport.height = 512;
18457 viewport.x = 0;
18458 viewport.y = 0;
18459 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18460 vkEndCommandBuffer(command_buffer[1]);
18461 }
18462 {
18463 VkSubmitInfo submit_info{};
18464 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18465 submit_info.commandBufferCount = 1;
18466 submit_info.pCommandBuffers = &command_buffer[0];
18467 submit_info.signalSemaphoreCount = 1;
18468 submit_info.pSignalSemaphores = &semaphore;
18469 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18470 }
18471 {
18472 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18473 VkSubmitInfo submit_info{};
18474 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18475 submit_info.commandBufferCount = 1;
18476 submit_info.pCommandBuffers = &command_buffer[1];
18477 submit_info.waitSemaphoreCount = 1;
18478 submit_info.pWaitSemaphores = &semaphore;
18479 submit_info.pWaitDstStageMask = flags;
18480 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18481 }
18482
18483 vkQueueWaitIdle(m_device->m_queue);
18484
18485 vkDestroyFence(m_device->device(), fence, nullptr);
18486 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18487 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18488 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18489
18490 m_errorMonitor->VerifyNotFound();
18491}
18492
18493// This is a positive test. No errors should be generated.
18494TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
18495
18496 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18497 "submitted on separate queues, the second having a fence"
18498 "followed by two consecutive WaitForFences calls on the same fence.");
18499
18500 ASSERT_NO_FATAL_FAILURE(InitState());
18501 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18502 return;
18503
18504 m_errorMonitor->ExpectSuccess();
18505
18506 VkFence fence;
18507 VkFenceCreateInfo fence_create_info{};
18508 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18509 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18510
18511 VkSemaphore semaphore;
18512 VkSemaphoreCreateInfo semaphore_create_info{};
18513 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18514 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18515
18516 VkCommandPool command_pool;
18517 VkCommandPoolCreateInfo pool_create_info{};
18518 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18519 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18520 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18521 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18522
18523 VkCommandBuffer command_buffer[2];
18524 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18525 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18526 command_buffer_allocate_info.commandPool = command_pool;
18527 command_buffer_allocate_info.commandBufferCount = 2;
18528 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18529 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18530
18531 VkQueue queue = VK_NULL_HANDLE;
18532 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18533
18534 {
18535 VkCommandBufferBeginInfo begin_info{};
18536 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18537 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18538
18539 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18540 nullptr, 0, nullptr, 0, nullptr);
18541
18542 VkViewport viewport{};
18543 viewport.maxDepth = 1.0f;
18544 viewport.minDepth = 0.0f;
18545 viewport.width = 512;
18546 viewport.height = 512;
18547 viewport.x = 0;
18548 viewport.y = 0;
18549 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18550 vkEndCommandBuffer(command_buffer[0]);
18551 }
18552 {
18553 VkCommandBufferBeginInfo begin_info{};
18554 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18555 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18556
18557 VkViewport viewport{};
18558 viewport.maxDepth = 1.0f;
18559 viewport.minDepth = 0.0f;
18560 viewport.width = 512;
18561 viewport.height = 512;
18562 viewport.x = 0;
18563 viewport.y = 0;
18564 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18565 vkEndCommandBuffer(command_buffer[1]);
18566 }
18567 {
18568 VkSubmitInfo submit_info{};
18569 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18570 submit_info.commandBufferCount = 1;
18571 submit_info.pCommandBuffers = &command_buffer[0];
18572 submit_info.signalSemaphoreCount = 1;
18573 submit_info.pSignalSemaphores = &semaphore;
18574 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18575 }
18576 {
18577 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18578 VkSubmitInfo submit_info{};
18579 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18580 submit_info.commandBufferCount = 1;
18581 submit_info.pCommandBuffers = &command_buffer[1];
18582 submit_info.waitSemaphoreCount = 1;
18583 submit_info.pWaitSemaphores = &semaphore;
18584 submit_info.pWaitDstStageMask = flags;
18585 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18586 }
18587
18588 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18589 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18590
18591 vkDestroyFence(m_device->device(), fence, nullptr);
18592 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18593 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18594 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18595
18596 m_errorMonitor->VerifyNotFound();
18597}
18598
18599TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
18600
18601 ASSERT_NO_FATAL_FAILURE(InitState());
18602 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
18603 printf("Test requires two queues, skipping\n");
18604 return;
18605 }
18606
18607 VkResult err;
18608
18609 m_errorMonitor->ExpectSuccess();
18610
18611 VkQueue q0 = m_device->m_queue;
18612 VkQueue q1 = nullptr;
18613 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
18614 ASSERT_NE(q1, nullptr);
18615
18616 // An (empty) command buffer. We must have work in the first submission --
18617 // the layer treats unfenced work differently from fenced work.
18618 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
18619 VkCommandPool pool;
18620 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
18621 ASSERT_VK_SUCCESS(err);
18622 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
18623 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1 };
18624 VkCommandBuffer cb;
18625 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
18626 ASSERT_VK_SUCCESS(err);
18627 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr };
18628 err = vkBeginCommandBuffer(cb, &cbbi);
18629 ASSERT_VK_SUCCESS(err);
18630 err = vkEndCommandBuffer(cb);
18631 ASSERT_VK_SUCCESS(err);
18632
18633 // A semaphore
18634 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
18635 VkSemaphore s;
18636 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
18637 ASSERT_VK_SUCCESS(err);
18638
18639 // First submission, to q0
18640 VkSubmitInfo s0 = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s };
18641
18642 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
18643 ASSERT_VK_SUCCESS(err);
18644
18645 // Second submission, to q1, waiting on s
18646 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
18647 VkSubmitInfo s1 = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr };
18648
18649 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
18650 ASSERT_VK_SUCCESS(err);
18651
18652 // Wait for q0 idle
18653 err = vkQueueWaitIdle(q0);
18654 ASSERT_VK_SUCCESS(err);
18655
18656 // Command buffer should have been completed (it was on q0); reset the pool.
18657 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
18658
18659 m_errorMonitor->VerifyNotFound();
18660
18661 // Force device completely idle and clean up resources
18662 vkDeviceWaitIdle(m_device->device());
18663 vkDestroyCommandPool(m_device->device(), pool, nullptr);
18664 vkDestroySemaphore(m_device->device(), s, nullptr);
18665}
18666
18667// This is a positive test. No errors should be generated.
18668TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
18669
18670 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18671 "submitted on separate queues, the second having a fence, "
18672 "followed by a WaitForFences call.");
18673
18674 ASSERT_NO_FATAL_FAILURE(InitState());
18675 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18676 return;
18677
18678 m_errorMonitor->ExpectSuccess();
18679
18680 ASSERT_NO_FATAL_FAILURE(InitState());
18681 VkFence fence;
18682 VkFenceCreateInfo fence_create_info{};
18683 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18684 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18685
18686 VkSemaphore semaphore;
18687 VkSemaphoreCreateInfo semaphore_create_info{};
18688 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18689 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18690
18691 VkCommandPool command_pool;
18692 VkCommandPoolCreateInfo pool_create_info{};
18693 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18694 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18695 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18696 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18697
18698 VkCommandBuffer command_buffer[2];
18699 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18700 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18701 command_buffer_allocate_info.commandPool = command_pool;
18702 command_buffer_allocate_info.commandBufferCount = 2;
18703 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18704 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18705
18706 VkQueue queue = VK_NULL_HANDLE;
18707 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18708
18709 {
18710 VkCommandBufferBeginInfo begin_info{};
18711 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18712 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18713
18714 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18715 nullptr, 0, nullptr, 0, nullptr);
18716
18717 VkViewport viewport{};
18718 viewport.maxDepth = 1.0f;
18719 viewport.minDepth = 0.0f;
18720 viewport.width = 512;
18721 viewport.height = 512;
18722 viewport.x = 0;
18723 viewport.y = 0;
18724 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18725 vkEndCommandBuffer(command_buffer[0]);
18726 }
18727 {
18728 VkCommandBufferBeginInfo begin_info{};
18729 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18730 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18731
18732 VkViewport viewport{};
18733 viewport.maxDepth = 1.0f;
18734 viewport.minDepth = 0.0f;
18735 viewport.width = 512;
18736 viewport.height = 512;
18737 viewport.x = 0;
18738 viewport.y = 0;
18739 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18740 vkEndCommandBuffer(command_buffer[1]);
18741 }
18742 {
18743 VkSubmitInfo submit_info{};
18744 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18745 submit_info.commandBufferCount = 1;
18746 submit_info.pCommandBuffers = &command_buffer[0];
18747 submit_info.signalSemaphoreCount = 1;
18748 submit_info.pSignalSemaphores = &semaphore;
18749 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18750 }
18751 {
18752 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18753 VkSubmitInfo submit_info{};
18754 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18755 submit_info.commandBufferCount = 1;
18756 submit_info.pCommandBuffers = &command_buffer[1];
18757 submit_info.waitSemaphoreCount = 1;
18758 submit_info.pWaitSemaphores = &semaphore;
18759 submit_info.pWaitDstStageMask = flags;
18760 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18761 }
18762
18763 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18764
18765 vkDestroyFence(m_device->device(), fence, nullptr);
18766 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18767 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18768 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18769
18770 m_errorMonitor->VerifyNotFound();
18771}
18772
18773// This is a positive test. No errors should be generated.
18774TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
18775
18776 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18777 "on the same queue, sharing a signal/wait semaphore, the "
18778 "second having a fence, "
18779 "followed by a WaitForFences call.");
18780
18781 m_errorMonitor->ExpectSuccess();
18782
18783 ASSERT_NO_FATAL_FAILURE(InitState());
18784 VkFence fence;
18785 VkFenceCreateInfo fence_create_info{};
18786 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18787 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18788
18789 VkSemaphore semaphore;
18790 VkSemaphoreCreateInfo semaphore_create_info{};
18791 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18792 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18793
18794 VkCommandPool command_pool;
18795 VkCommandPoolCreateInfo pool_create_info{};
18796 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18797 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18798 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18799 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18800
18801 VkCommandBuffer command_buffer[2];
18802 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18803 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18804 command_buffer_allocate_info.commandPool = command_pool;
18805 command_buffer_allocate_info.commandBufferCount = 2;
18806 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18807 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18808
18809 {
18810 VkCommandBufferBeginInfo begin_info{};
18811 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18812 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18813
18814 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18815 nullptr, 0, nullptr, 0, nullptr);
18816
18817 VkViewport viewport{};
18818 viewport.maxDepth = 1.0f;
18819 viewport.minDepth = 0.0f;
18820 viewport.width = 512;
18821 viewport.height = 512;
18822 viewport.x = 0;
18823 viewport.y = 0;
18824 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18825 vkEndCommandBuffer(command_buffer[0]);
18826 }
18827 {
18828 VkCommandBufferBeginInfo begin_info{};
18829 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18830 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18831
18832 VkViewport viewport{};
18833 viewport.maxDepth = 1.0f;
18834 viewport.minDepth = 0.0f;
18835 viewport.width = 512;
18836 viewport.height = 512;
18837 viewport.x = 0;
18838 viewport.y = 0;
18839 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18840 vkEndCommandBuffer(command_buffer[1]);
18841 }
18842 {
18843 VkSubmitInfo submit_info{};
18844 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18845 submit_info.commandBufferCount = 1;
18846 submit_info.pCommandBuffers = &command_buffer[0];
18847 submit_info.signalSemaphoreCount = 1;
18848 submit_info.pSignalSemaphores = &semaphore;
18849 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18850 }
18851 {
18852 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18853 VkSubmitInfo submit_info{};
18854 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18855 submit_info.commandBufferCount = 1;
18856 submit_info.pCommandBuffers = &command_buffer[1];
18857 submit_info.waitSemaphoreCount = 1;
18858 submit_info.pWaitSemaphores = &semaphore;
18859 submit_info.pWaitDstStageMask = flags;
18860 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18861 }
18862
18863 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18864
18865 vkDestroyFence(m_device->device(), fence, nullptr);
18866 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18867 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18868 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18869
18870 m_errorMonitor->VerifyNotFound();
18871}
18872
18873// This is a positive test. No errors should be generated.
18874TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
18875
18876 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18877 "on the same queue, no fences, followed by a third QueueSubmit with NO "
18878 "SubmitInfos but with a fence, followed by a WaitForFences call.");
18879
18880 m_errorMonitor->ExpectSuccess();
18881
18882 ASSERT_NO_FATAL_FAILURE(InitState());
18883 VkFence fence;
18884 VkFenceCreateInfo fence_create_info{};
18885 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18886 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18887
18888 VkCommandPool command_pool;
18889 VkCommandPoolCreateInfo pool_create_info{};
18890 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18891 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18892 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18893 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18894
18895 VkCommandBuffer command_buffer[2];
18896 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18897 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18898 command_buffer_allocate_info.commandPool = command_pool;
18899 command_buffer_allocate_info.commandBufferCount = 2;
18900 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18901 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18902
18903 {
18904 VkCommandBufferBeginInfo begin_info{};
18905 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18906 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18907
18908 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18909 nullptr, 0, nullptr, 0, nullptr);
18910
18911 VkViewport viewport{};
18912 viewport.maxDepth = 1.0f;
18913 viewport.minDepth = 0.0f;
18914 viewport.width = 512;
18915 viewport.height = 512;
18916 viewport.x = 0;
18917 viewport.y = 0;
18918 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18919 vkEndCommandBuffer(command_buffer[0]);
18920 }
18921 {
18922 VkCommandBufferBeginInfo begin_info{};
18923 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18924 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18925
18926 VkViewport viewport{};
18927 viewport.maxDepth = 1.0f;
18928 viewport.minDepth = 0.0f;
18929 viewport.width = 512;
18930 viewport.height = 512;
18931 viewport.x = 0;
18932 viewport.y = 0;
18933 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18934 vkEndCommandBuffer(command_buffer[1]);
18935 }
18936 {
18937 VkSubmitInfo submit_info{};
18938 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18939 submit_info.commandBufferCount = 1;
18940 submit_info.pCommandBuffers = &command_buffer[0];
18941 submit_info.signalSemaphoreCount = 0;
18942 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
18943 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18944 }
18945 {
18946 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18947 VkSubmitInfo submit_info{};
18948 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18949 submit_info.commandBufferCount = 1;
18950 submit_info.pCommandBuffers = &command_buffer[1];
18951 submit_info.waitSemaphoreCount = 0;
18952 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
18953 submit_info.pWaitDstStageMask = flags;
18954 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18955 }
18956
18957 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
18958
18959 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18960 ASSERT_VK_SUCCESS(err);
18961
18962 vkDestroyFence(m_device->device(), fence, nullptr);
18963 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18964 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18965
18966 m_errorMonitor->VerifyNotFound();
18967}
18968
18969// This is a positive test. No errors should be generated.
18970TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
18971
18972 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18973 "on the same queue, the second having a fence, followed "
18974 "by a WaitForFences call.");
18975
18976 m_errorMonitor->ExpectSuccess();
18977
18978 ASSERT_NO_FATAL_FAILURE(InitState());
18979 VkFence fence;
18980 VkFenceCreateInfo fence_create_info{};
18981 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18982 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18983
18984 VkCommandPool command_pool;
18985 VkCommandPoolCreateInfo pool_create_info{};
18986 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18987 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18988 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18989 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18990
18991 VkCommandBuffer command_buffer[2];
18992 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18993 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18994 command_buffer_allocate_info.commandPool = command_pool;
18995 command_buffer_allocate_info.commandBufferCount = 2;
18996 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18997 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18998
18999 {
19000 VkCommandBufferBeginInfo begin_info{};
19001 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19002 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19003
19004 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
19005 nullptr, 0, nullptr, 0, nullptr);
19006
19007 VkViewport viewport{};
19008 viewport.maxDepth = 1.0f;
19009 viewport.minDepth = 0.0f;
19010 viewport.width = 512;
19011 viewport.height = 512;
19012 viewport.x = 0;
19013 viewport.y = 0;
19014 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19015 vkEndCommandBuffer(command_buffer[0]);
19016 }
19017 {
19018 VkCommandBufferBeginInfo begin_info{};
19019 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19020 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19021
19022 VkViewport viewport{};
19023 viewport.maxDepth = 1.0f;
19024 viewport.minDepth = 0.0f;
19025 viewport.width = 512;
19026 viewport.height = 512;
19027 viewport.x = 0;
19028 viewport.y = 0;
19029 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19030 vkEndCommandBuffer(command_buffer[1]);
19031 }
19032 {
19033 VkSubmitInfo submit_info{};
19034 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19035 submit_info.commandBufferCount = 1;
19036 submit_info.pCommandBuffers = &command_buffer[0];
19037 submit_info.signalSemaphoreCount = 0;
19038 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
19039 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19040 }
19041 {
19042 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
19043 VkSubmitInfo submit_info{};
19044 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19045 submit_info.commandBufferCount = 1;
19046 submit_info.pCommandBuffers = &command_buffer[1];
19047 submit_info.waitSemaphoreCount = 0;
19048 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
19049 submit_info.pWaitDstStageMask = flags;
19050 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19051 }
19052
19053 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19054
19055 vkDestroyFence(m_device->device(), fence, nullptr);
19056 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19057 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19058
19059 m_errorMonitor->VerifyNotFound();
19060}
19061
19062// This is a positive test. No errors should be generated.
19063TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
19064
19065 TEST_DESCRIPTION("Two command buffers each in a separate SubmitInfo sent in a single "
19066 "QueueSubmit call followed by a WaitForFences call.");
19067 ASSERT_NO_FATAL_FAILURE(InitState());
19068
19069 m_errorMonitor->ExpectSuccess();
19070
19071 VkFence fence;
19072 VkFenceCreateInfo fence_create_info{};
19073 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19074 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19075
19076 VkSemaphore semaphore;
19077 VkSemaphoreCreateInfo semaphore_create_info{};
19078 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19079 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19080
19081 VkCommandPool command_pool;
19082 VkCommandPoolCreateInfo pool_create_info{};
19083 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19084 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19085 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19086 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19087
19088 VkCommandBuffer command_buffer[2];
19089 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19090 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19091 command_buffer_allocate_info.commandPool = command_pool;
19092 command_buffer_allocate_info.commandBufferCount = 2;
19093 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19094 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19095
19096 {
19097 VkCommandBufferBeginInfo begin_info{};
19098 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19099 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19100
19101 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
19102 nullptr, 0, nullptr, 0, nullptr);
19103
19104 VkViewport viewport{};
19105 viewport.maxDepth = 1.0f;
19106 viewport.minDepth = 0.0f;
19107 viewport.width = 512;
19108 viewport.height = 512;
19109 viewport.x = 0;
19110 viewport.y = 0;
19111 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19112 vkEndCommandBuffer(command_buffer[0]);
19113 }
19114 {
19115 VkCommandBufferBeginInfo begin_info{};
19116 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19117 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19118
19119 VkViewport viewport{};
19120 viewport.maxDepth = 1.0f;
19121 viewport.minDepth = 0.0f;
19122 viewport.width = 512;
19123 viewport.height = 512;
19124 viewport.x = 0;
19125 viewport.y = 0;
19126 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19127 vkEndCommandBuffer(command_buffer[1]);
19128 }
19129 {
19130 VkSubmitInfo submit_info[2];
19131 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
19132
19133 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19134 submit_info[0].pNext = NULL;
19135 submit_info[0].commandBufferCount = 1;
19136 submit_info[0].pCommandBuffers = &command_buffer[0];
19137 submit_info[0].signalSemaphoreCount = 1;
19138 submit_info[0].pSignalSemaphores = &semaphore;
19139 submit_info[0].waitSemaphoreCount = 0;
19140 submit_info[0].pWaitSemaphores = NULL;
19141 submit_info[0].pWaitDstStageMask = 0;
19142
19143 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19144 submit_info[1].pNext = NULL;
19145 submit_info[1].commandBufferCount = 1;
19146 submit_info[1].pCommandBuffers = &command_buffer[1];
19147 submit_info[1].waitSemaphoreCount = 1;
19148 submit_info[1].pWaitSemaphores = &semaphore;
19149 submit_info[1].pWaitDstStageMask = flags;
19150 submit_info[1].signalSemaphoreCount = 0;
19151 submit_info[1].pSignalSemaphores = NULL;
19152 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
19153 }
19154
19155 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19156
19157 vkDestroyFence(m_device->device(), fence, nullptr);
19158 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19159 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19160 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19161
19162 m_errorMonitor->VerifyNotFound();
19163}
19164
19165TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
19166 m_errorMonitor->ExpectSuccess();
19167
19168 ASSERT_NO_FATAL_FAILURE(InitState());
19169 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19170
19171 BeginCommandBuffer(); // Framework implicitly begins the renderpass.
19172 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // End implicit.
19173
19174 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
19175 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
19176 m_errorMonitor->VerifyNotFound();
19177 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
19178 m_errorMonitor->VerifyNotFound();
19179 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
19180 m_errorMonitor->VerifyNotFound();
19181
19182 m_commandBuffer->EndCommandBuffer();
19183 m_errorMonitor->VerifyNotFound();
19184}
19185
19186TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
19187 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
19188 "attachment that uses LOAD_OP_CLEAR, the first subpass "
19189 "has a valid layout, and a second subpass then uses a "
19190 "valid *READ_ONLY* layout.");
19191 m_errorMonitor->ExpectSuccess();
19192 ASSERT_NO_FATAL_FAILURE(InitState());
19193
19194 VkAttachmentReference attach[2] = {};
19195 attach[0].attachment = 0;
19196 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19197 attach[1].attachment = 0;
19198 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
19199 VkSubpassDescription subpasses[2] = {};
19200 // First subpass clears DS attach on load
19201 subpasses[0].pDepthStencilAttachment = &attach[0];
19202 // 2nd subpass reads in DS as input attachment
19203 subpasses[1].inputAttachmentCount = 1;
19204 subpasses[1].pInputAttachments = &attach[1];
19205 VkAttachmentDescription attach_desc = {};
19206 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
19207 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
19208 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
19209 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
19210 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
19211 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
19212 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19213 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
19214 VkRenderPassCreateInfo rpci = {};
19215 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
19216 rpci.attachmentCount = 1;
19217 rpci.pAttachments = &attach_desc;
19218 rpci.subpassCount = 2;
19219 rpci.pSubpasses = subpasses;
19220
19221 // Now create RenderPass and verify no errors
19222 VkRenderPass rp;
19223 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
19224 m_errorMonitor->VerifyNotFound();
19225
19226 vkDestroyRenderPass(m_device->device(), rp, NULL);
19227}
19228
19229TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
19230 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
19231 "as vertex attributes");
19232 m_errorMonitor->ExpectSuccess();
19233
19234 ASSERT_NO_FATAL_FAILURE(InitState());
19235 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19236
19237 VkVertexInputBindingDescription input_binding;
19238 memset(&input_binding, 0, sizeof(input_binding));
19239
19240 VkVertexInputAttributeDescription input_attribs[2];
19241 memset(input_attribs, 0, sizeof(input_attribs));
19242
19243 for (int i = 0; i < 2; i++) {
19244 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19245 input_attribs[i].location = i;
19246 }
19247
19248 char const *vsSource = "#version 450\n"
19249 "\n"
19250 "layout(location=0) in mat2x4 x;\n"
19251 "out gl_PerVertex {\n"
19252 " vec4 gl_Position;\n"
19253 "};\n"
19254 "void main(){\n"
19255 " gl_Position = x[0] + x[1];\n"
19256 "}\n";
19257 char const *fsSource = "#version 450\n"
19258 "\n"
19259 "layout(location=0) out vec4 color;\n"
19260 "void main(){\n"
19261 " color = vec4(1);\n"
19262 "}\n";
19263
19264 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19265 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19266
19267 VkPipelineObj pipe(m_device);
19268 pipe.AddColorAttachment();
19269 pipe.AddShader(&vs);
19270 pipe.AddShader(&fs);
19271
19272 pipe.AddVertexInputBindings(&input_binding, 1);
19273 pipe.AddVertexInputAttribs(input_attribs, 2);
19274
19275 VkDescriptorSetObj descriptorSet(m_device);
19276 descriptorSet.AppendDummy();
19277 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19278
19279 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19280
19281 /* expect success */
19282 m_errorMonitor->VerifyNotFound();
19283}
19284
19285TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
19286 m_errorMonitor->ExpectSuccess();
19287
19288 ASSERT_NO_FATAL_FAILURE(InitState());
19289 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19290
19291 VkVertexInputBindingDescription input_binding;
19292 memset(&input_binding, 0, sizeof(input_binding));
19293
19294 VkVertexInputAttributeDescription input_attribs[2];
19295 memset(input_attribs, 0, sizeof(input_attribs));
19296
19297 for (int i = 0; i < 2; i++) {
19298 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19299 input_attribs[i].location = i;
19300 }
19301
19302 char const *vsSource = "#version 450\n"
19303 "\n"
19304 "layout(location=0) in vec4 x[2];\n"
19305 "out gl_PerVertex {\n"
19306 " vec4 gl_Position;\n"
19307 "};\n"
19308 "void main(){\n"
19309 " gl_Position = x[0] + x[1];\n"
19310 "}\n";
19311 char const *fsSource = "#version 450\n"
19312 "\n"
19313 "layout(location=0) out vec4 color;\n"
19314 "void main(){\n"
19315 " color = vec4(1);\n"
19316 "}\n";
19317
19318 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19319 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19320
19321 VkPipelineObj pipe(m_device);
19322 pipe.AddColorAttachment();
19323 pipe.AddShader(&vs);
19324 pipe.AddShader(&fs);
19325
19326 pipe.AddVertexInputBindings(&input_binding, 1);
19327 pipe.AddVertexInputAttribs(input_attribs, 2);
19328
19329 VkDescriptorSetObj descriptorSet(m_device);
19330 descriptorSet.AppendDummy();
19331 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19332
19333 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19334
19335 m_errorMonitor->VerifyNotFound();
19336}
19337
19338TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
19339 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
19340 "through multiple vertex shader inputs, each consuming a different "
19341 "subset of the components.");
19342 m_errorMonitor->ExpectSuccess();
19343
19344 ASSERT_NO_FATAL_FAILURE(InitState());
19345 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19346
19347 VkVertexInputBindingDescription input_binding;
19348 memset(&input_binding, 0, sizeof(input_binding));
19349
19350 VkVertexInputAttributeDescription input_attribs[3];
19351 memset(input_attribs, 0, sizeof(input_attribs));
19352
19353 for (int i = 0; i < 3; i++) {
19354 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19355 input_attribs[i].location = i;
19356 }
19357
19358 char const *vsSource = "#version 450\n"
19359 "\n"
19360 "layout(location=0) in vec4 x;\n"
19361 "layout(location=1) in vec3 y1;\n"
19362 "layout(location=1, component=3) in float y2;\n"
19363 "layout(location=2) in vec4 z;\n"
19364 "out gl_PerVertex {\n"
19365 " vec4 gl_Position;\n"
19366 "};\n"
19367 "void main(){\n"
19368 " gl_Position = x + vec4(y1, y2) + z;\n"
19369 "}\n";
19370 char const *fsSource = "#version 450\n"
19371 "\n"
19372 "layout(location=0) out vec4 color;\n"
19373 "void main(){\n"
19374 " color = vec4(1);\n"
19375 "}\n";
19376
19377 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19378 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19379
19380 VkPipelineObj pipe(m_device);
19381 pipe.AddColorAttachment();
19382 pipe.AddShader(&vs);
19383 pipe.AddShader(&fs);
19384
19385 pipe.AddVertexInputBindings(&input_binding, 1);
19386 pipe.AddVertexInputAttribs(input_attribs, 3);
19387
19388 VkDescriptorSetObj descriptorSet(m_device);
19389 descriptorSet.AppendDummy();
19390 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19391
19392 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19393
19394 m_errorMonitor->VerifyNotFound();
19395}
19396
19397TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
19398 m_errorMonitor->ExpectSuccess();
19399
19400 ASSERT_NO_FATAL_FAILURE(InitState());
19401 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19402
19403 char const *vsSource = "#version 450\n"
19404 "out gl_PerVertex {\n"
19405 " vec4 gl_Position;\n"
19406 "};\n"
19407 "void main(){\n"
19408 " gl_Position = vec4(0);\n"
19409 "}\n";
19410 char const *fsSource = "#version 450\n"
19411 "\n"
19412 "layout(location=0) out vec4 color;\n"
19413 "void main(){\n"
19414 " color = vec4(1);\n"
19415 "}\n";
19416
19417 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19418 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19419
19420 VkPipelineObj pipe(m_device);
19421 pipe.AddColorAttachment();
19422 pipe.AddShader(&vs);
19423 pipe.AddShader(&fs);
19424
19425 VkDescriptorSetObj descriptorSet(m_device);
19426 descriptorSet.AppendDummy();
19427 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19428
19429 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19430
19431 m_errorMonitor->VerifyNotFound();
19432}
19433
19434TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
19435 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
19436 "set out in 14.1.3: fundamental type must match, and producer side must "
19437 "have at least as many components");
19438 m_errorMonitor->ExpectSuccess();
19439
19440 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
19441
19442 ASSERT_NO_FATAL_FAILURE(InitState());
19443 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19444
19445 char const *vsSource = "#version 450\n"
19446 "out gl_PerVertex {\n"
19447 " vec4 gl_Position;\n"
19448 "};\n"
19449 "layout(location=0) out vec3 x;\n"
19450 "layout(location=1) out ivec3 y;\n"
19451 "layout(location=2) out vec3 z;\n"
19452 "void main(){\n"
19453 " gl_Position = vec4(0);\n"
19454 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
19455 "}\n";
19456 char const *fsSource = "#version 450\n"
19457 "\n"
19458 "layout(location=0) out vec4 color;\n"
19459 "layout(location=0) in float x;\n"
19460 "layout(location=1) flat in int y;\n"
19461 "layout(location=2) in vec2 z;\n"
19462 "void main(){\n"
19463 " color = vec4(1 + x + y + z.x);\n"
19464 "}\n";
19465
19466 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19467 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19468
19469 VkPipelineObj pipe(m_device);
19470 pipe.AddColorAttachment();
19471 pipe.AddShader(&vs);
19472 pipe.AddShader(&fs);
19473
19474 VkDescriptorSetObj descriptorSet(m_device);
19475 descriptorSet.AppendDummy();
19476 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19477
19478 VkResult err = VK_SUCCESS;
19479 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19480 ASSERT_VK_SUCCESS(err);
19481
19482 m_errorMonitor->VerifyNotFound();
19483}
19484
19485TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
19486 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
19487 "passed between the TCS and TES stages");
19488 m_errorMonitor->ExpectSuccess();
19489
19490 ASSERT_NO_FATAL_FAILURE(InitState());
19491 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19492
19493 if (!m_device->phy().features().tessellationShader) {
19494 printf("Device does not support tessellation shaders; skipped.\n");
19495 return;
19496 }
19497
19498 char const *vsSource = "#version 450\n"
19499 "void main(){}\n";
19500 char const *tcsSource = "#version 450\n"
19501 "layout(location=0) out int x[];\n"
19502 "layout(vertices=3) out;\n"
19503 "void main(){\n"
19504 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
19505 " gl_TessLevelInner[0] = 1;\n"
19506 " x[gl_InvocationID] = gl_InvocationID;\n"
19507 "}\n";
19508 char const *tesSource = "#version 450\n"
19509 "layout(triangles, equal_spacing, cw) in;\n"
19510 "layout(location=0) in int x[];\n"
19511 "out gl_PerVertex { vec4 gl_Position; };\n"
19512 "void main(){\n"
19513 " gl_Position.xyz = gl_TessCoord;\n"
19514 " gl_Position.w = x[0] + x[1] + x[2];\n"
19515 "}\n";
19516 char const *fsSource = "#version 450\n"
19517 "layout(location=0) out vec4 color;\n"
19518 "void main(){\n"
19519 " color = vec4(1);\n"
19520 "}\n";
19521
19522 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19523 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
19524 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
19525 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19526
19527 VkPipelineInputAssemblyStateCreateInfo iasci{ VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
19528 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE };
19529
19530 VkPipelineTessellationStateCreateInfo tsci{ VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3 };
19531
19532 VkPipelineObj pipe(m_device);
19533 pipe.SetInputAssembly(&iasci);
19534 pipe.SetTessellation(&tsci);
19535 pipe.AddColorAttachment();
19536 pipe.AddShader(&vs);
19537 pipe.AddShader(&tcs);
19538 pipe.AddShader(&tes);
19539 pipe.AddShader(&fs);
19540
19541 VkDescriptorSetObj descriptorSet(m_device);
19542 descriptorSet.AppendDummy();
19543 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19544
19545 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19546
19547 m_errorMonitor->VerifyNotFound();
19548}
19549
19550TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
19551 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
19552 "interface block passed into the geometry shader. This "
19553 "is interesting because the 'extra' array level is not "
19554 "present on the member type, but on the block instance.");
19555 m_errorMonitor->ExpectSuccess();
19556
19557 ASSERT_NO_FATAL_FAILURE(InitState());
19558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19559
19560 if (!m_device->phy().features().geometryShader) {
19561 printf("Device does not support geometry shaders; skipped.\n");
19562 return;
19563 }
19564
19565 char const *vsSource = "#version 450\n"
19566 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
19567 "void main(){\n"
19568 " vs_out.x = vec4(1);\n"
19569 "}\n";
19570 char const *gsSource = "#version 450\n"
19571 "layout(triangles) in;\n"
19572 "layout(triangle_strip, max_vertices=3) out;\n"
19573 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
19574 "out gl_PerVertex { vec4 gl_Position; };\n"
19575 "void main() {\n"
19576 " gl_Position = gs_in[0].x;\n"
19577 " EmitVertex();\n"
19578 "}\n";
19579 char const *fsSource = "#version 450\n"
19580 "layout(location=0) out vec4 color;\n"
19581 "void main(){\n"
19582 " color = vec4(1);\n"
19583 "}\n";
19584
19585 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19586 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
19587 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19588
19589 VkPipelineObj pipe(m_device);
19590 pipe.AddColorAttachment();
19591 pipe.AddShader(&vs);
19592 pipe.AddShader(&gs);
19593 pipe.AddShader(&fs);
19594
19595 VkDescriptorSetObj descriptorSet(m_device);
19596 descriptorSet.AppendDummy();
19597 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19598
19599 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19600
19601 m_errorMonitor->VerifyNotFound();
19602}
19603
19604TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
19605 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
19606 "attributes. This is interesting because they consume multiple "
19607 "locations.");
19608 m_errorMonitor->ExpectSuccess();
19609
19610 ASSERT_NO_FATAL_FAILURE(InitState());
19611 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19612
19613 if (!m_device->phy().features().shaderFloat64) {
19614 printf("Device does not support 64bit vertex attributes; skipped.\n");
19615 return;
19616 }
19617
19618 VkVertexInputBindingDescription input_bindings[1];
19619 memset(input_bindings, 0, sizeof(input_bindings));
19620
19621 VkVertexInputAttributeDescription input_attribs[4];
19622 memset(input_attribs, 0, sizeof(input_attribs));
19623 input_attribs[0].location = 0;
19624 input_attribs[0].offset = 0;
19625 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19626 input_attribs[1].location = 2;
19627 input_attribs[1].offset = 32;
19628 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19629 input_attribs[2].location = 4;
19630 input_attribs[2].offset = 64;
19631 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19632 input_attribs[3].location = 6;
19633 input_attribs[3].offset = 96;
19634 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19635
19636 char const *vsSource = "#version 450\n"
19637 "\n"
19638 "layout(location=0) in dmat4 x;\n"
19639 "out gl_PerVertex {\n"
19640 " vec4 gl_Position;\n"
19641 "};\n"
19642 "void main(){\n"
19643 " gl_Position = vec4(x[0][0]);\n"
19644 "}\n";
19645 char const *fsSource = "#version 450\n"
19646 "\n"
19647 "layout(location=0) out vec4 color;\n"
19648 "void main(){\n"
19649 " color = vec4(1);\n"
19650 "}\n";
19651
19652 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19653 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19654
19655 VkPipelineObj pipe(m_device);
19656 pipe.AddColorAttachment();
19657 pipe.AddShader(&vs);
19658 pipe.AddShader(&fs);
19659
19660 pipe.AddVertexInputBindings(input_bindings, 1);
19661 pipe.AddVertexInputAttribs(input_attribs, 4);
19662
19663 VkDescriptorSetObj descriptorSet(m_device);
19664 descriptorSet.AppendDummy();
19665 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19666
19667 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19668
19669 m_errorMonitor->VerifyNotFound();
19670}
19671
19672TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
19673 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
19674 m_errorMonitor->ExpectSuccess();
19675
19676 ASSERT_NO_FATAL_FAILURE(InitState());
19677
19678 char const *vsSource = "#version 450\n"
19679 "\n"
19680 "out gl_PerVertex {\n"
19681 " vec4 gl_Position;\n"
19682 "};\n"
19683 "void main(){\n"
19684 " gl_Position = vec4(1);\n"
19685 "}\n";
19686 char const *fsSource = "#version 450\n"
19687 "\n"
19688 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
19689 "layout(location=0) out vec4 color;\n"
19690 "void main() {\n"
19691 " color = subpassLoad(x);\n"
19692 "}\n";
19693
19694 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19695 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19696
19697 VkPipelineObj pipe(m_device);
19698 pipe.AddShader(&vs);
19699 pipe.AddShader(&fs);
19700 pipe.AddColorAttachment();
19701 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19702
19703 VkDescriptorSetLayoutBinding dslb = { 0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr };
19704 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb };
19705 VkDescriptorSetLayout dsl;
19706 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19707 ASSERT_VK_SUCCESS(err);
19708
19709 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19710 VkPipelineLayout pl;
19711 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19712 ASSERT_VK_SUCCESS(err);
19713
19714 VkAttachmentDescription descs[2] = {
19715 { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
19716 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
19717 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL },
19718 { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
19719 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL },
19720 };
19721 VkAttachmentReference color = {
19722 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
19723 };
19724 VkAttachmentReference input = {
19725 1, VK_IMAGE_LAYOUT_GENERAL,
19726 };
19727
19728 VkSubpassDescription sd = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr };
19729
19730 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr };
19731 VkRenderPass rp;
19732 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19733 ASSERT_VK_SUCCESS(err);
19734
19735 // should be OK. would go wrong here if it's going to...
19736 pipe.CreateVKPipeline(pl, rp);
19737
19738 m_errorMonitor->VerifyNotFound();
19739
19740 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19741 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19742 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19743}
19744
19745TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
19746 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
19747 "descriptor-backed resource which is not provided, but the shader does not "
19748 "statically use it. This is interesting because it requires compute pipelines "
19749 "to have a proper descriptor use walk, which they didn't for some time.");
19750 m_errorMonitor->ExpectSuccess();
19751
19752 ASSERT_NO_FATAL_FAILURE(InitState());
19753
19754 char const *csSource = "#version 450\n"
19755 "\n"
19756 "layout(local_size_x=1) in;\n"
19757 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
19758 "void main(){\n"
19759 " // x is not used.\n"
19760 "}\n";
19761
19762 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19763
19764 VkDescriptorSetObj descriptorSet(m_device);
19765 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19766
19767 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19768 nullptr,
19769 0,
19770 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19771 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19772 descriptorSet.GetPipelineLayout(),
19773 VK_NULL_HANDLE,
19774 -1 };
19775
19776 VkPipeline pipe;
19777 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19778
19779 m_errorMonitor->VerifyNotFound();
19780
19781 if (err == VK_SUCCESS) {
19782 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19783 }
19784}
19785
19786TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
19787 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
19788 "sampler portion of a combined image + sampler");
19789 m_errorMonitor->ExpectSuccess();
19790
19791 ASSERT_NO_FATAL_FAILURE(InitState());
19792
19793 VkDescriptorSetLayoutBinding bindings[] = {
19794 { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19795 { 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19796 { 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19797 };
19798 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings };
19799 VkDescriptorSetLayout dsl;
19800 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19801 ASSERT_VK_SUCCESS(err);
19802
19803 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19804 VkPipelineLayout pl;
19805 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19806 ASSERT_VK_SUCCESS(err);
19807
19808 char const *csSource = "#version 450\n"
19809 "\n"
19810 "layout(local_size_x=1) in;\n"
19811 "layout(set=0, binding=0) uniform sampler s;\n"
19812 "layout(set=0, binding=1) uniform texture2D t;\n"
19813 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
19814 "void main() {\n"
19815 " x = texture(sampler2D(t, s), vec2(0));\n"
19816 "}\n";
19817 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19818
19819 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19820 nullptr,
19821 0,
19822 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19823 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19824 pl,
19825 VK_NULL_HANDLE,
19826 -1 };
19827
19828 VkPipeline pipe;
19829 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19830
19831 m_errorMonitor->VerifyNotFound();
19832
19833 if (err == VK_SUCCESS) {
19834 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19835 }
19836
19837 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19838 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19839}
19840
19841TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
19842 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
19843 "image portion of a combined image + sampler");
19844 m_errorMonitor->ExpectSuccess();
19845
19846 ASSERT_NO_FATAL_FAILURE(InitState());
19847
19848 VkDescriptorSetLayoutBinding bindings[] = {
19849 { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19850 { 1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19851 { 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19852 };
19853 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings };
19854 VkDescriptorSetLayout dsl;
19855 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19856 ASSERT_VK_SUCCESS(err);
19857
19858 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19859 VkPipelineLayout pl;
19860 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19861 ASSERT_VK_SUCCESS(err);
19862
19863 char const *csSource = "#version 450\n"
19864 "\n"
19865 "layout(local_size_x=1) in;\n"
19866 "layout(set=0, binding=0) uniform texture2D t;\n"
19867 "layout(set=0, binding=1) uniform sampler s;\n"
19868 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
19869 "void main() {\n"
19870 " x = texture(sampler2D(t, s), vec2(0));\n"
19871 "}\n";
19872 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19873
19874 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19875 nullptr,
19876 0,
19877 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19878 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19879 pl,
19880 VK_NULL_HANDLE,
19881 -1 };
19882
19883 VkPipeline pipe;
19884 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19885
19886 m_errorMonitor->VerifyNotFound();
19887
19888 if (err == VK_SUCCESS) {
19889 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19890 }
19891
19892 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19893 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19894}
19895
19896TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
19897 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
19898 "both the sampler and the image of a combined image+sampler "
19899 "but via separate variables");
19900 m_errorMonitor->ExpectSuccess();
19901
19902 ASSERT_NO_FATAL_FAILURE(InitState());
19903
19904 VkDescriptorSetLayoutBinding bindings[] = {
19905 { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19906 { 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19907 };
19908 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings };
19909 VkDescriptorSetLayout dsl;
19910 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19911 ASSERT_VK_SUCCESS(err);
19912
19913 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19914 VkPipelineLayout pl;
19915 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19916 ASSERT_VK_SUCCESS(err);
19917
19918 char const *csSource = "#version 450\n"
19919 "\n"
19920 "layout(local_size_x=1) in;\n"
19921 "layout(set=0, binding=0) uniform texture2D t;\n"
19922 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
19923 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
19924 "void main() {\n"
19925 " x = texture(sampler2D(t, s), vec2(0));\n"
19926 "}\n";
19927 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19928
19929 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19930 nullptr,
19931 0,
19932 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19933 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19934 pl,
19935 VK_NULL_HANDLE,
19936 -1 };
19937
19938 VkPipeline pipe;
19939 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19940
19941 m_errorMonitor->VerifyNotFound();
19942
19943 if (err == VK_SUCCESS) {
19944 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19945 }
19946
19947 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19948 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19949}
19950
19951TEST_F(VkPositiveLayerTest, ValidStructPNext) {
19952 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
19953
19954 ASSERT_NO_FATAL_FAILURE(InitState());
19955
19956 // Positive test to check parameter_validation and unique_objects support
19957 // for NV_dedicated_allocation
19958 uint32_t extension_count = 0;
19959 bool supports_nv_dedicated_allocation = false;
19960 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
19961 ASSERT_VK_SUCCESS(err);
19962
19963 if (extension_count > 0) {
19964 std::vector<VkExtensionProperties> available_extensions(extension_count);
19965
19966 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
19967 ASSERT_VK_SUCCESS(err);
19968
19969 for (const auto &extension_props : available_extensions) {
19970 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
19971 supports_nv_dedicated_allocation = true;
19972 }
19973 }
19974 }
19975
19976 if (supports_nv_dedicated_allocation) {
19977 m_errorMonitor->ExpectSuccess();
19978
19979 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
19980 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
19981 dedicated_buffer_create_info.pNext = nullptr;
19982 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
19983
19984 uint32_t queue_family_index = 0;
19985 VkBufferCreateInfo buffer_create_info = {};
19986 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19987 buffer_create_info.pNext = &dedicated_buffer_create_info;
19988 buffer_create_info.size = 1024;
19989 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19990 buffer_create_info.queueFamilyIndexCount = 1;
19991 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
19992
19993 VkBuffer buffer;
19994 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
19995 ASSERT_VK_SUCCESS(err);
19996
19997 VkMemoryRequirements memory_reqs;
19998 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
19999
20000 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
20001 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
20002 dedicated_memory_info.pNext = nullptr;
20003 dedicated_memory_info.buffer = buffer;
20004 dedicated_memory_info.image = VK_NULL_HANDLE;
20005
20006 VkMemoryAllocateInfo memory_info = {};
20007 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20008 memory_info.pNext = &dedicated_memory_info;
20009 memory_info.allocationSize = memory_reqs.size;
20010
20011 bool pass;
20012 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20013 ASSERT_TRUE(pass);
20014
20015 VkDeviceMemory buffer_memory;
20016 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
20017 ASSERT_VK_SUCCESS(err);
20018
20019 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
20020 ASSERT_VK_SUCCESS(err);
20021
20022 vkDestroyBuffer(m_device->device(), buffer, NULL);
20023 vkFreeMemory(m_device->device(), buffer_memory, NULL);
20024
20025 m_errorMonitor->VerifyNotFound();
20026 }
20027}
20028
20029TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
20030 VkResult err;
20031
20032 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
20033
20034 ASSERT_NO_FATAL_FAILURE(InitState());
20035 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20036
20037 std::vector<const char *> device_extension_names;
20038 auto features = m_device->phy().features();
20039 // Artificially disable support for non-solid fill modes
20040 features.fillModeNonSolid = false;
20041 // The sacrificial device object
20042 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
20043
20044 VkRenderpassObj render_pass(&test_device);
20045
20046 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20047 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20048 pipeline_layout_ci.setLayoutCount = 0;
20049 pipeline_layout_ci.pSetLayouts = NULL;
20050
20051 VkPipelineLayout pipeline_layout;
20052 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20053 ASSERT_VK_SUCCESS(err);
20054
20055 VkPipelineRasterizationStateCreateInfo rs_ci = {};
20056 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
20057 rs_ci.pNext = nullptr;
20058 rs_ci.lineWidth = 1.0f;
20059 rs_ci.rasterizerDiscardEnable = true;
20060
20061 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
20062 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20063
20064 // Set polygonMode=FILL. No error is expected
20065 m_errorMonitor->ExpectSuccess();
20066 {
20067 VkPipelineObj pipe(&test_device);
20068 pipe.AddShader(&vs);
20069 pipe.AddShader(&fs);
20070 pipe.AddColorAttachment();
20071 // Set polygonMode to a good value
20072 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
20073 pipe.SetRasterization(&rs_ci);
20074 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
20075 }
20076 m_errorMonitor->VerifyNotFound();
20077
20078 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
20079}
20080
20081TEST_F(VkPositiveLayerTest, ValidPushConstants) {
20082 VkResult err;
20083 ASSERT_NO_FATAL_FAILURE(InitState());
20084 ASSERT_NO_FATAL_FAILURE(InitViewport());
20085 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20086
20087 VkPipelineLayout pipeline_layout;
20088 VkPushConstantRange pc_range = {};
20089 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20090 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20091 pipeline_layout_ci.pushConstantRangeCount = 1;
20092 pipeline_layout_ci.pPushConstantRanges = &pc_range;
20093
20094 //
20095 // Check for invalid push constant ranges in pipeline layouts.
20096 //
20097 struct PipelineLayoutTestCase {
20098 VkPushConstantRange const range;
20099 char const *msg;
20100 };
20101
20102 // Check for overlapping ranges
20103 const uint32_t ranges_per_test = 5;
20104 struct OverlappingRangeTestCase {
20105 VkPushConstantRange const ranges[ranges_per_test];
20106 char const *msg;
20107 };
20108
20109 // Run some positive tests to make sure overlap checking in the layer is OK
20110 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos = { { { { { VK_SHADER_STAGE_VERTEX_BIT, 0, 4 },
20111 { VK_SHADER_STAGE_VERTEX_BIT, 4, 4 },
20112 { VK_SHADER_STAGE_VERTEX_BIT, 8, 4 },
20113 { VK_SHADER_STAGE_VERTEX_BIT, 12, 4 },
20114 { VK_SHADER_STAGE_VERTEX_BIT, 16, 4 } },
20115 "" },
20116 { { { VK_SHADER_STAGE_VERTEX_BIT, 92, 24 },
20117 { VK_SHADER_STAGE_VERTEX_BIT, 80, 4 },
20118 { VK_SHADER_STAGE_VERTEX_BIT, 64, 8 },
20119 { VK_SHADER_STAGE_VERTEX_BIT, 4, 16 },
20120 { VK_SHADER_STAGE_VERTEX_BIT, 0, 4 } },
20121 "" } } };
20122 for (const auto &iter : overlapping_range_tests_pos) {
20123 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
20124 m_errorMonitor->ExpectSuccess();
20125 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20126 m_errorMonitor->VerifyNotFound();
20127 if (VK_SUCCESS == err) {
20128 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20129 }
20130 }
20131
20132 //
20133 // CmdPushConstants tests
20134 //
20135 const uint8_t dummy_values[100] = {};
20136
20137 BeginCommandBuffer();
20138
20139 // positive overlapping range tests with cmd
20140 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = { {
20141 { { VK_SHADER_STAGE_VERTEX_BIT, 0, 16 }, "" },
20142 { { VK_SHADER_STAGE_VERTEX_BIT, 0, 4 }, "" },
20143 { { VK_SHADER_STAGE_VERTEX_BIT, 20, 12 }, "" },
20144 { { VK_SHADER_STAGE_VERTEX_BIT, 56, 36 }, "" },
20145 } };
20146
20147 // Setup ranges: [0,16) [20,36) [36,44) [44,52) [56,80) [80,92)
20148 const VkPushConstantRange pc_range4[] = {
20149 { VK_SHADER_STAGE_VERTEX_BIT, 20, 16 },{ VK_SHADER_STAGE_VERTEX_BIT, 0, 16 },{ VK_SHADER_STAGE_VERTEX_BIT, 44, 8 },
20150 { VK_SHADER_STAGE_VERTEX_BIT, 80, 12 },{ VK_SHADER_STAGE_VERTEX_BIT, 36, 8 },{ VK_SHADER_STAGE_VERTEX_BIT, 56, 24 },
20151 };
20152
20153 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range4) / sizeof(VkPushConstantRange);
20154 pipeline_layout_ci.pPushConstantRanges = pc_range4;
20155 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20156 ASSERT_VK_SUCCESS(err);
20157 for (const auto &iter : cmd_overlap_tests_pos) {
20158 m_errorMonitor->ExpectSuccess();
20159 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
20160 iter.range.size, dummy_values);
20161 m_errorMonitor->VerifyNotFound();
20162 }
20163 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20164
20165 EndCommandBuffer();
20166}
20167
20168
20169
20170
20171
20172
20173
20174#if 0 // A few devices have issues with this test so disabling for now
20175TEST_F(VkPositiveLayerTest, LongFenceChain)
20176{
20177 m_errorMonitor->ExpectSuccess();
20178
20179 ASSERT_NO_FATAL_FAILURE(InitState());
20180 VkResult err;
20181
20182 std::vector<VkFence> fences;
20183
20184 const int chainLength = 32768;
20185
20186 for (int i = 0; i < chainLength; i++) {
20187 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
20188 VkFence fence;
20189 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
20190 ASSERT_VK_SUCCESS(err);
20191
20192 fences.push_back(fence);
20193
20194 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
20195 0, nullptr, 0, nullptr };
20196 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
20197 ASSERT_VK_SUCCESS(err);
20198
20199 }
20200
20201 // BOOM, stack overflow.
20202 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
20203
20204 for (auto fence : fences)
20205 vkDestroyFence(m_device->device(), fence, nullptr);
20206
20207 m_errorMonitor->VerifyNotFound();
20208}
20209#endif
20210
20211
Cody Northrop1242dfd2016-07-13 17:24:59 -060020212#if defined(ANDROID) && defined(VALIDATION_APK)
20213static bool initialized = false;
20214static bool active = false;
20215
20216// Convert Intents to argv
20217// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020218std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020219 std::vector<std::string> args;
20220 JavaVM &vm = *app.activity->vm;
20221 JNIEnv *p_env;
20222 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK)
20223 return args;
20224
20225 JNIEnv &env = *p_env;
20226 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020227 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060020228 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020229 jmethodID get_string_extra_method =
20230 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060020231 jvalue get_string_extra_args;
20232 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020233 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060020234
20235 std::string args_str;
20236 if (extra_str) {
20237 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
20238 args_str = extra_utf;
20239 env.ReleaseStringUTFChars(extra_str, extra_utf);
20240 env.DeleteLocalRef(extra_str);
20241 }
20242
20243 env.DeleteLocalRef(get_string_extra_args.l);
20244 env.DeleteLocalRef(intent);
20245 vm.DetachCurrentThread();
20246
20247 // split args_str
20248 std::stringstream ss(args_str);
20249 std::string arg;
20250 while (std::getline(ss, arg, ' ')) {
20251 if (!arg.empty())
20252 args.push_back(arg);
20253 }
20254
20255 return args;
20256}
20257
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020258static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020259
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020260static void processCommand(struct android_app *app, int32_t cmd) {
20261 switch (cmd) {
20262 case APP_CMD_INIT_WINDOW: {
20263 if (app->window) {
20264 initialized = true;
Cody Northrop1242dfd2016-07-13 17:24:59 -060020265 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020266 break;
20267 }
20268 case APP_CMD_GAINED_FOCUS: {
20269 active = true;
20270 break;
20271 }
20272 case APP_CMD_LOST_FOCUS: {
20273 active = false;
20274 break;
20275 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020276 }
20277}
20278
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020279void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020280 app_dummy();
20281
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020282 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060020283
20284 int vulkanSupport = InitVulkan();
20285 if (vulkanSupport == 0) {
20286 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
20287 return;
20288 }
20289
20290 app->onAppCmd = processCommand;
20291 app->onInputEvent = processInput;
20292
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020293 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020294 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020295 struct android_poll_source *source;
20296 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020297 if (source) {
20298 source->process(app, source);
20299 }
20300
20301 if (app->destroyRequested != 0) {
20302 VkTestFramework::Finish();
20303 return;
20304 }
20305 }
20306
20307 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020308 // Use the following key to send arguments to gtest, i.e.
20309 // --es args "--gtest_filter=-VkLayerTest.foo"
20310 const char key[] = "args";
20311 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020312
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020313 std::string filter = "";
20314 if (args.size() > 0) {
20315 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
20316 filter += args[0];
20317 } else {
20318 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
20319 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020320
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020321 int argc = 2;
20322 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
20323 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020324
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020325 // Route output to files until we can override the gtest output
20326 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
20327 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020328
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020329 ::testing::InitGoogleTest(&argc, argv);
20330 VkTestFramework::InitArgs(&argc, argv);
20331 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020332
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020333 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060020334
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020335 if (result != 0) {
20336 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
20337 } else {
20338 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
20339 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020340
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020341 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060020342
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020343 fclose(stdout);
20344 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020345
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020346 ANativeActivity_finish(app->activity);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020347
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020348 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060020349 }
20350 }
20351}
20352#endif
20353
Tony Barbour300a6082015-04-07 13:44:53 -060020354int main(int argc, char **argv) {
20355 int result;
20356
Cody Northrop8e54a402016-03-08 22:25:52 -070020357#ifdef ANDROID
20358 int vulkanSupport = InitVulkan();
20359 if (vulkanSupport == 0)
20360 return 1;
20361#endif
20362
Tony Barbour300a6082015-04-07 13:44:53 -060020363 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060020364 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060020365
20366 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
20367
20368 result = RUN_ALL_TESTS();
20369
Tony Barbour6918cd52015-04-09 12:58:51 -060020370 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060020371 return result;
20372}