blob: b0fff156c33bf7082a29a9f92556ae3da71bff31 [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*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007127
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 Lobodzinski61dddf92016-12-16 14:54:59 -07007131 TEST_DESCRIPTION("Set scissor and viewport counts to different numbers");
7132
Mark Lobodzinski6fcae552016-12-18 08:57:03 -07007133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007134
Tobin Ehlise68360f2015-10-01 11:15:13 -06007135 ASSERT_NO_FATAL_FAILURE(InitState());
7136 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007137
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007138 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007139 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7140 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007141
7142 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007143 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7144 ds_pool_ci.maxSets = 1;
7145 ds_pool_ci.poolSizeCount = 1;
7146 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007147
7148 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007149 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007150 ASSERT_VK_SUCCESS(err);
7151
7152 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007153 dsl_binding.binding = 0;
7154 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7155 dsl_binding.descriptorCount = 1;
7156 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007157
7158 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007159 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7160 ds_layout_ci.bindingCount = 1;
7161 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007162
7163 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007164 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007165 ASSERT_VK_SUCCESS(err);
7166
7167 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007168 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007169 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007170 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007171 alloc_info.descriptorPool = ds_pool;
7172 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007173 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007174 ASSERT_VK_SUCCESS(err);
7175
7176 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007177 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7178 pipeline_layout_ci.setLayoutCount = 1;
7179 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007180
7181 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007182 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007183 ASSERT_VK_SUCCESS(err);
7184
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007185 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007186
7187 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007188 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7189 vp_state_ci.scissorCount = 0;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007190 // Count mismatch should cause error
7191 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007192 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007193
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007194 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7195 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7196 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7197 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7198 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7199 rs_state_ci.depthClampEnable = VK_FALSE;
7200 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7201 rs_state_ci.depthBiasEnable = VK_FALSE;
7202
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007203 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7204 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7205 vi_ci.pNext = nullptr;
7206 vi_ci.vertexBindingDescriptionCount = 0;
7207 vi_ci.pVertexBindingDescriptions = nullptr;
7208 vi_ci.vertexAttributeDescriptionCount = 0;
7209 vi_ci.pVertexAttributeDescriptions = nullptr;
7210
7211 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7212 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7213 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7214
7215 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7216 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7217 pipe_ms_state_ci.pNext = NULL;
7218 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7219 pipe_ms_state_ci.sampleShadingEnable = 0;
7220 pipe_ms_state_ci.minSampleShading = 1.0;
7221 pipe_ms_state_ci.pSampleMask = NULL;
7222
Cody Northropeb3a6c12015-10-05 14:44:45 -06007223 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007224 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007225
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007226 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007227 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7228 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007229 shaderStages[0] = vs.GetStageCreateInfo();
7230 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007231
7232 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007233 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7234 gp_ci.stageCount = 2;
7235 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007236 gp_ci.pVertexInputState = &vi_ci;
7237 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007238 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007239 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007240 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007241 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7242 gp_ci.layout = pipeline_layout;
7243 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007244
7245 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007246 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007247
7248 VkPipeline pipeline;
7249 VkPipelineCache pipelineCache;
7250
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007251 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007252 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007253 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007254
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007255 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007256
Chia-I Wuf7458c52015-10-26 21:10:41 +08007257 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7258 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7259 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7260 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007261}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007262
7263// Don't set viewport state in PSO. This is an error b/c we always need this state for the counts even if the data is going to be
7264// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007265TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007266 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007267
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007268 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7269
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007271
Tobin Ehlise68360f2015-10-01 11:15:13 -06007272 ASSERT_NO_FATAL_FAILURE(InitState());
7273 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007274
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007275 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007276 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7277 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007278
7279 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007280 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7281 ds_pool_ci.maxSets = 1;
7282 ds_pool_ci.poolSizeCount = 1;
7283 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007284
7285 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007286 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007287 ASSERT_VK_SUCCESS(err);
7288
7289 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007290 dsl_binding.binding = 0;
7291 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7292 dsl_binding.descriptorCount = 1;
7293 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007294
7295 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007296 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7297 ds_layout_ci.bindingCount = 1;
7298 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007299
7300 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007301 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007302 ASSERT_VK_SUCCESS(err);
7303
7304 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007305 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007306 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007307 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007308 alloc_info.descriptorPool = ds_pool;
7309 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007310 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007311 ASSERT_VK_SUCCESS(err);
7312
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007313 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7314 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7315 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7316
7317 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7318 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7319 vi_ci.pNext = nullptr;
7320 vi_ci.vertexBindingDescriptionCount = 0;
7321 vi_ci.pVertexBindingDescriptions = nullptr;
7322 vi_ci.vertexAttributeDescriptionCount = 0;
7323 vi_ci.pVertexAttributeDescriptions = nullptr;
7324
7325 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7326 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7327 pipe_ms_state_ci.pNext = NULL;
7328 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7329 pipe_ms_state_ci.sampleShadingEnable = 0;
7330 pipe_ms_state_ci.minSampleShading = 1.0;
7331 pipe_ms_state_ci.pSampleMask = NULL;
7332
Tobin Ehlise68360f2015-10-01 11:15:13 -06007333 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007334 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7335 pipeline_layout_ci.setLayoutCount = 1;
7336 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007337
7338 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007339 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007340 ASSERT_VK_SUCCESS(err);
7341
7342 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7343 // Set scissor as dynamic to avoid second error
7344 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007345 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7346 dyn_state_ci.dynamicStateCount = 1;
7347 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007348
Cody Northropeb3a6c12015-10-05 14:44:45 -06007349 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007350 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007351
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007352 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007353 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7354 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007355 shaderStages[0] = vs.GetStageCreateInfo();
7356 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007357
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007358 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7359 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7360 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7361 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7362 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7363 rs_state_ci.depthClampEnable = VK_FALSE;
7364 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7365 rs_state_ci.depthBiasEnable = VK_FALSE;
7366
Tobin Ehlise68360f2015-10-01 11:15:13 -06007367 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007368 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7369 gp_ci.stageCount = 2;
7370 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007371 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007372 // Not setting VP state w/o dynamic vp state should cause validation error
7373 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007374 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007375 gp_ci.pVertexInputState = &vi_ci;
7376 gp_ci.pInputAssemblyState = &ia_ci;
7377 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007378 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7379 gp_ci.layout = pipeline_layout;
7380 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007381
7382 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007383 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007384
7385 VkPipeline pipeline;
7386 VkPipelineCache pipelineCache;
7387
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007388 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007389 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007390 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007391
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007392 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007393
Chia-I Wuf7458c52015-10-26 21:10:41 +08007394 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7395 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7396 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7397 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007398}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007399
7400// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7401// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007402TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7403 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007404
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007406
Tobin Ehlise68360f2015-10-01 11:15:13 -06007407 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007408
7409 if (!m_device->phy().features().multiViewport) {
7410 printf("Device does not support multiple viewports/scissors; skipped.\n");
7411 return;
7412 }
7413
Tobin Ehlise68360f2015-10-01 11:15:13 -06007414 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007415
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007416 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007417 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7418 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007419
7420 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007421 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7422 ds_pool_ci.maxSets = 1;
7423 ds_pool_ci.poolSizeCount = 1;
7424 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007425
7426 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007427 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007428 ASSERT_VK_SUCCESS(err);
7429
7430 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007431 dsl_binding.binding = 0;
7432 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7433 dsl_binding.descriptorCount = 1;
7434 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007435
7436 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007437 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7438 ds_layout_ci.bindingCount = 1;
7439 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007440
7441 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007442 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007443 ASSERT_VK_SUCCESS(err);
7444
7445 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007446 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007447 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007448 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007449 alloc_info.descriptorPool = ds_pool;
7450 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007451 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007452 ASSERT_VK_SUCCESS(err);
7453
7454 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007455 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7456 pipeline_layout_ci.setLayoutCount = 1;
7457 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007458
7459 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007460 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007461 ASSERT_VK_SUCCESS(err);
7462
7463 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007464 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7465 vp_state_ci.viewportCount = 1;
7466 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
7467 vp_state_ci.scissorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007468 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06007469
7470 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7471 // Set scissor as dynamic to avoid that error
7472 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007473 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7474 dyn_state_ci.dynamicStateCount = 1;
7475 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007476
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007477 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7478 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7479 pipe_ms_state_ci.pNext = NULL;
7480 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7481 pipe_ms_state_ci.sampleShadingEnable = 0;
7482 pipe_ms_state_ci.minSampleShading = 1.0;
7483 pipe_ms_state_ci.pSampleMask = NULL;
7484
Cody Northropeb3a6c12015-10-05 14:44:45 -06007485 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007486 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007487
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007488 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007489 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7490 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007491 shaderStages[0] = vs.GetStageCreateInfo();
7492 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007493
Cody Northropf6622dc2015-10-06 10:33:21 -06007494 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7495 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7496 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007497 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007498 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007499 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007500 vi_ci.pVertexAttributeDescriptions = nullptr;
7501
7502 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7503 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7504 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7505
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007506 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007507 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007508 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06007509 rs_ci.pNext = nullptr;
7510
Mark Youngc89c6312016-03-31 16:03:20 -06007511 VkPipelineColorBlendAttachmentState att = {};
7512 att.blendEnable = VK_FALSE;
7513 att.colorWriteMask = 0xf;
7514
Cody Northropf6622dc2015-10-06 10:33:21 -06007515 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7516 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7517 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007518 cb_ci.attachmentCount = 1;
7519 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06007520
Tobin Ehlise68360f2015-10-01 11:15:13 -06007521 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007522 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7523 gp_ci.stageCount = 2;
7524 gp_ci.pStages = shaderStages;
7525 gp_ci.pVertexInputState = &vi_ci;
7526 gp_ci.pInputAssemblyState = &ia_ci;
7527 gp_ci.pViewportState = &vp_state_ci;
7528 gp_ci.pRasterizationState = &rs_ci;
7529 gp_ci.pColorBlendState = &cb_ci;
7530 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007531 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007532 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7533 gp_ci.layout = pipeline_layout;
7534 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007535
7536 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007537 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007538
7539 VkPipeline pipeline;
7540 VkPipelineCache pipelineCache;
7541
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007542 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007543 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007544 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007545
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007546 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007547
Tobin Ehlisd332f282015-10-02 11:00:56 -06007548 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07007549 // First need to successfully create the PSO from above by setting
7550 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06007551 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 -07007552
7553 VkViewport vp = {}; // Just need dummy vp to point to
7554 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007555 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007556 ASSERT_VK_SUCCESS(err);
7557 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007558 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007559 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07007560 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007561 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07007562 Draw(1, 0, 0, 0);
7563
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007564 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007565
7566 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7567 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7568 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7569 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007570 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007571}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007572
7573// Create PSO w/o non-zero scissorCount but no scissor data, then run second test where dynamic viewportCount doesn't match PSO
Karl Schultz6addd812016-02-02 17:17:23 -07007574// viewportCount
7575TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
7576 VkResult err;
7577
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07007579
7580 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007581
7582 if (!m_device->phy().features().multiViewport) {
7583 printf("Device does not support multiple viewports/scissors; skipped.\n");
7584 return;
7585 }
7586
Karl Schultz6addd812016-02-02 17:17:23 -07007587 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7588
7589 VkDescriptorPoolSize ds_type_count = {};
7590 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7591 ds_type_count.descriptorCount = 1;
7592
7593 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7594 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7595 ds_pool_ci.maxSets = 1;
7596 ds_pool_ci.poolSizeCount = 1;
7597 ds_pool_ci.pPoolSizes = &ds_type_count;
7598
7599 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007600 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07007601 ASSERT_VK_SUCCESS(err);
7602
7603 VkDescriptorSetLayoutBinding dsl_binding = {};
7604 dsl_binding.binding = 0;
7605 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7606 dsl_binding.descriptorCount = 1;
7607 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7608
7609 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7610 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7611 ds_layout_ci.bindingCount = 1;
7612 ds_layout_ci.pBindings = &dsl_binding;
7613
7614 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007615 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07007616 ASSERT_VK_SUCCESS(err);
7617
7618 VkDescriptorSet descriptorSet;
7619 VkDescriptorSetAllocateInfo alloc_info = {};
7620 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7621 alloc_info.descriptorSetCount = 1;
7622 alloc_info.descriptorPool = ds_pool;
7623 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007624 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07007625 ASSERT_VK_SUCCESS(err);
7626
7627 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7628 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7629 pipeline_layout_ci.setLayoutCount = 1;
7630 pipeline_layout_ci.pSetLayouts = &ds_layout;
7631
7632 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007633 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07007634 ASSERT_VK_SUCCESS(err);
7635
7636 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7637 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7638 vp_state_ci.scissorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007639 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007640 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007641 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007642
7643 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
7644 // Set scissor as dynamic to avoid that error
7645 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7646 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7647 dyn_state_ci.dynamicStateCount = 1;
7648 dyn_state_ci.pDynamicStates = &vp_state;
7649
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007650 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7651 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7652 pipe_ms_state_ci.pNext = NULL;
7653 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7654 pipe_ms_state_ci.sampleShadingEnable = 0;
7655 pipe_ms_state_ci.minSampleShading = 1.0;
7656 pipe_ms_state_ci.pSampleMask = NULL;
7657
Karl Schultz6addd812016-02-02 17:17:23 -07007658 VkPipelineShaderStageCreateInfo shaderStages[2];
7659 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7660
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007661 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007662 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7663 // We shouldn't need a fragment shader but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07007664 shaderStages[0] = vs.GetStageCreateInfo();
7665 shaderStages[1] = fs.GetStageCreateInfo();
7666
7667 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7668 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7669 vi_ci.pNext = nullptr;
7670 vi_ci.vertexBindingDescriptionCount = 0;
7671 vi_ci.pVertexBindingDescriptions = nullptr;
7672 vi_ci.vertexAttributeDescriptionCount = 0;
7673 vi_ci.pVertexAttributeDescriptions = nullptr;
7674
7675 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7676 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7677 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7678
7679 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7680 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007681 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07007682 rs_ci.pNext = nullptr;
7683
Mark Youngc89c6312016-03-31 16:03:20 -06007684 VkPipelineColorBlendAttachmentState att = {};
7685 att.blendEnable = VK_FALSE;
7686 att.colorWriteMask = 0xf;
7687
Karl Schultz6addd812016-02-02 17:17:23 -07007688 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7689 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7690 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007691 cb_ci.attachmentCount = 1;
7692 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07007693
7694 VkGraphicsPipelineCreateInfo gp_ci = {};
7695 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7696 gp_ci.stageCount = 2;
7697 gp_ci.pStages = shaderStages;
7698 gp_ci.pVertexInputState = &vi_ci;
7699 gp_ci.pInputAssemblyState = &ia_ci;
7700 gp_ci.pViewportState = &vp_state_ci;
7701 gp_ci.pRasterizationState = &rs_ci;
7702 gp_ci.pColorBlendState = &cb_ci;
7703 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007704 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007705 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7706 gp_ci.layout = pipeline_layout;
7707 gp_ci.renderPass = renderPass();
7708
7709 VkPipelineCacheCreateInfo pc_ci = {};
7710 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7711
7712 VkPipeline pipeline;
7713 VkPipelineCache pipelineCache;
7714
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007715 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07007716 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007717 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007718
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007719 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007720
7721 // Now hit second fail case where we set scissor w/ different count than PSO
7722 // First need to successfully create the PSO from above by setting
7723 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06007724 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 -06007725
Tobin Ehlisd332f282015-10-02 11:00:56 -06007726 VkRect2D sc = {}; // Just need dummy vp to point to
7727 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007728 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007729 ASSERT_VK_SUCCESS(err);
7730 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007731 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007732 VkViewport viewports[1] = {};
7733 viewports[0].width = 8;
7734 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06007735 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007736 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007737 Draw(1, 0, 0, 0);
7738
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007739 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007740
Chia-I Wuf7458c52015-10-26 21:10:41 +08007741 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7742 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7743 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7744 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007745 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007746}
7747
Mark Young7394fdd2016-03-31 14:56:43 -06007748TEST_F(VkLayerTest, PSOLineWidthInvalid) {
7749 VkResult err;
7750
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06007752
7753 ASSERT_NO_FATAL_FAILURE(InitState());
7754 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7755
7756 VkDescriptorPoolSize ds_type_count = {};
7757 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7758 ds_type_count.descriptorCount = 1;
7759
7760 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7761 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7762 ds_pool_ci.maxSets = 1;
7763 ds_pool_ci.poolSizeCount = 1;
7764 ds_pool_ci.pPoolSizes = &ds_type_count;
7765
7766 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007767 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06007768 ASSERT_VK_SUCCESS(err);
7769
7770 VkDescriptorSetLayoutBinding dsl_binding = {};
7771 dsl_binding.binding = 0;
7772 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7773 dsl_binding.descriptorCount = 1;
7774 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7775
7776 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7777 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7778 ds_layout_ci.bindingCount = 1;
7779 ds_layout_ci.pBindings = &dsl_binding;
7780
7781 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007782 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06007783 ASSERT_VK_SUCCESS(err);
7784
7785 VkDescriptorSet descriptorSet;
7786 VkDescriptorSetAllocateInfo alloc_info = {};
7787 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7788 alloc_info.descriptorSetCount = 1;
7789 alloc_info.descriptorPool = ds_pool;
7790 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007791 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06007792 ASSERT_VK_SUCCESS(err);
7793
7794 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7795 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7796 pipeline_layout_ci.setLayoutCount = 1;
7797 pipeline_layout_ci.pSetLayouts = &ds_layout;
7798
7799 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007800 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06007801 ASSERT_VK_SUCCESS(err);
7802
7803 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7804 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7805 vp_state_ci.scissorCount = 1;
7806 vp_state_ci.pScissors = NULL;
7807 vp_state_ci.viewportCount = 1;
7808 vp_state_ci.pViewports = NULL;
7809
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007810 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06007811 // Set scissor as dynamic to avoid that error
7812 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7813 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7814 dyn_state_ci.dynamicStateCount = 2;
7815 dyn_state_ci.pDynamicStates = dynamic_states;
7816
7817 VkPipelineShaderStageCreateInfo shaderStages[2];
7818 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7819
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007820 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7821 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Young7394fdd2016-03-31 14:56:43 -06007822 this); // TODO - We shouldn't need a fragment shader
7823 // but add it to be able to run on more devices
7824 shaderStages[0] = vs.GetStageCreateInfo();
7825 shaderStages[1] = fs.GetStageCreateInfo();
7826
7827 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7828 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7829 vi_ci.pNext = nullptr;
7830 vi_ci.vertexBindingDescriptionCount = 0;
7831 vi_ci.pVertexBindingDescriptions = nullptr;
7832 vi_ci.vertexAttributeDescriptionCount = 0;
7833 vi_ci.pVertexAttributeDescriptions = nullptr;
7834
7835 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7836 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7837 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7838
7839 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7840 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7841 rs_ci.pNext = nullptr;
7842
Mark Young47107952016-05-02 15:59:55 -06007843 // Check too low (line width of -1.0f).
7844 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06007845
7846 VkPipelineColorBlendAttachmentState att = {};
7847 att.blendEnable = VK_FALSE;
7848 att.colorWriteMask = 0xf;
7849
7850 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7851 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7852 cb_ci.pNext = nullptr;
7853 cb_ci.attachmentCount = 1;
7854 cb_ci.pAttachments = &att;
7855
7856 VkGraphicsPipelineCreateInfo gp_ci = {};
7857 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7858 gp_ci.stageCount = 2;
7859 gp_ci.pStages = shaderStages;
7860 gp_ci.pVertexInputState = &vi_ci;
7861 gp_ci.pInputAssemblyState = &ia_ci;
7862 gp_ci.pViewportState = &vp_state_ci;
7863 gp_ci.pRasterizationState = &rs_ci;
7864 gp_ci.pColorBlendState = &cb_ci;
7865 gp_ci.pDynamicState = &dyn_state_ci;
7866 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7867 gp_ci.layout = pipeline_layout;
7868 gp_ci.renderPass = renderPass();
7869
7870 VkPipelineCacheCreateInfo pc_ci = {};
7871 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7872
7873 VkPipeline pipeline;
7874 VkPipelineCache pipelineCache;
7875
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007876 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007877 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007878 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007879
7880 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06007881 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007882
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06007884
7885 // Check too high (line width of 65536.0f).
7886 rs_ci.lineWidth = 65536.0f;
7887
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007888 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007889 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007890 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007891
7892 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06007893 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007894
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06007896
7897 dyn_state_ci.dynamicStateCount = 3;
7898
7899 rs_ci.lineWidth = 1.0f;
7900
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007901 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007902 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007903 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007904 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007905 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007906
7907 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06007908 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06007909 m_errorMonitor->VerifyFound();
7910
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06007912
7913 // Check too high with dynamic setting.
7914 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
7915 m_errorMonitor->VerifyFound();
7916 EndCommandBuffer();
7917
7918 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7919 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7920 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7921 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007922 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007923}
7924
Karl Schultz6addd812016-02-02 17:17:23 -07007925TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007926 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7928 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007929
7930 ASSERT_NO_FATAL_FAILURE(InitState());
7931 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007932
Tony Barbourfe3351b2015-07-28 10:17:20 -06007933 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007934 // Don't care about RenderPass handle b/c error should be flagged before
7935 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007936 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007937
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007938 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007939}
7940
Karl Schultz6addd812016-02-02 17:17:23 -07007941TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007942 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7944 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007945
7946 ASSERT_NO_FATAL_FAILURE(InitState());
7947 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007948
Tony Barbourfe3351b2015-07-28 10:17:20 -06007949 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007950 // Just create a dummy Renderpass that's non-NULL so we can get to the
7951 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007952 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007953
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007954 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007955}
7956
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007957TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
7958 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
7959 "the number of renderPass attachments that use loadOp"
7960 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
7961
7962 ASSERT_NO_FATAL_FAILURE(InitState());
7963 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7964
7965 // Create a renderPass with a single attachment that uses loadOp CLEAR
7966 VkAttachmentReference attach = {};
7967 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7968 VkSubpassDescription subpass = {};
7969 subpass.inputAttachmentCount = 1;
7970 subpass.pInputAttachments = &attach;
7971 VkRenderPassCreateInfo rpci = {};
7972 rpci.subpassCount = 1;
7973 rpci.pSubpasses = &subpass;
7974 rpci.attachmentCount = 1;
7975 VkAttachmentDescription attach_desc = {};
7976 attach_desc.format = VK_FORMAT_UNDEFINED;
7977 // Set loadOp to CLEAR
7978 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7979 rpci.pAttachments = &attach_desc;
7980 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
7981 VkRenderPass rp;
7982 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7983
7984 VkCommandBufferInheritanceInfo hinfo = {};
7985 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7986 hinfo.renderPass = VK_NULL_HANDLE;
7987 hinfo.subpass = 0;
7988 hinfo.framebuffer = VK_NULL_HANDLE;
7989 hinfo.occlusionQueryEnable = VK_FALSE;
7990 hinfo.queryFlags = 0;
7991 hinfo.pipelineStatistics = 0;
7992 VkCommandBufferBeginInfo info = {};
7993 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
7994 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7995 info.pInheritanceInfo = &hinfo;
7996
7997 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
7998 VkRenderPassBeginInfo rp_begin = {};
7999 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8000 rp_begin.pNext = NULL;
8001 rp_begin.renderPass = renderPass();
8002 rp_begin.framebuffer = framebuffer();
8003 rp_begin.clearValueCount = 0; // Should be 1
8004
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has a clearValueCount of 0 but "
8006 "there must be at least 1 entries in "
8007 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008008
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008009 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008010
8011 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008012
8013 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008014}
8015
Slawomir Cygan0808f392016-11-28 17:53:23 +01008016TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
8017 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is greater than"
8018 "the number of renderPass attachments that use loadOp"
8019 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
8020
8021 ASSERT_NO_FATAL_FAILURE(InitState());
8022 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8023
8024 // Create a renderPass with a single attachment that uses loadOp CLEAR
8025 VkAttachmentReference attach = {};
8026 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8027 VkSubpassDescription subpass = {};
8028 subpass.inputAttachmentCount = 1;
8029 subpass.pInputAttachments = &attach;
8030 VkRenderPassCreateInfo rpci = {};
8031 rpci.subpassCount = 1;
8032 rpci.pSubpasses = &subpass;
8033 rpci.attachmentCount = 1;
8034 VkAttachmentDescription attach_desc = {};
8035 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8036 // Set loadOp to CLEAR
8037 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8038 rpci.pAttachments = &attach_desc;
8039 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8040 VkRenderPass rp;
8041 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8042
8043 VkCommandBufferBeginInfo info = {};
8044 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8045 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8046
8047 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8048 VkRenderPassBeginInfo rp_begin = {};
8049 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8050 rp_begin.pNext = NULL;
8051 rp_begin.renderPass = renderPass();
8052 rp_begin.framebuffer = framebuffer();
8053 rp_begin.clearValueCount = 2; // Should be 1
8054
8055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " has a clearValueCount of"
8056 " 2 but only first 1 entries in pClearValues array are used");
8057
8058 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8059
8060 m_errorMonitor->VerifyFound();
8061
8062 vkDestroyRenderPass(m_device->device(), rp, NULL);
8063}
8064
8065
Cody Northrop3bb4d962016-05-09 16:15:57 -06008066TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
8067
8068 TEST_DESCRIPTION("End a command buffer with an active render pass");
8069
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8071 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008072
8073 ASSERT_NO_FATAL_FAILURE(InitState());
8074 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8075
8076 // The framework's BeginCommandBuffer calls CreateRenderPass
8077 BeginCommandBuffer();
8078
8079 // Call directly into vkEndCommandBuffer instead of the
8080 // the framework's EndCommandBuffer, which inserts a
8081 // vkEndRenderPass
8082 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
8083
8084 m_errorMonitor->VerifyFound();
8085
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008086 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8087 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008088}
8089
Karl Schultz6addd812016-02-02 17:17:23 -07008090TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008091 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8093 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008094
8095 ASSERT_NO_FATAL_FAILURE(InitState());
8096 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008097
8098 // Renderpass is started here
8099 BeginCommandBuffer();
8100
8101 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008102 vk_testing::Buffer dstBuffer;
8103 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008104
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008105 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008106
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008107 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008108}
8109
Karl Schultz6addd812016-02-02 17:17:23 -07008110TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008111 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8113 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008114
8115 ASSERT_NO_FATAL_FAILURE(InitState());
8116 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008117
8118 // Renderpass is started here
8119 BeginCommandBuffer();
8120
8121 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008122 vk_testing::Buffer dstBuffer;
8123 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008124
Karl Schultz6addd812016-02-02 17:17:23 -07008125 VkDeviceSize dstOffset = 0;
8126 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06008127 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008128
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008129 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008130
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008131 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008132}
8133
Karl Schultz6addd812016-02-02 17:17:23 -07008134TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008135 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8137 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008138
8139 ASSERT_NO_FATAL_FAILURE(InitState());
8140 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008141
8142 // Renderpass is started here
8143 BeginCommandBuffer();
8144
Michael Lentine0a369f62016-02-03 16:51:46 -06008145 VkClearColorValue clear_color;
8146 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008147 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8148 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8149 const int32_t tex_width = 32;
8150 const int32_t tex_height = 32;
8151 VkImageCreateInfo image_create_info = {};
8152 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8153 image_create_info.pNext = NULL;
8154 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8155 image_create_info.format = tex_format;
8156 image_create_info.extent.width = tex_width;
8157 image_create_info.extent.height = tex_height;
8158 image_create_info.extent.depth = 1;
8159 image_create_info.mipLevels = 1;
8160 image_create_info.arrayLayers = 1;
8161 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8162 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8163 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008164
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008165 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008166 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008167
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008168 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008169
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008170 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008171
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008172 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008173}
8174
Karl Schultz6addd812016-02-02 17:17:23 -07008175TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008176 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8178 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008179
8180 ASSERT_NO_FATAL_FAILURE(InitState());
8181 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008182
8183 // Renderpass is started here
8184 BeginCommandBuffer();
8185
8186 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008187 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008188 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8189 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8190 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8191 image_create_info.extent.width = 64;
8192 image_create_info.extent.height = 64;
8193 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8194 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008195
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008196 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008197 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008198
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008199 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008200
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008201 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
8202 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008203
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008204 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008205}
8206
Karl Schultz6addd812016-02-02 17:17:23 -07008207TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008208 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008209 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008210
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearAttachments(): This call "
8212 "must be issued inside an active "
8213 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008214
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008215 ASSERT_NO_FATAL_FAILURE(InitState());
8216 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008217
8218 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008219 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008220 ASSERT_VK_SUCCESS(err);
8221
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008222 VkClearAttachment color_attachment;
8223 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8224 color_attachment.clearValue.color.float32[0] = 0;
8225 color_attachment.clearValue.color.float32[1] = 0;
8226 color_attachment.clearValue.color.float32[2] = 0;
8227 color_attachment.clearValue.color.float32[3] = 0;
8228 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008229 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008230 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008231
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008232 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008233}
8234
Chris Forbes3b97e932016-09-07 11:29:24 +12008235TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
8236 TEST_DESCRIPTION("Test that an error is produced when CmdNextSubpass is "
8237 "called too many times in a renderpass instance");
8238
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdNextSubpass(): Attempted to advance "
8240 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008241
8242 ASSERT_NO_FATAL_FAILURE(InitState());
8243 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8244
8245 BeginCommandBuffer();
8246
8247 // error here.
8248 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8249 m_errorMonitor->VerifyFound();
8250
8251 EndCommandBuffer();
8252}
8253
Chris Forbes6d624702016-09-07 13:57:05 +12008254TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
8255 TEST_DESCRIPTION("Test that an error is produced when CmdEndRenderPass is "
8256 "called before the final subpass has been reached");
8257
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdEndRenderPass(): Called before reaching "
8259 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008260
8261 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008262 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8263 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008264
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008265 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008266
8267 VkRenderPass rp;
8268 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8269 ASSERT_VK_SUCCESS(err);
8270
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008271 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008272
8273 VkFramebuffer fb;
8274 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8275 ASSERT_VK_SUCCESS(err);
8276
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008277 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008278
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008279 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 +12008280
8281 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8282
8283 // Error here.
8284 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8285 m_errorMonitor->VerifyFound();
8286
8287 // Clean up.
8288 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8289 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8290}
8291
Karl Schultz9e66a292016-04-21 15:57:51 -06008292TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8293 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8295 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008296
8297 ASSERT_NO_FATAL_FAILURE(InitState());
8298 BeginCommandBuffer();
8299
8300 VkBufferMemoryBarrier buf_barrier = {};
8301 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8302 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8303 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8304 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8305 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8306 buf_barrier.buffer = VK_NULL_HANDLE;
8307 buf_barrier.offset = 0;
8308 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008309 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8310 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008311
8312 m_errorMonitor->VerifyFound();
8313}
8314
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008315TEST_F(VkLayerTest, InvalidBarriers) {
8316 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8317
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008319
8320 ASSERT_NO_FATAL_FAILURE(InitState());
8321 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8322
8323 VkMemoryBarrier mem_barrier = {};
8324 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8325 mem_barrier.pNext = NULL;
8326 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8327 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8328 BeginCommandBuffer();
8329 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008330 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008331 &mem_barrier, 0, nullptr, 0, nullptr);
8332 m_errorMonitor->VerifyFound();
8333
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008335 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008336 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 -06008337 ASSERT_TRUE(image.initialized());
8338 VkImageMemoryBarrier img_barrier = {};
8339 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8340 img_barrier.pNext = NULL;
8341 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8342 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8343 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8344 // New layout can't be UNDEFINED
8345 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8346 img_barrier.image = image.handle();
8347 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8348 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8349 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8350 img_barrier.subresourceRange.baseArrayLayer = 0;
8351 img_barrier.subresourceRange.baseMipLevel = 0;
8352 img_barrier.subresourceRange.layerCount = 1;
8353 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008354 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8355 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008356 m_errorMonitor->VerifyFound();
8357 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8358
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008359 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the "
8360 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008361 // baseArrayLayer + layerCount must be <= image's arrayLayers
8362 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008363 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8364 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008365 m_errorMonitor->VerifyFound();
8366 img_barrier.subresourceRange.baseArrayLayer = 0;
8367
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008369 // baseMipLevel + levelCount must be <= image's mipLevels
8370 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008371 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8372 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008373 m_errorMonitor->VerifyFound();
8374 img_barrier.subresourceRange.baseMipLevel = 0;
8375
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008376 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 -06008377 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008378 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8379 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008380 VkBufferMemoryBarrier buf_barrier = {};
8381 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8382 buf_barrier.pNext = NULL;
8383 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8384 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8385 buf_barrier.buffer = buffer.handle();
8386 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8387 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8388 buf_barrier.offset = 0;
8389 buf_barrier.size = VK_WHOLE_SIZE;
8390 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008391 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8392 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008393 m_errorMonitor->VerifyFound();
8394 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8395
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008397 buf_barrier.offset = 257;
8398 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008399 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8400 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008401 m_errorMonitor->VerifyFound();
8402 buf_barrier.offset = 0;
8403
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008405 buf_barrier.size = 257;
8406 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008407 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8408 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008409 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008410
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008411 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008412 m_errorMonitor->SetDesiredFailureMsg(
8413 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8414 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
8415 m_errorMonitor->SetDesiredFailureMsg(
8416 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8417 "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 -06008418 VkDepthStencilObj ds_image(m_device);
8419 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
8420 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06008421 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
8422 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008423 img_barrier.image = ds_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008424 // Use of COLOR aspect on DS image is error
8425 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008426 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8427 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008428 m_errorMonitor->VerifyFound();
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008429 // Now test depth-only
8430 VkFormatProperties format_props;
8431
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008432 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
8433 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8435 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
8436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8437 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008438 VkDepthStencilObj d_image(m_device);
8439 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
8440 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008441 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008442 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008443 img_barrier.image = d_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008444 // Use of COLOR aspect on depth image is error
8445 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008446 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8447 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008448 m_errorMonitor->VerifyFound();
8449 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008450 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
8451 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008452 // Now test stencil-only
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8454 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008455 VkDepthStencilObj s_image(m_device);
8456 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
8457 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008458 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008459 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008460 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008461 // Use of COLOR aspect on depth image is error
8462 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008463 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8464 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008465 m_errorMonitor->VerifyFound();
8466 }
8467 // Finally test color
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8469 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
8470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8471 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008472 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008473 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 -06008474 ASSERT_TRUE(c_image.initialized());
8475 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8476 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
8477 img_barrier.image = c_image.handle();
8478 // Set aspect to depth (non-color)
8479 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008480 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8481 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008482 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008483
8484 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
8485
8486 // Create command pool with incompatible queueflags
8487 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
8488 uint32_t queue_family_index = UINT32_MAX;
8489 for (uint32_t i = 0; i < queue_props.size(); i++) {
8490 if ((queue_props[i].queueFlags & VK_QUEUE_COMPUTE_BIT) == 0) {
8491 queue_family_index = i;
8492 break;
8493 }
8494 }
8495 if (queue_family_index == UINT32_MAX) {
8496 printf("No non-compute queue found; skipped.\n");
8497 return;
8498 }
8499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
8500
8501 VkCommandPool command_pool;
8502 VkCommandPoolCreateInfo pool_create_info{};
8503 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
8504 pool_create_info.queueFamilyIndex = queue_family_index;
8505 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
8506 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
8507
8508 // Allocate a command buffer
8509 VkCommandBuffer bad_command_buffer;
8510 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
8511 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
8512 command_buffer_allocate_info.commandPool = command_pool;
8513 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
8514 command_buffer_allocate_info.commandBufferCount = 1;
8515 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
8516
8517 VkCommandBufferBeginInfo cbbi = {};
8518 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8519 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
8520 buf_barrier.offset = 0;
8521 buf_barrier.size = VK_WHOLE_SIZE;
8522 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
8523 &buf_barrier, 0, nullptr);
8524 m_errorMonitor->VerifyFound();
8525
8526 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
8527 vkEndCommandBuffer(bad_command_buffer);
8528 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
8529 printf("The non-compute queue does not support graphics; skipped.\n");
8530 return;
8531 }
8532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
8533 VkEvent event;
8534 VkEventCreateInfo event_create_info{};
8535 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
8536 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
8537 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
8538 nullptr, 0, nullptr);
8539 m_errorMonitor->VerifyFound();
8540
8541 vkEndCommandBuffer(bad_command_buffer);
8542 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008543}
8544
Tony Barbour18ba25c2016-09-29 13:42:40 -06008545TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
8546 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
8547
8548 m_errorMonitor->SetDesiredFailureMsg(
8549 VK_DEBUG_REPORT_WARNING_BIT_EXT,
8550 "must have required access bit");
8551 ASSERT_NO_FATAL_FAILURE(InitState());
8552 VkImageObj image(m_device);
Tony Barbour256c80a2016-10-05 13:23:46 -06008553 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 -06008554 ASSERT_TRUE(image.initialized());
8555
8556 VkImageMemoryBarrier barrier = {};
8557 VkImageSubresourceRange range;
8558 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8559 barrier.srcAccessMask = 0;
8560 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
8561 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
8562 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8563 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8564 barrier.image = image.handle();
8565 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8566 range.baseMipLevel = 0;
8567 range.levelCount = 1;
8568 range.baseArrayLayer = 0;
8569 range.layerCount = 1;
8570 barrier.subresourceRange = range;
8571 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
8572 cmdbuf.BeginCommandBuffer();
8573 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
8574 &barrier);
8575 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8576 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
8577 barrier.srcAccessMask = 0;
8578 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
8579 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
8580 &barrier);
8581
8582 m_errorMonitor->VerifyFound();
8583}
8584
Karl Schultz6addd812016-02-02 17:17:23 -07008585TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008586 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008587 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008588
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008590
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008591 ASSERT_NO_FATAL_FAILURE(InitState());
8592 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008593 uint32_t qfi = 0;
8594 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008595 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8596 buffCI.size = 1024;
8597 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8598 buffCI.queueFamilyIndexCount = 1;
8599 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008600
8601 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008602 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008603 ASSERT_VK_SUCCESS(err);
8604
8605 BeginCommandBuffer();
8606 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008607 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8608 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008609 // Should error before calling to driver so don't care about actual data
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008610 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7, VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008611
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008612 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008613
Chia-I Wuf7458c52015-10-26 21:10:41 +08008614 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008615}
8616
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008617TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
8618 // Create an out-of-range queueFamilyIndex
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8620 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
8621 "of the indices specified when the device was created, via the "
8622 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008623
8624 ASSERT_NO_FATAL_FAILURE(InitState());
8625 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8626 VkBufferCreateInfo buffCI = {};
8627 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8628 buffCI.size = 1024;
8629 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8630 buffCI.queueFamilyIndexCount = 1;
8631 // Introduce failure by specifying invalid queue_family_index
8632 uint32_t qfi = 777;
8633 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06008634 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008635
8636 VkBuffer ib;
8637 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
8638
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008639 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008640 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008641}
8642
Karl Schultz6addd812016-02-02 17:17:23 -07008643TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -06008644TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer"
Tobin Ehlis0c94db02016-07-19 10:49:32 -06008645 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008646
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008647 ASSERT_NO_FATAL_FAILURE(InitState());
8648 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008649
Chris Forbesf29a84f2016-10-06 18:39:28 +13008650 // An empty primary command buffer
8651 VkCommandBufferObj cb(m_device, m_commandPool);
8652 cb.BeginCommandBuffer();
8653 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06008654
Chris Forbesf29a84f2016-10-06 18:39:28 +13008655 m_commandBuffer->BeginCommandBuffer();
8656 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
8657 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008658
Chris Forbesf29a84f2016-10-06 18:39:28 +13008659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
8660 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008661 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008662}
8663
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008664TEST_F(VkLayerTest, DSUsageBitsErrors) {
8665 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
8666 "that do not have correct usage bits sets.");
8667 VkResult err;
8668
8669 ASSERT_NO_FATAL_FAILURE(InitState());
8670 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8671 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8672 ds_type_count[i].type = VkDescriptorType(i);
8673 ds_type_count[i].descriptorCount = 1;
8674 }
8675 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8676 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8677 ds_pool_ci.pNext = NULL;
8678 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8679 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8680 ds_pool_ci.pPoolSizes = ds_type_count;
8681
8682 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008683 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008684 ASSERT_VK_SUCCESS(err);
8685
8686 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008687 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008688 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8689 dsl_binding[i].binding = 0;
8690 dsl_binding[i].descriptorType = VkDescriptorType(i);
8691 dsl_binding[i].descriptorCount = 1;
8692 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
8693 dsl_binding[i].pImmutableSamplers = NULL;
8694 }
8695
8696 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8697 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8698 ds_layout_ci.pNext = NULL;
8699 ds_layout_ci.bindingCount = 1;
8700 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
8701 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8702 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008703 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008704 ASSERT_VK_SUCCESS(err);
8705 }
8706 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8707 VkDescriptorSetAllocateInfo alloc_info = {};
8708 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8709 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8710 alloc_info.descriptorPool = ds_pool;
8711 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008712 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008713 ASSERT_VK_SUCCESS(err);
8714
8715 // Create a buffer & bufferView to be used for invalid updates
8716 VkBufferCreateInfo buff_ci = {};
8717 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8718 // This usage is not valid for any descriptor type
8719 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
8720 buff_ci.size = 256;
8721 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8722 VkBuffer buffer;
8723 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
8724 ASSERT_VK_SUCCESS(err);
8725
8726 VkBufferViewCreateInfo buff_view_ci = {};
8727 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
8728 buff_view_ci.buffer = buffer;
8729 buff_view_ci.format = VK_FORMAT_R8_UNORM;
8730 buff_view_ci.range = VK_WHOLE_SIZE;
8731 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008732 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008733 ASSERT_VK_SUCCESS(err);
8734
8735 // Create an image to be used for invalid updates
8736 VkImageCreateInfo image_ci = {};
8737 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8738 image_ci.imageType = VK_IMAGE_TYPE_2D;
8739 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
8740 image_ci.extent.width = 64;
8741 image_ci.extent.height = 64;
8742 image_ci.extent.depth = 1;
8743 image_ci.mipLevels = 1;
8744 image_ci.arrayLayers = 1;
8745 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
8746 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
8747 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
8748 // This usage is not valid for any descriptor type
8749 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8750 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8751 VkImage image;
8752 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
8753 ASSERT_VK_SUCCESS(err);
8754 // Bind memory to image
8755 VkMemoryRequirements mem_reqs;
8756 VkDeviceMemory image_mem;
8757 bool pass;
8758 VkMemoryAllocateInfo mem_alloc = {};
8759 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8760 mem_alloc.pNext = NULL;
8761 mem_alloc.allocationSize = 0;
8762 mem_alloc.memoryTypeIndex = 0;
8763 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
8764 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008765 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008766 ASSERT_TRUE(pass);
8767 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
8768 ASSERT_VK_SUCCESS(err);
8769 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
8770 ASSERT_VK_SUCCESS(err);
8771 // Now create view for image
8772 VkImageViewCreateInfo image_view_ci = {};
8773 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8774 image_view_ci.image = image;
8775 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
8776 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
8777 image_view_ci.subresourceRange.layerCount = 1;
8778 image_view_ci.subresourceRange.baseArrayLayer = 0;
8779 image_view_ci.subresourceRange.levelCount = 1;
8780 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8781 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008782 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008783 ASSERT_VK_SUCCESS(err);
8784
8785 VkDescriptorBufferInfo buff_info = {};
8786 buff_info.buffer = buffer;
8787 VkDescriptorImageInfo img_info = {};
8788 img_info.imageView = image_view;
8789 VkWriteDescriptorSet descriptor_write = {};
8790 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8791 descriptor_write.dstBinding = 0;
8792 descriptor_write.descriptorCount = 1;
8793 descriptor_write.pTexelBufferView = &buff_view;
8794 descriptor_write.pBufferInfo = &buff_info;
8795 descriptor_write.pImageInfo = &img_info;
8796
8797 // These error messages align with VkDescriptorType struct
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008798 const char *error_msgs[] = {"", // placeholder, no error for SAMPLER descriptor
8799 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
8800 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
8801 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
8802 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
8803 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
8804 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
8805 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
8806 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
8807 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
8808 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008809 // Start loop at 1 as SAMPLER desc type has no usage bit error
8810 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8811 descriptor_write.descriptorType = VkDescriptorType(i);
8812 descriptor_write.dstSet = descriptor_sets[i];
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msgs[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008814
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008815 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008816
8817 m_errorMonitor->VerifyFound();
8818 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
8819 }
8820 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
8821 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008822 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008823 vkDestroyImageView(m_device->device(), image_view, NULL);
8824 vkDestroyBuffer(m_device->device(), buffer, NULL);
8825 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008826 vkFreeDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008827 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8828}
8829
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008830TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008831 TEST_DESCRIPTION("Attempt to update buffer descriptor set that has incorrect "
8832 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
8833 "1. offset value greater than buffer size\n"
8834 "2. range value of 0\n"
8835 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008836 VkResult err;
8837
8838 ASSERT_NO_FATAL_FAILURE(InitState());
8839 VkDescriptorPoolSize ds_type_count = {};
8840 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8841 ds_type_count.descriptorCount = 1;
8842
8843 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8844 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8845 ds_pool_ci.pNext = NULL;
8846 ds_pool_ci.maxSets = 1;
8847 ds_pool_ci.poolSizeCount = 1;
8848 ds_pool_ci.pPoolSizes = &ds_type_count;
8849
8850 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008851 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008852 ASSERT_VK_SUCCESS(err);
8853
8854 // Create layout with single uniform buffer descriptor
8855 VkDescriptorSetLayoutBinding dsl_binding = {};
8856 dsl_binding.binding = 0;
8857 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8858 dsl_binding.descriptorCount = 1;
8859 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8860 dsl_binding.pImmutableSamplers = NULL;
8861
8862 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8863 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8864 ds_layout_ci.pNext = NULL;
8865 ds_layout_ci.bindingCount = 1;
8866 ds_layout_ci.pBindings = &dsl_binding;
8867 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008868 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008869 ASSERT_VK_SUCCESS(err);
8870
8871 VkDescriptorSet descriptor_set = {};
8872 VkDescriptorSetAllocateInfo alloc_info = {};
8873 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8874 alloc_info.descriptorSetCount = 1;
8875 alloc_info.descriptorPool = ds_pool;
8876 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008877 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008878 ASSERT_VK_SUCCESS(err);
8879
8880 // Create a buffer to be used for invalid updates
8881 VkBufferCreateInfo buff_ci = {};
8882 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8883 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8884 buff_ci.size = 256;
8885 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8886 VkBuffer buffer;
8887 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
8888 ASSERT_VK_SUCCESS(err);
8889 // Have to bind memory to buffer before descriptor update
8890 VkMemoryAllocateInfo mem_alloc = {};
8891 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8892 mem_alloc.pNext = NULL;
8893 mem_alloc.allocationSize = 256;
8894 mem_alloc.memoryTypeIndex = 0;
8895
8896 VkMemoryRequirements mem_reqs;
8897 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008898 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008899 if (!pass) {
8900 vkDestroyBuffer(m_device->device(), buffer, NULL);
8901 return;
8902 }
8903
8904 VkDeviceMemory mem;
8905 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
8906 ASSERT_VK_SUCCESS(err);
8907 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
8908 ASSERT_VK_SUCCESS(err);
8909
8910 VkDescriptorBufferInfo buff_info = {};
8911 buff_info.buffer = buffer;
8912 // First make offset 1 larger than buffer size
8913 buff_info.offset = 257;
8914 buff_info.range = VK_WHOLE_SIZE;
8915 VkWriteDescriptorSet descriptor_write = {};
8916 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8917 descriptor_write.dstBinding = 0;
8918 descriptor_write.descriptorCount = 1;
8919 descriptor_write.pTexelBufferView = nullptr;
8920 descriptor_write.pBufferInfo = &buff_info;
8921 descriptor_write.pImageInfo = nullptr;
8922
8923 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8924 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " offset of 257 is greater than buffer ");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008926
8927 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8928
8929 m_errorMonitor->VerifyFound();
8930 // Now cause error due to range of 0
8931 buff_info.offset = 0;
8932 buff_info.range = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8934 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008935
8936 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8937
8938 m_errorMonitor->VerifyFound();
8939 // Now cause error due to range exceeding buffer size - offset
8940 buff_info.offset = 128;
8941 buff_info.range = 200;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008942 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 -06008943
8944 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8945
8946 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06008947 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008948 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8949 vkDestroyBuffer(m_device->device(), buffer, NULL);
8950 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
8951 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8952}
8953
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008954TEST_F(VkLayerTest, DSAspectBitsErrors) {
8955 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
8956 // are set, but could expand this test to hit more cases.
8957 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
8958 "that do not have correct aspect bits sets.");
8959 VkResult err;
8960
8961 ASSERT_NO_FATAL_FAILURE(InitState());
8962 VkDescriptorPoolSize ds_type_count = {};
8963 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8964 ds_type_count.descriptorCount = 1;
8965
8966 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8967 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8968 ds_pool_ci.pNext = NULL;
8969 ds_pool_ci.maxSets = 5;
8970 ds_pool_ci.poolSizeCount = 1;
8971 ds_pool_ci.pPoolSizes = &ds_type_count;
8972
8973 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008974 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008975 ASSERT_VK_SUCCESS(err);
8976
8977 VkDescriptorSetLayoutBinding dsl_binding = {};
8978 dsl_binding.binding = 0;
8979 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8980 dsl_binding.descriptorCount = 1;
8981 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8982 dsl_binding.pImmutableSamplers = NULL;
8983
8984 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8985 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8986 ds_layout_ci.pNext = NULL;
8987 ds_layout_ci.bindingCount = 1;
8988 ds_layout_ci.pBindings = &dsl_binding;
8989 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008990 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008991 ASSERT_VK_SUCCESS(err);
8992
8993 VkDescriptorSet descriptor_set = {};
8994 VkDescriptorSetAllocateInfo alloc_info = {};
8995 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8996 alloc_info.descriptorSetCount = 1;
8997 alloc_info.descriptorPool = ds_pool;
8998 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008999 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009000 ASSERT_VK_SUCCESS(err);
9001
9002 // Create an image to be used for invalid updates
9003 VkImageCreateInfo image_ci = {};
9004 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9005 image_ci.imageType = VK_IMAGE_TYPE_2D;
9006 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9007 image_ci.extent.width = 64;
9008 image_ci.extent.height = 64;
9009 image_ci.extent.depth = 1;
9010 image_ci.mipLevels = 1;
9011 image_ci.arrayLayers = 1;
9012 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9013 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9014 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9015 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9016 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9017 VkImage image;
9018 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9019 ASSERT_VK_SUCCESS(err);
9020 // Bind memory to image
9021 VkMemoryRequirements mem_reqs;
9022 VkDeviceMemory image_mem;
9023 bool pass;
9024 VkMemoryAllocateInfo mem_alloc = {};
9025 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9026 mem_alloc.pNext = NULL;
9027 mem_alloc.allocationSize = 0;
9028 mem_alloc.memoryTypeIndex = 0;
9029 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9030 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009031 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009032 ASSERT_TRUE(pass);
9033 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9034 ASSERT_VK_SUCCESS(err);
9035 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9036 ASSERT_VK_SUCCESS(err);
9037 // Now create view for image
9038 VkImageViewCreateInfo image_view_ci = {};
9039 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9040 image_view_ci.image = image;
9041 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9042 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9043 image_view_ci.subresourceRange.layerCount = 1;
9044 image_view_ci.subresourceRange.baseArrayLayer = 0;
9045 image_view_ci.subresourceRange.levelCount = 1;
9046 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009047 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009048
9049 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009050 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009051 ASSERT_VK_SUCCESS(err);
9052
9053 VkDescriptorImageInfo img_info = {};
9054 img_info.imageView = image_view;
9055 VkWriteDescriptorSet descriptor_write = {};
9056 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9057 descriptor_write.dstBinding = 0;
9058 descriptor_write.descriptorCount = 1;
9059 descriptor_write.pTexelBufferView = NULL;
9060 descriptor_write.pBufferInfo = NULL;
9061 descriptor_write.pImageInfo = &img_info;
9062 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9063 descriptor_write.dstSet = descriptor_set;
9064 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
9065 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009067
9068 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9069
9070 m_errorMonitor->VerifyFound();
9071 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9072 vkDestroyImage(m_device->device(), image, NULL);
9073 vkFreeMemory(m_device->device(), image_mem, NULL);
9074 vkDestroyImageView(m_device->device(), image_view, NULL);
9075 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9076 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9077}
9078
Karl Schultz6addd812016-02-02 17:17:23 -07009079TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009080 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07009081 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009082
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9084 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
9085 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009086
Tobin Ehlis3b780662015-05-28 12:11:26 -06009087 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009088 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009089 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009090 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9091 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009092
9093 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009094 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9095 ds_pool_ci.pNext = NULL;
9096 ds_pool_ci.maxSets = 1;
9097 ds_pool_ci.poolSizeCount = 1;
9098 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009099
Tobin Ehlis3b780662015-05-28 12:11:26 -06009100 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009101 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009102 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009103 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009104 dsl_binding.binding = 0;
9105 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9106 dsl_binding.descriptorCount = 1;
9107 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9108 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009109
Tony Barboureb254902015-07-15 12:50:33 -06009110 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009111 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9112 ds_layout_ci.pNext = NULL;
9113 ds_layout_ci.bindingCount = 1;
9114 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009115
Tobin Ehlis3b780662015-05-28 12:11:26 -06009116 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009117 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009118 ASSERT_VK_SUCCESS(err);
9119
9120 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009121 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009122 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009123 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009124 alloc_info.descriptorPool = ds_pool;
9125 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009126 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009127 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009128
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009129 VkSamplerCreateInfo sampler_ci = {};
9130 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9131 sampler_ci.pNext = NULL;
9132 sampler_ci.magFilter = VK_FILTER_NEAREST;
9133 sampler_ci.minFilter = VK_FILTER_NEAREST;
9134 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9135 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9136 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9137 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9138 sampler_ci.mipLodBias = 1.0;
9139 sampler_ci.anisotropyEnable = VK_FALSE;
9140 sampler_ci.maxAnisotropy = 1;
9141 sampler_ci.compareEnable = VK_FALSE;
9142 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9143 sampler_ci.minLod = 1.0;
9144 sampler_ci.maxLod = 1.0;
9145 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9146 sampler_ci.unnormalizedCoordinates = VK_FALSE;
9147 VkSampler sampler;
9148 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9149 ASSERT_VK_SUCCESS(err);
9150
9151 VkDescriptorImageInfo info = {};
9152 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009153
9154 VkWriteDescriptorSet descriptor_write;
9155 memset(&descriptor_write, 0, sizeof(descriptor_write));
9156 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009157 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009158 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009159 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009160 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009161 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009162
9163 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9164
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009165 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009166
Chia-I Wuf7458c52015-10-26 21:10:41 +08009167 vkDestroySampler(m_device->device(), sampler, NULL);
9168 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9169 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009170}
9171
Karl Schultz6addd812016-02-02 17:17:23 -07009172TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009173 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07009174 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009175
Tobin Ehlisf922ef82016-11-30 10:19:14 -07009176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009177
Tobin Ehlis3b780662015-05-28 12:11:26 -06009178 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009179 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009180 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009181 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9182 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009183
9184 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009185 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9186 ds_pool_ci.pNext = NULL;
9187 ds_pool_ci.maxSets = 1;
9188 ds_pool_ci.poolSizeCount = 1;
9189 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009190
Tobin Ehlis3b780662015-05-28 12:11:26 -06009191 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009192 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009193 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009194
Tony Barboureb254902015-07-15 12:50:33 -06009195 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009196 dsl_binding.binding = 0;
9197 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9198 dsl_binding.descriptorCount = 1;
9199 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9200 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009201
9202 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009203 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9204 ds_layout_ci.pNext = NULL;
9205 ds_layout_ci.bindingCount = 1;
9206 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009207
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
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009221 // Correctly update descriptor to avoid "NOT_UPDATED" error
9222 VkDescriptorBufferInfo buff_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009223 buff_info.buffer = VkBuffer(0); // Don't care about buffer handle for this test
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009224 buff_info.offset = 0;
9225 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009226
9227 VkWriteDescriptorSet descriptor_write;
9228 memset(&descriptor_write, 0, sizeof(descriptor_write));
9229 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009230 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009231 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08009232 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009233 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9234 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009235
9236 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9237
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009238 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009239
Chia-I Wuf7458c52015-10-26 21:10:41 +08009240 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9241 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009242}
9243
Karl Schultz6addd812016-02-02 17:17:23 -07009244TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009245 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -07009246 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009247
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009249
Tobin Ehlis3b780662015-05-28 12:11:26 -06009250 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009251 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009252 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009253 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9254 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009255
9256 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009257 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9258 ds_pool_ci.pNext = NULL;
9259 ds_pool_ci.maxSets = 1;
9260 ds_pool_ci.poolSizeCount = 1;
9261 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009262
Tobin Ehlis3b780662015-05-28 12:11:26 -06009263 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009264 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009265 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009266
Tony Barboureb254902015-07-15 12:50:33 -06009267 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009268 dsl_binding.binding = 0;
9269 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9270 dsl_binding.descriptorCount = 1;
9271 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9272 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009273
9274 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009275 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9276 ds_layout_ci.pNext = NULL;
9277 ds_layout_ci.bindingCount = 1;
9278 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009279 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009280 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009281 ASSERT_VK_SUCCESS(err);
9282
9283 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009284 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009285 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009286 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009287 alloc_info.descriptorPool = ds_pool;
9288 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009289 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009290 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009291
Tony Barboureb254902015-07-15 12:50:33 -06009292 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009293 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9294 sampler_ci.pNext = NULL;
9295 sampler_ci.magFilter = VK_FILTER_NEAREST;
9296 sampler_ci.minFilter = VK_FILTER_NEAREST;
9297 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9298 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9299 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9300 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9301 sampler_ci.mipLodBias = 1.0;
9302 sampler_ci.anisotropyEnable = VK_FALSE;
9303 sampler_ci.maxAnisotropy = 1;
9304 sampler_ci.compareEnable = VK_FALSE;
9305 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9306 sampler_ci.minLod = 1.0;
9307 sampler_ci.maxLod = 1.0;
9308 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9309 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06009310
Tobin Ehlis3b780662015-05-28 12:11:26 -06009311 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009312 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009313 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009314
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009315 VkDescriptorImageInfo info = {};
9316 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009317
9318 VkWriteDescriptorSet descriptor_write;
9319 memset(&descriptor_write, 0, sizeof(descriptor_write));
9320 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009321 descriptor_write.dstSet = descriptorSet;
9322 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009323 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009324 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009325 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009326 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009327
9328 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9329
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009330 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009331
Chia-I Wuf7458c52015-10-26 21:10:41 +08009332 vkDestroySampler(m_device->device(), sampler, NULL);
9333 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9334 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009335}
9336
Tobin Ehlise202b2d2016-11-21 10:36:16 -07009337TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
9338 // Create layout w/ empty binding and attempt to update it
9339 VkResult err;
9340
9341 ASSERT_NO_FATAL_FAILURE(InitState());
9342
9343 VkDescriptorPoolSize ds_type_count = {};
9344 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
9345 ds_type_count.descriptorCount = 1;
9346
9347 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9348 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9349 ds_pool_ci.pNext = NULL;
9350 ds_pool_ci.maxSets = 1;
9351 ds_pool_ci.poolSizeCount = 1;
9352 ds_pool_ci.pPoolSizes = &ds_type_count;
9353
9354 VkDescriptorPool ds_pool;
9355 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9356 ASSERT_VK_SUCCESS(err);
9357
9358 VkDescriptorSetLayoutBinding dsl_binding = {};
9359 dsl_binding.binding = 0;
9360 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9361 dsl_binding.descriptorCount = 0;
9362 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9363 dsl_binding.pImmutableSamplers = NULL;
9364
9365 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9366 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9367 ds_layout_ci.pNext = NULL;
9368 ds_layout_ci.bindingCount = 1;
9369 ds_layout_ci.pBindings = &dsl_binding;
9370 VkDescriptorSetLayout ds_layout;
9371 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9372 ASSERT_VK_SUCCESS(err);
9373
9374 VkDescriptorSet descriptor_set;
9375 VkDescriptorSetAllocateInfo alloc_info = {};
9376 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9377 alloc_info.descriptorSetCount = 1;
9378 alloc_info.descriptorPool = ds_pool;
9379 alloc_info.pSetLayouts = &ds_layout;
9380 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9381 ASSERT_VK_SUCCESS(err);
9382
9383 VkSamplerCreateInfo sampler_ci = {};
9384 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9385 sampler_ci.magFilter = VK_FILTER_NEAREST;
9386 sampler_ci.minFilter = VK_FILTER_NEAREST;
9387 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9388 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9389 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9390 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9391 sampler_ci.mipLodBias = 1.0;
9392 sampler_ci.maxAnisotropy = 1;
9393 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9394 sampler_ci.minLod = 1.0;
9395 sampler_ci.maxLod = 1.0;
9396 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9397
9398 VkSampler sampler;
9399 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9400 ASSERT_VK_SUCCESS(err);
9401
9402 VkDescriptorImageInfo info = {};
9403 info.sampler = sampler;
9404
9405 VkWriteDescriptorSet descriptor_write;
9406 memset(&descriptor_write, 0, sizeof(descriptor_write));
9407 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9408 descriptor_write.dstSet = descriptor_set;
9409 descriptor_write.dstBinding = 0;
9410 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
9411 // This is the wrong type, but empty binding error will be flagged first
9412 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9413 descriptor_write.pImageInfo = &info;
9414
9415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
9416 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9417 m_errorMonitor->VerifyFound();
9418
9419 vkDestroySampler(m_device->device(), sampler, NULL);
9420 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9421 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9422}
9423
Karl Schultz6addd812016-02-02 17:17:23 -07009424TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
9425 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
9426 // types
9427 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009428
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009429 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 -06009430
Tobin Ehlis3b780662015-05-28 12:11:26 -06009431 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009432
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009433 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009434 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9435 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009436
9437 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009438 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9439 ds_pool_ci.pNext = NULL;
9440 ds_pool_ci.maxSets = 1;
9441 ds_pool_ci.poolSizeCount = 1;
9442 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009443
Tobin Ehlis3b780662015-05-28 12:11:26 -06009444 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009445 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009446 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009447 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009448 dsl_binding.binding = 0;
9449 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9450 dsl_binding.descriptorCount = 1;
9451 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9452 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009453
Tony Barboureb254902015-07-15 12:50:33 -06009454 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009455 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9456 ds_layout_ci.pNext = NULL;
9457 ds_layout_ci.bindingCount = 1;
9458 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009459
Tobin Ehlis3b780662015-05-28 12:11:26 -06009460 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009461 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009462 ASSERT_VK_SUCCESS(err);
9463
9464 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009465 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009466 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009467 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009468 alloc_info.descriptorPool = ds_pool;
9469 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009470 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009471 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009472
Tony Barboureb254902015-07-15 12:50:33 -06009473 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009474 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9475 sampler_ci.pNext = NULL;
9476 sampler_ci.magFilter = VK_FILTER_NEAREST;
9477 sampler_ci.minFilter = VK_FILTER_NEAREST;
9478 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9479 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9480 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9481 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9482 sampler_ci.mipLodBias = 1.0;
9483 sampler_ci.anisotropyEnable = VK_FALSE;
9484 sampler_ci.maxAnisotropy = 1;
9485 sampler_ci.compareEnable = VK_FALSE;
9486 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9487 sampler_ci.minLod = 1.0;
9488 sampler_ci.maxLod = 1.0;
9489 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9490 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009491 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009492 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009493 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009494
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009495 VkDescriptorImageInfo info = {};
9496 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009497
9498 VkWriteDescriptorSet descriptor_write;
9499 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009500 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009501 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009502 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009503 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009504 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009505 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009506
9507 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9508
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009509 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009510
Chia-I Wuf7458c52015-10-26 21:10:41 +08009511 vkDestroySampler(m_device->device(), sampler, NULL);
9512 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9513 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009514}
9515
Karl Schultz6addd812016-02-02 17:17:23 -07009516TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009517 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07009518 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009519
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9521 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009522
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009523 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009524 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
9525 // code
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_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_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
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009566 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009567
9568 VkDescriptorImageInfo descriptor_info;
9569 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
9570 descriptor_info.sampler = sampler;
9571
9572 VkWriteDescriptorSet descriptor_write;
9573 memset(&descriptor_write, 0, sizeof(descriptor_write));
9574 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009575 descriptor_write.dstSet = descriptorSet;
9576 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009577 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009578 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9579 descriptor_write.pImageInfo = &descriptor_info;
9580
9581 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9582
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009583 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009584
Chia-I Wuf7458c52015-10-26 21:10:41 +08009585 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9586 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009587}
9588
Karl Schultz6addd812016-02-02 17:17:23 -07009589TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
9590 // Create a single combined Image/Sampler descriptor and send it an invalid
9591 // imageView
9592 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009593
Karl Schultzf78bcdd2016-11-30 12:36:01 -07009594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009595
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009596 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009597 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009598 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9599 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009600
9601 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009602 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9603 ds_pool_ci.pNext = NULL;
9604 ds_pool_ci.maxSets = 1;
9605 ds_pool_ci.poolSizeCount = 1;
9606 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009607
9608 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009609 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009610 ASSERT_VK_SUCCESS(err);
9611
9612 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009613 dsl_binding.binding = 0;
9614 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9615 dsl_binding.descriptorCount = 1;
9616 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9617 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009618
9619 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009620 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9621 ds_layout_ci.pNext = NULL;
9622 ds_layout_ci.bindingCount = 1;
9623 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009624 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009625 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009626 ASSERT_VK_SUCCESS(err);
9627
9628 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009629 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009630 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009631 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009632 alloc_info.descriptorPool = ds_pool;
9633 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009634 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009635 ASSERT_VK_SUCCESS(err);
9636
9637 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009638 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9639 sampler_ci.pNext = NULL;
9640 sampler_ci.magFilter = VK_FILTER_NEAREST;
9641 sampler_ci.minFilter = VK_FILTER_NEAREST;
9642 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9643 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9644 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9645 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9646 sampler_ci.mipLodBias = 1.0;
9647 sampler_ci.anisotropyEnable = VK_FALSE;
9648 sampler_ci.maxAnisotropy = 1;
9649 sampler_ci.compareEnable = VK_FALSE;
9650 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9651 sampler_ci.minLod = 1.0;
9652 sampler_ci.maxLod = 1.0;
9653 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9654 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009655
9656 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009657 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009658 ASSERT_VK_SUCCESS(err);
9659
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009660 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009661
9662 VkDescriptorImageInfo descriptor_info;
9663 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
9664 descriptor_info.sampler = sampler;
9665 descriptor_info.imageView = view;
9666
9667 VkWriteDescriptorSet descriptor_write;
9668 memset(&descriptor_write, 0, sizeof(descriptor_write));
9669 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009670 descriptor_write.dstSet = descriptorSet;
9671 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009672 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009673 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9674 descriptor_write.pImageInfo = &descriptor_info;
9675
9676 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9677
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009678 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009679
Chia-I Wuf7458c52015-10-26 21:10:41 +08009680 vkDestroySampler(m_device->device(), sampler, NULL);
9681 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9682 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009683}
9684
Karl Schultz6addd812016-02-02 17:17:23 -07009685TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
9686 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
9687 // into the other
9688 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009689
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding #1 with type "
9691 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
9692 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009693
Tobin Ehlis04356f92015-10-27 16:35:27 -06009694 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009695 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009696 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009697 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9698 ds_type_count[0].descriptorCount = 1;
9699 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
9700 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009701
9702 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009703 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9704 ds_pool_ci.pNext = NULL;
9705 ds_pool_ci.maxSets = 1;
9706 ds_pool_ci.poolSizeCount = 2;
9707 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009708
9709 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009710 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009711 ASSERT_VK_SUCCESS(err);
9712 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009713 dsl_binding[0].binding = 0;
9714 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9715 dsl_binding[0].descriptorCount = 1;
9716 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9717 dsl_binding[0].pImmutableSamplers = NULL;
9718 dsl_binding[1].binding = 1;
9719 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9720 dsl_binding[1].descriptorCount = 1;
9721 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9722 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009723
9724 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009725 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9726 ds_layout_ci.pNext = NULL;
9727 ds_layout_ci.bindingCount = 2;
9728 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009729
9730 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009731 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009732 ASSERT_VK_SUCCESS(err);
9733
9734 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009735 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009736 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009737 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009738 alloc_info.descriptorPool = ds_pool;
9739 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009740 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009741 ASSERT_VK_SUCCESS(err);
9742
9743 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009744 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9745 sampler_ci.pNext = NULL;
9746 sampler_ci.magFilter = VK_FILTER_NEAREST;
9747 sampler_ci.minFilter = VK_FILTER_NEAREST;
9748 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9749 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9750 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9751 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9752 sampler_ci.mipLodBias = 1.0;
9753 sampler_ci.anisotropyEnable = VK_FALSE;
9754 sampler_ci.maxAnisotropy = 1;
9755 sampler_ci.compareEnable = VK_FALSE;
9756 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9757 sampler_ci.minLod = 1.0;
9758 sampler_ci.maxLod = 1.0;
9759 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9760 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009761
9762 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009763 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009764 ASSERT_VK_SUCCESS(err);
9765
9766 VkDescriptorImageInfo info = {};
9767 info.sampler = sampler;
9768
9769 VkWriteDescriptorSet descriptor_write;
9770 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
9771 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009772 descriptor_write.dstSet = descriptorSet;
9773 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08009774 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009775 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9776 descriptor_write.pImageInfo = &info;
9777 // This write update should succeed
9778 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9779 // Now perform a copy update that fails due to type mismatch
9780 VkCopyDescriptorSet copy_ds_update;
9781 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9782 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9783 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06009784 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009785 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07009786 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08009787 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06009788 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9789
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009790 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06009791 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009792 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 -06009793 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9794 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9795 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009796 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009797 copy_ds_update.dstSet = descriptorSet;
9798 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06009799 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06009800 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9801
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009802 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009803
Tobin Ehlis04356f92015-10-27 16:35:27 -06009804 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
9806 "update array offset of 0 and update of "
9807 "5 descriptors oversteps total number "
9808 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009809
Tobin Ehlis04356f92015-10-27 16:35:27 -06009810 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9811 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9812 copy_ds_update.srcSet = descriptorSet;
9813 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009814 copy_ds_update.dstSet = descriptorSet;
9815 copy_ds_update.dstBinding = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009816 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06009817 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9818
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009819 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06009820
Chia-I Wuf7458c52015-10-26 21:10:41 +08009821 vkDestroySampler(m_device->device(), sampler, NULL);
9822 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9823 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009824}
9825
Karl Schultz6addd812016-02-02 17:17:23 -07009826TEST_F(VkLayerTest, NumSamplesMismatch) {
9827 // Create CommandBuffer where MSAA samples doesn't match RenderPass
9828 // sampleCount
9829 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009830
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009832
Tobin Ehlis3b780662015-05-28 12:11:26 -06009833 ASSERT_NO_FATAL_FAILURE(InitState());
9834 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009835 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06009836 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009837 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009838
9839 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009840 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9841 ds_pool_ci.pNext = NULL;
9842 ds_pool_ci.maxSets = 1;
9843 ds_pool_ci.poolSizeCount = 1;
9844 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009845
Tobin Ehlis3b780662015-05-28 12:11:26 -06009846 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009847 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009848 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009849
Tony Barboureb254902015-07-15 12:50:33 -06009850 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08009851 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06009852 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08009853 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009854 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9855 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009856
Tony Barboureb254902015-07-15 12:50:33 -06009857 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9858 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9859 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009860 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07009861 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009862
Tobin Ehlis3b780662015-05-28 12:11:26 -06009863 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009864 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009865 ASSERT_VK_SUCCESS(err);
9866
9867 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009868 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009869 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009870 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009871 alloc_info.descriptorPool = ds_pool;
9872 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009873 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009874 ASSERT_VK_SUCCESS(err);
9875
Tony Barboureb254902015-07-15 12:50:33 -06009876 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009877 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07009878 pipe_ms_state_ci.pNext = NULL;
9879 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
9880 pipe_ms_state_ci.sampleShadingEnable = 0;
9881 pipe_ms_state_ci.minSampleShading = 1.0;
9882 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009883
Tony Barboureb254902015-07-15 12:50:33 -06009884 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009885 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9886 pipeline_layout_ci.pNext = NULL;
9887 pipeline_layout_ci.setLayoutCount = 1;
9888 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009889
9890 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009891 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009892 ASSERT_VK_SUCCESS(err);
9893
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009894 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9895 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
9896 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06009897 VkPipelineObj pipe(m_device);
9898 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06009899 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06009900 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06009901 pipe.SetMSAA(&pipe_ms_state_ci);
9902 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06009903
Tony Barbourfe3351b2015-07-28 10:17:20 -06009904 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009905 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06009906
Mark Young29927482016-05-04 14:38:51 -06009907 // Render triangle (the error should trigger on the attempt to draw).
9908 Draw(3, 1, 0, 0);
9909
9910 // Finalize recording of the command buffer
9911 EndCommandBuffer();
9912
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009913 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009914
Chia-I Wuf7458c52015-10-26 21:10:41 +08009915 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9916 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9917 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009918}
Mark Young29927482016-05-04 14:38:51 -06009919
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009920TEST_F(VkLayerTest, RenderPassIncompatible) {
9921 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
9922 "Initial case is drawing with an active renderpass that's "
Mike Weiblencce7ec72016-10-17 19:33:05 -06009923 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009924 VkResult err;
9925
9926 ASSERT_NO_FATAL_FAILURE(InitState());
9927 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9928
9929 VkDescriptorSetLayoutBinding dsl_binding = {};
9930 dsl_binding.binding = 0;
9931 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9932 dsl_binding.descriptorCount = 1;
9933 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9934 dsl_binding.pImmutableSamplers = NULL;
9935
9936 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9937 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9938 ds_layout_ci.pNext = NULL;
9939 ds_layout_ci.bindingCount = 1;
9940 ds_layout_ci.pBindings = &dsl_binding;
9941
9942 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009943 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009944 ASSERT_VK_SUCCESS(err);
9945
9946 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9947 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9948 pipeline_layout_ci.pNext = NULL;
9949 pipeline_layout_ci.setLayoutCount = 1;
9950 pipeline_layout_ci.pSetLayouts = &ds_layout;
9951
9952 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009953 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009954 ASSERT_VK_SUCCESS(err);
9955
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009956 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9957 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
9958 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009959 // Create a renderpass that will be incompatible with default renderpass
9960 VkAttachmentReference attach = {};
9961 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
9962 VkAttachmentReference color_att = {};
9963 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9964 VkSubpassDescription subpass = {};
9965 subpass.inputAttachmentCount = 1;
9966 subpass.pInputAttachments = &attach;
9967 subpass.colorAttachmentCount = 1;
9968 subpass.pColorAttachments = &color_att;
9969 VkRenderPassCreateInfo rpci = {};
9970 rpci.subpassCount = 1;
9971 rpci.pSubpasses = &subpass;
9972 rpci.attachmentCount = 1;
9973 VkAttachmentDescription attach_desc = {};
9974 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -06009975 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
9976 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009977 rpci.pAttachments = &attach_desc;
9978 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9979 VkRenderPass rp;
9980 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9981 VkPipelineObj pipe(m_device);
9982 pipe.AddShader(&vs);
9983 pipe.AddShader(&fs);
9984 pipe.AddColorAttachment();
9985 VkViewport view_port = {};
9986 m_viewports.push_back(view_port);
9987 pipe.SetViewport(m_viewports);
9988 VkRect2D rect = {};
9989 m_scissors.push_back(rect);
9990 pipe.SetScissor(m_scissors);
9991 pipe.CreateVKPipeline(pipeline_layout, renderPass());
9992
9993 VkCommandBufferInheritanceInfo cbii = {};
9994 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9995 cbii.renderPass = rp;
9996 cbii.subpass = 0;
9997 VkCommandBufferBeginInfo cbbi = {};
9998 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9999 cbbi.pInheritanceInfo = &cbii;
10000 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
10001 VkRenderPassBeginInfo rpbi = {};
10002 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10003 rpbi.framebuffer = m_framebuffer;
10004 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010005 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
10006 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010007
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010009 // Render triangle (the error should trigger on the attempt to draw).
10010 Draw(3, 1, 0, 0);
10011
10012 // Finalize recording of the command buffer
10013 EndCommandBuffer();
10014
10015 m_errorMonitor->VerifyFound();
10016
10017 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10018 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10019 vkDestroyRenderPass(m_device->device(), rp, NULL);
10020}
10021
Mark Youngc89c6312016-03-31 16:03:20 -060010022TEST_F(VkLayerTest, NumBlendAttachMismatch) {
10023 // Create Pipeline where the number of blend attachments doesn't match the
10024 // number of color attachments. In this case, we don't add any color
10025 // blend attachments even though we have a color attachment.
10026 VkResult err;
10027
10028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010029 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060010030
10031 ASSERT_NO_FATAL_FAILURE(InitState());
10032 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10033 VkDescriptorPoolSize ds_type_count = {};
10034 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10035 ds_type_count.descriptorCount = 1;
10036
10037 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10038 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10039 ds_pool_ci.pNext = NULL;
10040 ds_pool_ci.maxSets = 1;
10041 ds_pool_ci.poolSizeCount = 1;
10042 ds_pool_ci.pPoolSizes = &ds_type_count;
10043
10044 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010045 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060010046 ASSERT_VK_SUCCESS(err);
10047
10048 VkDescriptorSetLayoutBinding dsl_binding = {};
10049 dsl_binding.binding = 0;
10050 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10051 dsl_binding.descriptorCount = 1;
10052 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10053 dsl_binding.pImmutableSamplers = NULL;
10054
10055 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10056 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10057 ds_layout_ci.pNext = NULL;
10058 ds_layout_ci.bindingCount = 1;
10059 ds_layout_ci.pBindings = &dsl_binding;
10060
10061 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010062 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010063 ASSERT_VK_SUCCESS(err);
10064
10065 VkDescriptorSet descriptorSet;
10066 VkDescriptorSetAllocateInfo alloc_info = {};
10067 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10068 alloc_info.descriptorSetCount = 1;
10069 alloc_info.descriptorPool = ds_pool;
10070 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010071 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060010072 ASSERT_VK_SUCCESS(err);
10073
10074 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010075 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060010076 pipe_ms_state_ci.pNext = NULL;
10077 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10078 pipe_ms_state_ci.sampleShadingEnable = 0;
10079 pipe_ms_state_ci.minSampleShading = 1.0;
10080 pipe_ms_state_ci.pSampleMask = NULL;
10081
10082 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10083 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10084 pipeline_layout_ci.pNext = NULL;
10085 pipeline_layout_ci.setLayoutCount = 1;
10086 pipeline_layout_ci.pSetLayouts = &ds_layout;
10087
10088 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010089 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010090 ASSERT_VK_SUCCESS(err);
10091
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010092 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10093 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10094 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060010095 VkPipelineObj pipe(m_device);
10096 pipe.AddShader(&vs);
10097 pipe.AddShader(&fs);
10098 pipe.SetMSAA(&pipe_ms_state_ci);
10099 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10100
10101 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010102 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Youngc89c6312016-03-31 16:03:20 -060010103
Mark Young29927482016-05-04 14:38:51 -060010104 // Render triangle (the error should trigger on the attempt to draw).
10105 Draw(3, 1, 0, 0);
10106
10107 // Finalize recording of the command buffer
10108 EndCommandBuffer();
10109
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010110 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060010111
10112 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10113 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10114 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10115}
Mark Young29927482016-05-04 14:38:51 -060010116
Mark Muellerd4914412016-06-13 17:52:06 -060010117TEST_F(VkLayerTest, MissingClearAttachment) {
10118 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
10119 "structure passed to vkCmdClearAttachments");
Cody Northropc31a84f2016-08-22 10:41:47 -060010120 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesda6ae6f2016-09-09 14:36:33 +120010121 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesfa79fc72016-11-01 10:18:12 +130010122 "vkCmdClearAttachments() color attachment index 1 out of range for active subpass 0");
Mark Muellerd4914412016-06-13 17:52:06 -060010123
10124 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
10125 m_errorMonitor->VerifyFound();
10126}
10127
Karl Schultz6addd812016-02-02 17:17:23 -070010128TEST_F(VkLayerTest, ClearCmdNoDraw) {
10129 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
10130 // to issuing a Draw
10131 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010132
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060010134 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010135
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010136 ASSERT_NO_FATAL_FAILURE(InitState());
10137 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010138
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010139 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010140 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10141 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010142
10143 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010144 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10145 ds_pool_ci.pNext = NULL;
10146 ds_pool_ci.maxSets = 1;
10147 ds_pool_ci.poolSizeCount = 1;
10148 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010149
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010150 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010151 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010152 ASSERT_VK_SUCCESS(err);
10153
Tony Barboureb254902015-07-15 12:50:33 -060010154 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010155 dsl_binding.binding = 0;
10156 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10157 dsl_binding.descriptorCount = 1;
10158 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10159 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010160
Tony Barboureb254902015-07-15 12:50:33 -060010161 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010162 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10163 ds_layout_ci.pNext = NULL;
10164 ds_layout_ci.bindingCount = 1;
10165 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010166
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010167 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010168 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010169 ASSERT_VK_SUCCESS(err);
10170
10171 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010172 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010173 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010174 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010175 alloc_info.descriptorPool = ds_pool;
10176 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010177 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010178 ASSERT_VK_SUCCESS(err);
10179
Tony Barboureb254902015-07-15 12:50:33 -060010180 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010181 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010182 pipe_ms_state_ci.pNext = NULL;
10183 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10184 pipe_ms_state_ci.sampleShadingEnable = 0;
10185 pipe_ms_state_ci.minSampleShading = 1.0;
10186 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010187
Tony Barboureb254902015-07-15 12:50:33 -060010188 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010189 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10190 pipeline_layout_ci.pNext = NULL;
10191 pipeline_layout_ci.setLayoutCount = 1;
10192 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010193
10194 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010195 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010196 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010197
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010198 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060010199 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070010200 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010201 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010202
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010203 VkPipelineObj pipe(m_device);
10204 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010205 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010206 pipe.SetMSAA(&pipe_ms_state_ci);
10207 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010208
10209 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010210
Karl Schultz6addd812016-02-02 17:17:23 -070010211 // Main thing we care about for this test is that the VkImage obj we're
10212 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010213 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010214 VkClearAttachment color_attachment;
10215 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10216 color_attachment.clearValue.color.float32[0] = 1.0;
10217 color_attachment.clearValue.color.float32[1] = 1.0;
10218 color_attachment.clearValue.color.float32[2] = 1.0;
10219 color_attachment.clearValue.color.float32[3] = 1.0;
10220 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010221 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010222
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010223 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010224
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010225 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010226
Chia-I Wuf7458c52015-10-26 21:10:41 +080010227 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10228 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10229 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010230}
10231
Karl Schultz6addd812016-02-02 17:17:23 -070010232TEST_F(VkLayerTest, VtxBufferBadIndex) {
10233 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010234
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10236 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010237
Tobin Ehlis502480b2015-06-24 15:53:07 -060010238 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060010239 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060010240 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010241
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010242 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010243 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10244 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010245
10246 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010247 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10248 ds_pool_ci.pNext = NULL;
10249 ds_pool_ci.maxSets = 1;
10250 ds_pool_ci.poolSizeCount = 1;
10251 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010252
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010253 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010254 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010255 ASSERT_VK_SUCCESS(err);
10256
Tony Barboureb254902015-07-15 12:50:33 -060010257 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010258 dsl_binding.binding = 0;
10259 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10260 dsl_binding.descriptorCount = 1;
10261 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10262 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010263
Tony Barboureb254902015-07-15 12:50:33 -060010264 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010265 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10266 ds_layout_ci.pNext = NULL;
10267 ds_layout_ci.bindingCount = 1;
10268 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010269
Tobin Ehlis502480b2015-06-24 15:53:07 -060010270 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010271 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010272 ASSERT_VK_SUCCESS(err);
10273
10274 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010275 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010276 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010277 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010278 alloc_info.descriptorPool = ds_pool;
10279 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010280 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010281 ASSERT_VK_SUCCESS(err);
10282
Tony Barboureb254902015-07-15 12:50:33 -060010283 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010284 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010285 pipe_ms_state_ci.pNext = NULL;
10286 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10287 pipe_ms_state_ci.sampleShadingEnable = 0;
10288 pipe_ms_state_ci.minSampleShading = 1.0;
10289 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010290
Tony Barboureb254902015-07-15 12:50:33 -060010291 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010292 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10293 pipeline_layout_ci.pNext = NULL;
10294 pipeline_layout_ci.setLayoutCount = 1;
10295 pipeline_layout_ci.pSetLayouts = &ds_layout;
10296 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010297
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010298 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010299 ASSERT_VK_SUCCESS(err);
10300
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010301 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10302 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10303 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010304 VkPipelineObj pipe(m_device);
10305 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010306 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010307 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010308 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060010309 pipe.SetViewport(m_viewports);
10310 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010311 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010312
10313 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010314 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060010315 // Don't care about actual data, just need to get to draw to flag error
10316 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010317 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060010318 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060010319 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010320
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010321 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010322
Chia-I Wuf7458c52015-10-26 21:10:41 +080010323 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10324 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10325 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010326}
Mark Muellerdfe37552016-07-07 14:47:42 -060010327
Mark Mueller2ee294f2016-08-04 12:59:48 -060010328TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
10329 TEST_DESCRIPTION("Use an invalid count in a vkEnumeratePhysicalDevices call."
10330 "Use invalid Queue Family Index in vkCreateDevice");
Cody Northropc31a84f2016-08-22 10:41:47 -060010331 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Mueller2ee294f2016-08-04 12:59:48 -060010332
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010333 const char *mismatch_count_message = "Call to vkEnumeratePhysicalDevices() "
10334 "w/ pPhysicalDeviceCount value ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010335
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010336 const char *invalid_queueFamilyIndex_message = "Invalid queue create request in vkCreateDevice(). Invalid "
10337 "queueFamilyIndex ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010338
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010339 const char *unavailable_feature_message = "While calling vkCreateDevice(), requesting feature #";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010340
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, mismatch_count_message);
Mark Mueller880fce52016-08-17 15:23:23 -060010342 // The following test fails with recent NVidia drivers.
10343 // By the time core_validation is reached, the NVidia
10344 // driver has sanitized the invalid condition and core_validation
10345 // is not introduced to the failure condition. This is not the case
10346 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010347 // uint32_t count = static_cast<uint32_t>(~0);
10348 // VkPhysicalDevice physical_device;
10349 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
10350 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060010351
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010352 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queueFamilyIndex_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010353 float queue_priority = 0.0;
10354
10355 VkDeviceQueueCreateInfo queue_create_info = {};
10356 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
10357 queue_create_info.queueCount = 1;
10358 queue_create_info.pQueuePriorities = &queue_priority;
10359 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
10360
10361 VkPhysicalDeviceFeatures features = m_device->phy().features();
10362 VkDevice testDevice;
10363 VkDeviceCreateInfo device_create_info = {};
10364 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
10365 device_create_info.queueCreateInfoCount = 1;
10366 device_create_info.pQueueCreateInfos = &queue_create_info;
10367 device_create_info.pEnabledFeatures = &features;
10368 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
10369 m_errorMonitor->VerifyFound();
10370
10371 queue_create_info.queueFamilyIndex = 1;
10372
10373 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
10374 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
10375 for (unsigned i = 0; i < feature_count; i++) {
10376 if (VK_FALSE == feature_array[i]) {
10377 feature_array[i] = VK_TRUE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, unavailable_feature_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010379 device_create_info.pEnabledFeatures = &features;
10380 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
10381 m_errorMonitor->VerifyFound();
10382 break;
10383 }
10384 }
10385}
10386
Tobin Ehlis16edf082016-11-21 12:33:49 -070010387TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
10388 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
10389
10390 ASSERT_NO_FATAL_FAILURE(InitState());
10391
10392 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
10393 std::vector<VkDeviceQueueCreateInfo> queue_info;
10394 queue_info.reserve(queue_props.size());
10395 std::vector<std::vector<float>> queue_priorities;
10396 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
10397 VkDeviceQueueCreateInfo qi{};
10398 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
10399 qi.queueFamilyIndex = i;
10400 qi.queueCount = queue_props[i].queueCount;
10401 queue_priorities.emplace_back(qi.queueCount, 0.0f);
10402 qi.pQueuePriorities = queue_priorities[i].data();
10403 queue_info.push_back(qi);
10404 }
10405
10406 std::vector<const char *> device_extension_names;
10407
10408 VkDevice local_device;
10409 VkDeviceCreateInfo device_create_info = {};
10410 auto features = m_device->phy().features();
10411 // Intentionally disable pipeline stats
10412 features.pipelineStatisticsQuery = VK_FALSE;
10413 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
10414 device_create_info.pNext = NULL;
10415 device_create_info.queueCreateInfoCount = queue_info.size();
10416 device_create_info.pQueueCreateInfos = queue_info.data();
10417 device_create_info.enabledLayerCount = 0;
10418 device_create_info.ppEnabledLayerNames = NULL;
10419 device_create_info.pEnabledFeatures = &features;
10420 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
10421 ASSERT_VK_SUCCESS(err);
10422
10423 VkQueryPoolCreateInfo qpci{};
10424 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
10425 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
10426 qpci.queryCount = 1;
10427 VkQueryPool query_pool;
10428
10429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
10430 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
10431 m_errorMonitor->VerifyFound();
10432
10433 vkDestroyDevice(local_device, nullptr);
10434}
10435
Mark Mueller2ee294f2016-08-04 12:59:48 -060010436TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
10437 TEST_DESCRIPTION("Use an invalid queue index in a vkCmdWaitEvents call."
10438 "End a command buffer with a query still in progress.");
10439
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010440 const char *invalid_queue_index = "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
10441 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
10442 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010443
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010444 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010445
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010447
10448 ASSERT_NO_FATAL_FAILURE(InitState());
10449
10450 VkEvent event;
10451 VkEventCreateInfo event_create_info{};
10452 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
10453 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
10454
Mark Mueller2ee294f2016-08-04 12:59:48 -060010455 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010456 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010457
10458 BeginCommandBuffer();
10459
10460 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010461 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 -060010462 ASSERT_TRUE(image.initialized());
10463 VkImageMemoryBarrier img_barrier = {};
10464 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10465 img_barrier.pNext = NULL;
10466 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10467 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10468 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10469 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10470 img_barrier.image = image.handle();
10471 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060010472
10473 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
10474 // that layer validation catches the case when it is not.
10475 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060010476 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10477 img_barrier.subresourceRange.baseArrayLayer = 0;
10478 img_barrier.subresourceRange.baseMipLevel = 0;
10479 img_barrier.subresourceRange.layerCount = 1;
10480 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010481 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
10482 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010483 m_errorMonitor->VerifyFound();
10484
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010485 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010486
10487 VkQueryPool query_pool;
10488 VkQueryPoolCreateInfo query_pool_create_info = {};
10489 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
10490 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
10491 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010492 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010493
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010494 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010495 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
10496
10497 vkEndCommandBuffer(m_commandBuffer->handle());
10498 m_errorMonitor->VerifyFound();
10499
10500 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
10501 vkDestroyEvent(m_device->device(), event, nullptr);
10502}
10503
Mark Muellerdfe37552016-07-07 14:47:42 -060010504TEST_F(VkLayerTest, VertexBufferInvalid) {
10505 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
10506 "delete a buffer twice, use an invalid offset for each "
10507 "buffer type, and attempt to bind a null buffer");
10508
10509 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
10510 "using deleted buffer ";
Mark Muellerdfe37552016-07-07 14:47:42 -060010511 const char *invalid_offset_message = "vkBindBufferMemory(): "
10512 "memoryOffset is 0x";
10513 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
10514 "storage memoryOffset "
10515 "is 0x";
10516 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
10517 "texel memoryOffset "
10518 "is 0x";
10519 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
10520 "uniform memoryOffset "
10521 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060010522
10523 ASSERT_NO_FATAL_FAILURE(InitState());
10524 ASSERT_NO_FATAL_FAILURE(InitViewport());
10525 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10526
10527 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010528 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060010529 pipe_ms_state_ci.pNext = NULL;
10530 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10531 pipe_ms_state_ci.sampleShadingEnable = 0;
10532 pipe_ms_state_ci.minSampleShading = 1.0;
10533 pipe_ms_state_ci.pSampleMask = nullptr;
10534
10535 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10536 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10537 VkPipelineLayout pipeline_layout;
10538
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010539 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060010540 ASSERT_VK_SUCCESS(err);
10541
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010542 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10543 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060010544 VkPipelineObj pipe(m_device);
10545 pipe.AddShader(&vs);
10546 pipe.AddShader(&fs);
10547 pipe.AddColorAttachment();
10548 pipe.SetMSAA(&pipe_ms_state_ci);
10549 pipe.SetViewport(m_viewports);
10550 pipe.SetScissor(m_scissors);
10551 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10552
10553 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010554 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060010555
10556 {
10557 // Create and bind a vertex buffer in a reduced scope, which will cause
10558 // it to be deleted upon leaving this scope
10559 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010560 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060010561 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
10562 draw_verticies.AddVertexInputToPipe(pipe);
10563 }
10564
10565 Draw(1, 0, 0, 0);
10566
10567 EndCommandBuffer();
10568
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060010570 QueueCommandBuffer(false);
10571 m_errorMonitor->VerifyFound();
10572
10573 {
10574 // Create and bind a vertex buffer in a reduced scope, and delete it
10575 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010576 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060010578 buffer_test.TestDoubleDestroy();
10579 }
10580 m_errorMonitor->VerifyFound();
10581
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010582 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010583 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
10585 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
10586 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010587 m_errorMonitor->VerifyFound();
10588 }
10589
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010590 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
10591 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010592 // Create and bind a memory buffer with an invalid offset again,
10593 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
10595 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10596 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010597 m_errorMonitor->VerifyFound();
10598 }
10599
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010600 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010601 // Create and bind a memory buffer with an invalid offset again, but
10602 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010603 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
10604 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10605 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010606 m_errorMonitor->VerifyFound();
10607 }
10608
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010609 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010610 // Create and bind a memory buffer with an invalid offset again, but
10611 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010612 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
10613 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10614 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010615 m_errorMonitor->VerifyFound();
10616 }
10617
10618 {
10619 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010621 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
10622 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010623 m_errorMonitor->VerifyFound();
10624 }
10625
10626 {
10627 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010628 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010629 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
10630 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010631 }
10632 m_errorMonitor->VerifyFound();
10633
10634 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10635}
10636
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010637// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
10638TEST_F(VkLayerTest, InvalidImageLayout) {
10639 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010640 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
10641 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010642 // 3 in ValidateCmdBufImageLayouts
10643 // * -1 Attempt to submit cmd buf w/ deleted image
10644 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
10645 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010646
10647 ASSERT_NO_FATAL_FAILURE(InitState());
10648 // Create src & dst images to use for copy operations
10649 VkImage src_image;
10650 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080010651 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010652
10653 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
10654 const int32_t tex_width = 32;
10655 const int32_t tex_height = 32;
10656
10657 VkImageCreateInfo image_create_info = {};
10658 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10659 image_create_info.pNext = NULL;
10660 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10661 image_create_info.format = tex_format;
10662 image_create_info.extent.width = tex_width;
10663 image_create_info.extent.height = tex_height;
10664 image_create_info.extent.depth = 1;
10665 image_create_info.mipLevels = 1;
10666 image_create_info.arrayLayers = 4;
10667 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10668 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10669 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080010670 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010671 image_create_info.flags = 0;
10672
10673 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
10674 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080010675 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010676 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
10677 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080010678 image_create_info.format = VK_FORMAT_D32_SFLOAT;
10679 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
10680 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
10681 ASSERT_VK_SUCCESS(err);
10682
10683 // Allocate memory
10684 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080010685 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080010686 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080010687 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10688 mem_alloc.pNext = NULL;
10689 mem_alloc.allocationSize = 0;
10690 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080010691
10692 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010693 mem_alloc.allocationSize = img_mem_reqs.size;
10694 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010695 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080010696 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080010697 ASSERT_VK_SUCCESS(err);
10698
10699 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010700 mem_alloc.allocationSize = img_mem_reqs.size;
10701 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010702 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080010703 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080010704 ASSERT_VK_SUCCESS(err);
10705
10706 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010707 mem_alloc.allocationSize = img_mem_reqs.size;
10708 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010709 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080010710 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080010711 ASSERT_VK_SUCCESS(err);
10712
10713 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
10714 ASSERT_VK_SUCCESS(err);
10715 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
10716 ASSERT_VK_SUCCESS(err);
10717 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
10718 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010719
10720 BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080010721 VkImageCopy copy_region;
10722 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10723 copy_region.srcSubresource.mipLevel = 0;
10724 copy_region.srcSubresource.baseArrayLayer = 0;
10725 copy_region.srcSubresource.layerCount = 1;
10726 copy_region.srcOffset.x = 0;
10727 copy_region.srcOffset.y = 0;
10728 copy_region.srcOffset.z = 0;
10729 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10730 copy_region.dstSubresource.mipLevel = 0;
10731 copy_region.dstSubresource.baseArrayLayer = 0;
10732 copy_region.dstSubresource.layerCount = 1;
10733 copy_region.dstOffset.x = 0;
10734 copy_region.dstOffset.y = 0;
10735 copy_region.dstOffset.z = 0;
10736 copy_region.extent.width = 1;
10737 copy_region.extent.height = 1;
10738 copy_region.extent.depth = 1;
10739
10740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10741 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
10742 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 -060010743 m_errorMonitor->VerifyFound();
10744 // Now cause error due to src image layout changing
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot copy from an image whose source layout is "
10746 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
10747 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010748 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 -060010749 m_errorMonitor->VerifyFound();
10750 // Final src error is due to bad layout type
10751 m_errorMonitor->SetDesiredFailureMsg(
10752 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10753 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010754 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 -060010755 m_errorMonitor->VerifyFound();
10756 // Now verify same checks for dst
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010757 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10758 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010759 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 -060010760 m_errorMonitor->VerifyFound();
10761 // Now cause error due to src image layout changing
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot copy from an image whose dest layout is "
10763 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
10764 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010765 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 -060010766 m_errorMonitor->VerifyFound();
10767 m_errorMonitor->SetDesiredFailureMsg(
10768 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10769 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010770 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 -060010771 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010772
Cort3b021012016-12-07 12:00:57 -080010773 // Convert dst and depth images to TRANSFER_DST for subsequent tests
10774 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
10775 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10776 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10777 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10778 transfer_dst_image_barrier[0].srcAccessMask = 0;
10779 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
10780 transfer_dst_image_barrier[0].image = dst_image;
10781 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
10782 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
10783 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10784 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10785 NULL, 0, NULL, 1, transfer_dst_image_barrier);
10786 transfer_dst_image_barrier[0].image = depth_image;
10787 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
10788 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10789 NULL, 0, NULL, 1, transfer_dst_image_barrier);
10790
10791 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080010792 VkClearColorValue color_clear_value = {};
10793 VkImageSubresourceRange clear_range;
10794 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10795 clear_range.baseMipLevel = 0;
10796 clear_range.baseArrayLayer = 0;
10797 clear_range.layerCount = 1;
10798 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010799
Cort3b021012016-12-07 12:00:57 -080010800 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
10801 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
10802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
10803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080010804 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010805 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080010806 // Fail due to provided layout not matching actual current layout for color clear.
10807 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080010808 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010809 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080010810
Cort530cf382016-12-08 09:59:47 -080010811 VkClearDepthStencilValue depth_clear_value = {};
10812 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080010813
10814 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
10815 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
10816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
10817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080010818 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080010819 m_errorMonitor->VerifyFound();
10820 // Fail due to provided layout not matching actual current layout for depth clear.
10821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080010822 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080010823 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010824
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010825 // Now cause error due to bad image layout transition in PipelineBarrier
10826 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080010827 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010828 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080010829 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010830 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080010831 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
10832 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010833 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You cannot transition the layout from "
10835 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when "
10836 "current layout is VK_IMAGE_LAYOUT_GENERAL.");
10837 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10838 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010839 m_errorMonitor->VerifyFound();
10840
10841 // Finally some layout errors at RenderPass create time
10842 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
10843 VkAttachmentReference attach = {};
10844 // perf warning for GENERAL layout w/ non-DS input attachment
10845 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10846 VkSubpassDescription subpass = {};
10847 subpass.inputAttachmentCount = 1;
10848 subpass.pInputAttachments = &attach;
10849 VkRenderPassCreateInfo rpci = {};
10850 rpci.subpassCount = 1;
10851 rpci.pSubpasses = &subpass;
10852 rpci.attachmentCount = 1;
10853 VkAttachmentDescription attach_desc = {};
10854 attach_desc.format = VK_FORMAT_UNDEFINED;
10855 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060010856 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010857 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10859 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010860 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10861 m_errorMonitor->VerifyFound();
10862 // error w/ non-general layout
10863 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10864
10865 m_errorMonitor->SetDesiredFailureMsg(
10866 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10867 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
10868 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10869 m_errorMonitor->VerifyFound();
10870 subpass.inputAttachmentCount = 0;
10871 subpass.colorAttachmentCount = 1;
10872 subpass.pColorAttachments = &attach;
10873 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10874 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10876 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010877 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10878 m_errorMonitor->VerifyFound();
10879 // error w/ non-color opt or GENERAL layout for color attachment
10880 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10881 m_errorMonitor->SetDesiredFailureMsg(
10882 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10883 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
10884 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10885 m_errorMonitor->VerifyFound();
10886 subpass.colorAttachmentCount = 0;
10887 subpass.pDepthStencilAttachment = &attach;
10888 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10889 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10891 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010892 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10893 m_errorMonitor->VerifyFound();
10894 // error w/ non-ds opt or GENERAL layout for color attachment
10895 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10897 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
10898 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010899 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10900 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060010901 // For this error we need a valid renderpass so create default one
10902 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
10903 attach.attachment = 0;
10904 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
10905 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
10906 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
10907 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
10908 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
10909 // Can't do a CLEAR load on READ_ONLY initialLayout
10910 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
10911 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
10912 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " with invalid first layout "
10914 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
10915 "ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060010916 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10917 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010918
Cort3b021012016-12-07 12:00:57 -080010919 vkFreeMemory(m_device->device(), src_image_mem, NULL);
10920 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
10921 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010922 vkDestroyImage(m_device->device(), src_image, NULL);
10923 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080010924 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010925}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060010926
Tobin Ehlise0936662016-10-11 08:10:51 -060010927TEST_F(VkLayerTest, InvalidStorageImageLayout) {
10928 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
10929 VkResult err;
10930
10931 ASSERT_NO_FATAL_FAILURE(InitState());
10932
10933 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
10934 VkImageTiling tiling;
10935 VkFormatProperties format_properties;
10936 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
10937 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
10938 tiling = VK_IMAGE_TILING_LINEAR;
10939 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
10940 tiling = VK_IMAGE_TILING_OPTIMAL;
10941 } else {
10942 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
10943 "skipped.\n");
10944 return;
10945 }
10946
10947 VkDescriptorPoolSize ds_type = {};
10948 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
10949 ds_type.descriptorCount = 1;
10950
10951 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10952 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10953 ds_pool_ci.maxSets = 1;
10954 ds_pool_ci.poolSizeCount = 1;
10955 ds_pool_ci.pPoolSizes = &ds_type;
10956 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
10957
10958 VkDescriptorPool ds_pool;
10959 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10960 ASSERT_VK_SUCCESS(err);
10961
10962 VkDescriptorSetLayoutBinding dsl_binding = {};
10963 dsl_binding.binding = 0;
10964 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
10965 dsl_binding.descriptorCount = 1;
10966 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
10967 dsl_binding.pImmutableSamplers = NULL;
10968
10969 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10970 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10971 ds_layout_ci.pNext = NULL;
10972 ds_layout_ci.bindingCount = 1;
10973 ds_layout_ci.pBindings = &dsl_binding;
10974
10975 VkDescriptorSetLayout ds_layout;
10976 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10977 ASSERT_VK_SUCCESS(err);
10978
10979 VkDescriptorSetAllocateInfo alloc_info = {};
10980 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10981 alloc_info.descriptorSetCount = 1;
10982 alloc_info.descriptorPool = ds_pool;
10983 alloc_info.pSetLayouts = &ds_layout;
10984 VkDescriptorSet descriptor_set;
10985 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10986 ASSERT_VK_SUCCESS(err);
10987
10988 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10989 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10990 pipeline_layout_ci.pNext = NULL;
10991 pipeline_layout_ci.setLayoutCount = 1;
10992 pipeline_layout_ci.pSetLayouts = &ds_layout;
10993 VkPipelineLayout pipeline_layout;
10994 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
10995 ASSERT_VK_SUCCESS(err);
10996
10997 VkImageObj image(m_device);
10998 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
10999 ASSERT_TRUE(image.initialized());
11000 VkImageView view = image.targetView(tex_format);
11001
11002 VkDescriptorImageInfo image_info = {};
11003 image_info.imageView = view;
11004 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11005
11006 VkWriteDescriptorSet descriptor_write = {};
11007 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11008 descriptor_write.dstSet = descriptor_set;
11009 descriptor_write.dstBinding = 0;
11010 descriptor_write.descriptorCount = 1;
11011 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11012 descriptor_write.pImageInfo = &image_info;
11013
11014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11015 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
11016 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
11017 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11018 m_errorMonitor->VerifyFound();
11019
11020 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11021 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11022 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
11023 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11024}
11025
Mark Mueller93b938f2016-08-18 10:27:40 -060011026TEST_F(VkLayerTest, SimultaneousUse) {
11027 TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
11028 "in primary and secondary command buffers.");
11029
11030 ASSERT_NO_FATAL_FAILURE(InitState());
11031 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11032
Mike Weiblen95dd0f92016-10-19 12:28:27 -060011033 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011034 const char *simultaneous_use_message2 = "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
11035 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060011036
11037 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011038 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060011039 command_buffer_allocate_info.commandPool = m_commandPool;
11040 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
11041 command_buffer_allocate_info.commandBufferCount = 1;
11042
11043 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011044 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060011045 VkCommandBufferBeginInfo command_buffer_begin_info = {};
11046 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011047 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060011048 command_buffer_inheritance_info.renderPass = m_renderPass;
11049 command_buffer_inheritance_info.framebuffer = m_framebuffer;
11050 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011051 command_buffer_begin_info.flags =
11052 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011053 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
11054
11055 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011056 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
11057 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller4042b652016-09-05 22:52:21 -060011058 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
Mark Mueller93b938f2016-08-18 10:27:40 -060011059 vkEndCommandBuffer(secondary_command_buffer);
11060
Mark Mueller93b938f2016-08-18 10:27:40 -060011061 VkSubmitInfo submit_info = {};
11062 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11063 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011064 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller4042b652016-09-05 22:52:21 -060011065 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Mueller93b938f2016-08-18 10:27:40 -060011066
Mark Mueller4042b652016-09-05 22:52:21 -060011067 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011068 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
11069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
11070 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011071 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011072 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11073 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060011074
11075 m_errorMonitor->SetDesiredFailureMsg(0, "");
Mark Mueller93b938f2016-08-18 10:27:40 -060011076 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11077
Mark Mueller4042b652016-09-05 22:52:21 -060011078 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011079 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011080 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060011081
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
11083 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011084 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011085 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11086 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060011087}
11088
Mark Mueller917f6bc2016-08-30 10:57:19 -060011089TEST_F(VkLayerTest, InUseDestroyedSignaled) {
11090 TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
11091 "in primary and secondary command buffers. "
Mark Muellerc8d441e2016-08-23 17:36:00 -060011092 "Delete objects that are inuse. Call VkQueueSubmit "
11093 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060011094
11095 ASSERT_NO_FATAL_FAILURE(InitState());
11096 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11097
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011098 const char *submit_with_deleted_event_message = "Cannot submit cmd buffer using deleted event 0x";
11099 const char *cannot_delete_event_message = "Cannot delete event 0x";
11100 const char *cannot_delete_semaphore_message = "Cannot delete semaphore 0x";
11101 const char *cannot_destroy_fence_message = "Fence 0x";
Mark Mueller917f6bc2016-08-30 10:57:19 -060011102
11103 BeginCommandBuffer();
11104
11105 VkEvent event;
11106 VkEventCreateInfo event_create_info = {};
11107 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11108 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011109 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011110
Mark Muellerc8d441e2016-08-23 17:36:00 -060011111 EndCommandBuffer();
11112 vkDestroyEvent(m_device->device(), event, nullptr);
11113
11114 VkSubmitInfo submit_info = {};
11115 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11116 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011117 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, submit_with_deleted_event_message);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011119 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11120 m_errorMonitor->VerifyFound();
11121
11122 m_errorMonitor->SetDesiredFailureMsg(0, "");
11123 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
11124
11125 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11126
Mark Mueller917f6bc2016-08-30 10:57:19 -060011127 VkSemaphoreCreateInfo semaphore_create_info = {};
11128 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
11129 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011130 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011131 VkFenceCreateInfo fence_create_info = {};
11132 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
11133 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011134 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011135
11136 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011137 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011138 descriptor_pool_type_count.descriptorCount = 1;
11139
11140 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
11141 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11142 descriptor_pool_create_info.maxSets = 1;
11143 descriptor_pool_create_info.poolSizeCount = 1;
11144 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011145 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011146
11147 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011148 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011149
11150 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011151 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011152 descriptorset_layout_binding.descriptorCount = 1;
11153 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
11154
11155 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011156 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011157 descriptorset_layout_create_info.bindingCount = 1;
11158 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
11159
11160 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011161 ASSERT_VK_SUCCESS(
11162 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011163
11164 VkDescriptorSet descriptorset;
11165 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011166 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011167 descriptorset_allocate_info.descriptorSetCount = 1;
11168 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
11169 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011170 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011171
Mark Mueller4042b652016-09-05 22:52:21 -060011172 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
11173
11174 VkDescriptorBufferInfo buffer_info = {};
11175 buffer_info.buffer = buffer_test.GetBuffer();
11176 buffer_info.offset = 0;
11177 buffer_info.range = 1024;
11178
11179 VkWriteDescriptorSet write_descriptor_set = {};
11180 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11181 write_descriptor_set.dstSet = descriptorset;
11182 write_descriptor_set.descriptorCount = 1;
11183 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11184 write_descriptor_set.pBufferInfo = &buffer_info;
11185
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011186 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060011187
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011188 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11189 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011190
11191 VkPipelineObj pipe(m_device);
11192 pipe.AddColorAttachment();
11193 pipe.AddShader(&vs);
11194 pipe.AddShader(&fs);
11195
11196 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011197 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011198 pipeline_layout_create_info.setLayoutCount = 1;
11199 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
11200
11201 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011202 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011203
11204 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
11205
Mark Muellerc8d441e2016-08-23 17:36:00 -060011206 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011207 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011208
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011209 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11210 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11211 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011212
Mark Muellerc8d441e2016-08-23 17:36:00 -060011213 EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060011214
Mark Mueller917f6bc2016-08-30 10:57:19 -060011215 submit_info.signalSemaphoreCount = 1;
11216 submit_info.pSignalSemaphores = &semaphore;
11217 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011218
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_delete_event_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011220 vkDestroyEvent(m_device->device(), event, nullptr);
11221 m_errorMonitor->VerifyFound();
11222
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_delete_semaphore_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011224 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11225 m_errorMonitor->VerifyFound();
11226
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_destroy_fence_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011228 vkDestroyFence(m_device->device(), fence, nullptr);
11229 m_errorMonitor->VerifyFound();
11230
Tobin Ehlis122207b2016-09-01 08:50:06 -070011231 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011232 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11233 vkDestroyFence(m_device->device(), fence, nullptr);
11234 vkDestroyEvent(m_device->device(), event, nullptr);
11235 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011236 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011237 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
11238}
11239
Tobin Ehlis2adda372016-09-01 08:51:06 -070011240TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
11241 TEST_DESCRIPTION("Delete in-use query pool.");
11242
11243 ASSERT_NO_FATAL_FAILURE(InitState());
11244 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11245
11246 VkQueryPool query_pool;
11247 VkQueryPoolCreateInfo query_pool_ci{};
11248 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11249 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
11250 query_pool_ci.queryCount = 1;
11251 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
11252 BeginCommandBuffer();
11253 // Reset query pool to create binding with cmd buffer
11254 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
11255
11256 EndCommandBuffer();
11257
11258 VkSubmitInfo submit_info = {};
11259 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11260 submit_info.commandBufferCount = 1;
11261 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11262 // Submit cmd buffer and then destroy query pool while in-flight
11263 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11264
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete query pool 0x");
Tobin Ehlis2adda372016-09-01 08:51:06 -070011266 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
11267 m_errorMonitor->VerifyFound();
11268
11269 vkQueueWaitIdle(m_device->m_queue);
11270 // Now that cmd buffer done we can safely destroy query_pool
11271 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
11272}
11273
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011274TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
11275 TEST_DESCRIPTION("Delete in-use pipeline.");
11276
11277 ASSERT_NO_FATAL_FAILURE(InitState());
11278 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11279
11280 // Empty pipeline layout used for binding PSO
11281 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11282 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11283 pipeline_layout_ci.setLayoutCount = 0;
11284 pipeline_layout_ci.pSetLayouts = NULL;
11285
11286 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011287 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011288 ASSERT_VK_SUCCESS(err);
11289
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete pipeline 0x");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011291 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011292 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11293 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011294 // Store pipeline handle so we can actually delete it before test finishes
11295 VkPipeline delete_this_pipeline;
11296 { // Scope pipeline so it will be auto-deleted
11297 VkPipelineObj pipe(m_device);
11298 pipe.AddShader(&vs);
11299 pipe.AddShader(&fs);
11300 pipe.AddColorAttachment();
11301 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11302 delete_this_pipeline = pipe.handle();
11303
11304 BeginCommandBuffer();
11305 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011306 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011307
11308 EndCommandBuffer();
11309
11310 VkSubmitInfo submit_info = {};
11311 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11312 submit_info.commandBufferCount = 1;
11313 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11314 // Submit cmd buffer and then pipeline destroyed while in-flight
11315 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11316 } // Pipeline deletion triggered here
11317 m_errorMonitor->VerifyFound();
11318 // Make sure queue finished and then actually delete pipeline
11319 vkQueueWaitIdle(m_device->m_queue);
11320 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
11321 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
11322}
11323
Tobin Ehlis7d965da2016-09-19 16:15:45 -060011324TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
11325 TEST_DESCRIPTION("Delete in-use imageView.");
11326
11327 ASSERT_NO_FATAL_FAILURE(InitState());
11328 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11329
11330 VkDescriptorPoolSize ds_type_count;
11331 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11332 ds_type_count.descriptorCount = 1;
11333
11334 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11335 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11336 ds_pool_ci.maxSets = 1;
11337 ds_pool_ci.poolSizeCount = 1;
11338 ds_pool_ci.pPoolSizes = &ds_type_count;
11339
11340 VkDescriptorPool ds_pool;
11341 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11342 ASSERT_VK_SUCCESS(err);
11343
11344 VkSamplerCreateInfo sampler_ci = {};
11345 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11346 sampler_ci.pNext = NULL;
11347 sampler_ci.magFilter = VK_FILTER_NEAREST;
11348 sampler_ci.minFilter = VK_FILTER_NEAREST;
11349 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11350 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11351 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11352 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11353 sampler_ci.mipLodBias = 1.0;
11354 sampler_ci.anisotropyEnable = VK_FALSE;
11355 sampler_ci.maxAnisotropy = 1;
11356 sampler_ci.compareEnable = VK_FALSE;
11357 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11358 sampler_ci.minLod = 1.0;
11359 sampler_ci.maxLod = 1.0;
11360 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11361 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11362 VkSampler sampler;
11363
11364 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11365 ASSERT_VK_SUCCESS(err);
11366
11367 VkDescriptorSetLayoutBinding layout_binding;
11368 layout_binding.binding = 0;
11369 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11370 layout_binding.descriptorCount = 1;
11371 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11372 layout_binding.pImmutableSamplers = NULL;
11373
11374 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11375 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11376 ds_layout_ci.bindingCount = 1;
11377 ds_layout_ci.pBindings = &layout_binding;
11378 VkDescriptorSetLayout ds_layout;
11379 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11380 ASSERT_VK_SUCCESS(err);
11381
11382 VkDescriptorSetAllocateInfo alloc_info = {};
11383 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11384 alloc_info.descriptorSetCount = 1;
11385 alloc_info.descriptorPool = ds_pool;
11386 alloc_info.pSetLayouts = &ds_layout;
11387 VkDescriptorSet descriptor_set;
11388 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11389 ASSERT_VK_SUCCESS(err);
11390
11391 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11392 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11393 pipeline_layout_ci.pNext = NULL;
11394 pipeline_layout_ci.setLayoutCount = 1;
11395 pipeline_layout_ci.pSetLayouts = &ds_layout;
11396
11397 VkPipelineLayout pipeline_layout;
11398 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11399 ASSERT_VK_SUCCESS(err);
11400
11401 VkImageObj image(m_device);
11402 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
11403 ASSERT_TRUE(image.initialized());
11404
11405 VkImageView view;
11406 VkImageViewCreateInfo ivci = {};
11407 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
11408 ivci.image = image.handle();
11409 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
11410 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
11411 ivci.subresourceRange.layerCount = 1;
11412 ivci.subresourceRange.baseMipLevel = 0;
11413 ivci.subresourceRange.levelCount = 1;
11414 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11415
11416 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
11417 ASSERT_VK_SUCCESS(err);
11418
11419 VkDescriptorImageInfo image_info{};
11420 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11421 image_info.imageView = view;
11422 image_info.sampler = sampler;
11423
11424 VkWriteDescriptorSet descriptor_write = {};
11425 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11426 descriptor_write.dstSet = descriptor_set;
11427 descriptor_write.dstBinding = 0;
11428 descriptor_write.descriptorCount = 1;
11429 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11430 descriptor_write.pImageInfo = &image_info;
11431
11432 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11433
11434 // Create PSO to use the sampler
11435 char const *vsSource = "#version 450\n"
11436 "\n"
11437 "out gl_PerVertex { \n"
11438 " vec4 gl_Position;\n"
11439 "};\n"
11440 "void main(){\n"
11441 " gl_Position = vec4(1);\n"
11442 "}\n";
11443 char const *fsSource = "#version 450\n"
11444 "\n"
11445 "layout(set=0, binding=0) uniform sampler2D s;\n"
11446 "layout(location=0) out vec4 x;\n"
11447 "void main(){\n"
11448 " x = texture(s, vec2(1));\n"
11449 "}\n";
11450 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11451 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11452 VkPipelineObj pipe(m_device);
11453 pipe.AddShader(&vs);
11454 pipe.AddShader(&fs);
11455 pipe.AddColorAttachment();
11456 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11457
11458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete image view 0x");
11459
11460 BeginCommandBuffer();
11461 // Bind pipeline to cmd buffer
11462 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11463 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11464 &descriptor_set, 0, nullptr);
11465 Draw(1, 0, 0, 0);
11466 EndCommandBuffer();
11467 // Submit cmd buffer then destroy sampler
11468 VkSubmitInfo submit_info = {};
11469 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11470 submit_info.commandBufferCount = 1;
11471 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11472 // Submit cmd buffer and then destroy imageView while in-flight
11473 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11474
11475 vkDestroyImageView(m_device->device(), view, nullptr);
11476 m_errorMonitor->VerifyFound();
11477 vkQueueWaitIdle(m_device->m_queue);
11478 // Now we can actually destroy imageView
11479 vkDestroyImageView(m_device->device(), view, NULL);
11480 vkDestroySampler(m_device->device(), sampler, nullptr);
11481 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11482 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11483 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11484}
11485
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060011486TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
11487 TEST_DESCRIPTION("Delete in-use bufferView.");
11488
11489 ASSERT_NO_FATAL_FAILURE(InitState());
11490 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11491
11492 VkDescriptorPoolSize ds_type_count;
11493 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11494 ds_type_count.descriptorCount = 1;
11495
11496 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11497 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11498 ds_pool_ci.maxSets = 1;
11499 ds_pool_ci.poolSizeCount = 1;
11500 ds_pool_ci.pPoolSizes = &ds_type_count;
11501
11502 VkDescriptorPool ds_pool;
11503 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11504 ASSERT_VK_SUCCESS(err);
11505
11506 VkDescriptorSetLayoutBinding layout_binding;
11507 layout_binding.binding = 0;
11508 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11509 layout_binding.descriptorCount = 1;
11510 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11511 layout_binding.pImmutableSamplers = NULL;
11512
11513 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11514 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11515 ds_layout_ci.bindingCount = 1;
11516 ds_layout_ci.pBindings = &layout_binding;
11517 VkDescriptorSetLayout ds_layout;
11518 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11519 ASSERT_VK_SUCCESS(err);
11520
11521 VkDescriptorSetAllocateInfo alloc_info = {};
11522 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11523 alloc_info.descriptorSetCount = 1;
11524 alloc_info.descriptorPool = ds_pool;
11525 alloc_info.pSetLayouts = &ds_layout;
11526 VkDescriptorSet descriptor_set;
11527 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11528 ASSERT_VK_SUCCESS(err);
11529
11530 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11531 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11532 pipeline_layout_ci.pNext = NULL;
11533 pipeline_layout_ci.setLayoutCount = 1;
11534 pipeline_layout_ci.pSetLayouts = &ds_layout;
11535
11536 VkPipelineLayout pipeline_layout;
11537 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11538 ASSERT_VK_SUCCESS(err);
11539
11540 VkBuffer buffer;
11541 uint32_t queue_family_index = 0;
11542 VkBufferCreateInfo buffer_create_info = {};
11543 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
11544 buffer_create_info.size = 1024;
11545 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
11546 buffer_create_info.queueFamilyIndexCount = 1;
11547 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
11548
11549 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
11550 ASSERT_VK_SUCCESS(err);
11551
11552 VkMemoryRequirements memory_reqs;
11553 VkDeviceMemory buffer_memory;
11554
11555 VkMemoryAllocateInfo memory_info = {};
11556 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11557 memory_info.allocationSize = 0;
11558 memory_info.memoryTypeIndex = 0;
11559
11560 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
11561 memory_info.allocationSize = memory_reqs.size;
11562 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
11563 ASSERT_TRUE(pass);
11564
11565 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
11566 ASSERT_VK_SUCCESS(err);
11567 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
11568 ASSERT_VK_SUCCESS(err);
11569
11570 VkBufferView view;
11571 VkBufferViewCreateInfo bvci = {};
11572 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
11573 bvci.buffer = buffer;
11574 bvci.format = VK_FORMAT_R8_UNORM;
11575 bvci.range = VK_WHOLE_SIZE;
11576
11577 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
11578 ASSERT_VK_SUCCESS(err);
11579
11580 VkWriteDescriptorSet descriptor_write = {};
11581 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11582 descriptor_write.dstSet = descriptor_set;
11583 descriptor_write.dstBinding = 0;
11584 descriptor_write.descriptorCount = 1;
11585 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11586 descriptor_write.pTexelBufferView = &view;
11587
11588 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11589
11590 char const *vsSource = "#version 450\n"
11591 "\n"
11592 "out gl_PerVertex { \n"
11593 " vec4 gl_Position;\n"
11594 "};\n"
11595 "void main(){\n"
11596 " gl_Position = vec4(1);\n"
11597 "}\n";
11598 char const *fsSource = "#version 450\n"
11599 "\n"
11600 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
11601 "layout(location=0) out vec4 x;\n"
11602 "void main(){\n"
11603 " x = imageLoad(s, 0);\n"
11604 "}\n";
11605 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11606 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11607 VkPipelineObj pipe(m_device);
11608 pipe.AddShader(&vs);
11609 pipe.AddShader(&fs);
11610 pipe.AddColorAttachment();
11611 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11612
11613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete buffer view 0x");
11614
11615 BeginCommandBuffer();
11616 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11617 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11618 VkRect2D scissor = {{0, 0}, {16, 16}};
11619 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11620 // Bind pipeline to cmd buffer
11621 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11622 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11623 &descriptor_set, 0, nullptr);
11624 Draw(1, 0, 0, 0);
11625 EndCommandBuffer();
11626
11627 VkSubmitInfo submit_info = {};
11628 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11629 submit_info.commandBufferCount = 1;
11630 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11631 // Submit cmd buffer and then destroy bufferView while in-flight
11632 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11633
11634 vkDestroyBufferView(m_device->device(), view, nullptr);
11635 m_errorMonitor->VerifyFound();
11636 vkQueueWaitIdle(m_device->m_queue);
11637 // Now we can actually destroy bufferView
11638 vkDestroyBufferView(m_device->device(), view, NULL);
11639 vkDestroyBuffer(m_device->device(), buffer, NULL);
11640 vkFreeMemory(m_device->device(), buffer_memory, NULL);
11641 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11642 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11643 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11644}
11645
Tobin Ehlis209532e2016-09-07 13:52:18 -060011646TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
11647 TEST_DESCRIPTION("Delete in-use sampler.");
11648
11649 ASSERT_NO_FATAL_FAILURE(InitState());
11650 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11651
11652 VkDescriptorPoolSize ds_type_count;
11653 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11654 ds_type_count.descriptorCount = 1;
11655
11656 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11657 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11658 ds_pool_ci.maxSets = 1;
11659 ds_pool_ci.poolSizeCount = 1;
11660 ds_pool_ci.pPoolSizes = &ds_type_count;
11661
11662 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011663 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011664 ASSERT_VK_SUCCESS(err);
11665
11666 VkSamplerCreateInfo sampler_ci = {};
11667 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11668 sampler_ci.pNext = NULL;
11669 sampler_ci.magFilter = VK_FILTER_NEAREST;
11670 sampler_ci.minFilter = VK_FILTER_NEAREST;
11671 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11672 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11673 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11674 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11675 sampler_ci.mipLodBias = 1.0;
11676 sampler_ci.anisotropyEnable = VK_FALSE;
11677 sampler_ci.maxAnisotropy = 1;
11678 sampler_ci.compareEnable = VK_FALSE;
11679 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11680 sampler_ci.minLod = 1.0;
11681 sampler_ci.maxLod = 1.0;
11682 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11683 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11684 VkSampler sampler;
11685
11686 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11687 ASSERT_VK_SUCCESS(err);
11688
11689 VkDescriptorSetLayoutBinding layout_binding;
11690 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060011691 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060011692 layout_binding.descriptorCount = 1;
11693 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11694 layout_binding.pImmutableSamplers = NULL;
11695
11696 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11697 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11698 ds_layout_ci.bindingCount = 1;
11699 ds_layout_ci.pBindings = &layout_binding;
11700 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011701 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011702 ASSERT_VK_SUCCESS(err);
11703
11704 VkDescriptorSetAllocateInfo alloc_info = {};
11705 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11706 alloc_info.descriptorSetCount = 1;
11707 alloc_info.descriptorPool = ds_pool;
11708 alloc_info.pSetLayouts = &ds_layout;
11709 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011710 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011711 ASSERT_VK_SUCCESS(err);
11712
11713 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11714 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11715 pipeline_layout_ci.pNext = NULL;
11716 pipeline_layout_ci.setLayoutCount = 1;
11717 pipeline_layout_ci.pSetLayouts = &ds_layout;
11718
11719 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011720 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011721 ASSERT_VK_SUCCESS(err);
11722
11723 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011724 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 -060011725 ASSERT_TRUE(image.initialized());
11726
11727 VkImageView view;
11728 VkImageViewCreateInfo ivci = {};
11729 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
11730 ivci.image = image.handle();
11731 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
11732 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
11733 ivci.subresourceRange.layerCount = 1;
11734 ivci.subresourceRange.baseMipLevel = 0;
11735 ivci.subresourceRange.levelCount = 1;
11736 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11737
11738 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
11739 ASSERT_VK_SUCCESS(err);
11740
11741 VkDescriptorImageInfo image_info{};
11742 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11743 image_info.imageView = view;
11744 image_info.sampler = sampler;
11745
11746 VkWriteDescriptorSet descriptor_write = {};
11747 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11748 descriptor_write.dstSet = descriptor_set;
11749 descriptor_write.dstBinding = 0;
11750 descriptor_write.descriptorCount = 1;
11751 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11752 descriptor_write.pImageInfo = &image_info;
11753
11754 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11755
11756 // Create PSO to use the sampler
11757 char const *vsSource = "#version 450\n"
11758 "\n"
11759 "out gl_PerVertex { \n"
11760 " vec4 gl_Position;\n"
11761 "};\n"
11762 "void main(){\n"
11763 " gl_Position = vec4(1);\n"
11764 "}\n";
11765 char const *fsSource = "#version 450\n"
11766 "\n"
11767 "layout(set=0, binding=0) uniform sampler2D s;\n"
11768 "layout(location=0) out vec4 x;\n"
11769 "void main(){\n"
11770 " x = texture(s, vec2(1));\n"
11771 "}\n";
11772 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11773 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11774 VkPipelineObj pipe(m_device);
11775 pipe.AddShader(&vs);
11776 pipe.AddShader(&fs);
11777 pipe.AddColorAttachment();
11778 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11779
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete sampler 0x");
Tobin Ehlis209532e2016-09-07 13:52:18 -060011781
11782 BeginCommandBuffer();
11783 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011784 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11785 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11786 &descriptor_set, 0, nullptr);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011787 Draw(1, 0, 0, 0);
11788 EndCommandBuffer();
11789 // Submit cmd buffer then destroy sampler
11790 VkSubmitInfo submit_info = {};
11791 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11792 submit_info.commandBufferCount = 1;
11793 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11794 // Submit cmd buffer and then destroy sampler while in-flight
11795 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11796
11797 vkDestroySampler(m_device->device(), sampler, nullptr);
11798 m_errorMonitor->VerifyFound();
11799 vkQueueWaitIdle(m_device->m_queue);
11800 // Now we can actually destroy sampler
11801 vkDestroySampler(m_device->device(), sampler, nullptr);
11802 vkDestroyImageView(m_device->device(), view, NULL);
11803 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11804 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11805 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11806}
11807
Mark Mueller1cd9f412016-08-25 13:23:52 -060011808TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Mueller96a56d52016-08-24 10:28:05 -060011809 TEST_DESCRIPTION("Call VkQueueSubmit with a semaphore that is already "
Mark Mueller1cd9f412016-08-25 13:23:52 -060011810 "signaled but not waited on by the queue. Wait on a "
11811 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060011812
11813 ASSERT_NO_FATAL_FAILURE(InitState());
11814 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11815
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011816 const char *queue_forward_progress_message = " that has already been signaled but not waited on by queue 0x";
11817 const char *invalid_fence_wait_message = " which has not been submitted on a Queue or during "
11818 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060011819
11820 BeginCommandBuffer();
11821 EndCommandBuffer();
11822
11823 VkSemaphoreCreateInfo semaphore_create_info = {};
11824 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
11825 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011826 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060011827 VkSubmitInfo submit_info = {};
11828 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11829 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011830 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060011831 submit_info.signalSemaphoreCount = 1;
11832 submit_info.pSignalSemaphores = &semaphore;
11833 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11834 m_errorMonitor->SetDesiredFailureMsg(0, "");
11835 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
11836 BeginCommandBuffer();
11837 EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060011839 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11840 m_errorMonitor->VerifyFound();
11841
Mark Mueller1cd9f412016-08-25 13:23:52 -060011842 VkFenceCreateInfo fence_create_info = {};
11843 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
11844 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011845 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060011846
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060011848 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
11849 m_errorMonitor->VerifyFound();
11850
Mark Mueller4042b652016-09-05 22:52:21 -060011851 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060011852 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060011853 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11854}
11855
Tobin Ehlis4af23302016-07-19 10:50:30 -060011856TEST_F(VkLayerTest, FramebufferIncompatible) {
11857 TEST_DESCRIPTION("Bind a secondary command buffer with with a framebuffer "
11858 "that does not match the framebuffer for the active "
11859 "renderpass.");
11860 ASSERT_NO_FATAL_FAILURE(InitState());
11861 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11862
11863 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011864 VkAttachmentDescription attachment = {0,
11865 VK_FORMAT_B8G8R8A8_UNORM,
11866 VK_SAMPLE_COUNT_1_BIT,
11867 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
11868 VK_ATTACHMENT_STORE_OP_STORE,
11869 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
11870 VK_ATTACHMENT_STORE_OP_DONT_CARE,
11871 VK_IMAGE_LAYOUT_UNDEFINED,
11872 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011873
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011874 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011875
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011876 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011877
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011878 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011879
11880 VkRenderPass rp;
11881 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
11882 ASSERT_VK_SUCCESS(err);
11883
11884 // A compatible framebuffer.
11885 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011886 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 -060011887 ASSERT_TRUE(image.initialized());
11888
11889 VkImageViewCreateInfo ivci = {
11890 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
11891 nullptr,
11892 0,
11893 image.handle(),
11894 VK_IMAGE_VIEW_TYPE_2D,
11895 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011896 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
11897 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060011898 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
11899 };
11900 VkImageView view;
11901 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
11902 ASSERT_VK_SUCCESS(err);
11903
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011904 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011905 VkFramebuffer fb;
11906 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
11907 ASSERT_VK_SUCCESS(err);
11908
11909 VkCommandBufferAllocateInfo cbai = {};
11910 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
11911 cbai.commandPool = m_commandPool;
11912 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
11913 cbai.commandBufferCount = 1;
11914
11915 VkCommandBuffer sec_cb;
11916 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
11917 ASSERT_VK_SUCCESS(err);
11918 VkCommandBufferBeginInfo cbbi = {};
11919 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130011920 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060011921 cbii.renderPass = renderPass();
11922 cbii.framebuffer = fb;
11923 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11924 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011925 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 -060011926 cbbi.pInheritanceInfo = &cbii;
11927 vkBeginCommandBuffer(sec_cb, &cbbi);
11928 vkEndCommandBuffer(sec_cb);
11929
Chris Forbes3400bc52016-09-13 18:10:34 +120011930 VkCommandBufferBeginInfo cbbi2 = {
11931 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
11932 0, nullptr
11933 };
11934 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
11935 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060011936
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060011938 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060011939 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
11940 m_errorMonitor->VerifyFound();
11941 // Cleanup
11942 vkDestroyImageView(m_device->device(), view, NULL);
11943 vkDestroyRenderPass(m_device->device(), rp, NULL);
11944 vkDestroyFramebuffer(m_device->device(), fb, NULL);
11945}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011946
11947TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
11948 TEST_DESCRIPTION("If logicOp is available on the device, set it to an "
11949 "invalid value. If logicOp is not available, attempt to "
11950 "use it and verify that we see the correct error.");
11951 ASSERT_NO_FATAL_FAILURE(InitState());
11952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11953
11954 auto features = m_device->phy().features();
11955 // Set the expected error depending on whether or not logicOp available
11956 if (VK_FALSE == features.logicOp) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "If logic operations feature not "
11958 "enabled, logicOpEnable must be "
11959 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011960 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130011961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011962 }
11963 // Create a pipeline using logicOp
11964 VkResult err;
11965
11966 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11967 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11968
11969 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011970 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011971 ASSERT_VK_SUCCESS(err);
11972
11973 VkPipelineViewportStateCreateInfo vp_state_ci = {};
11974 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
11975 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011976 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011977 vp_state_ci.pViewports = &vp;
11978 vp_state_ci.scissorCount = 1;
11979 VkRect2D scissors = {}; // Dummy scissors to point to
11980 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011981
11982 VkPipelineShaderStageCreateInfo shaderStages[2];
11983 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
11984
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011985 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11986 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011987 shaderStages[0] = vs.GetStageCreateInfo();
11988 shaderStages[1] = fs.GetStageCreateInfo();
11989
11990 VkPipelineVertexInputStateCreateInfo vi_ci = {};
11991 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
11992
11993 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
11994 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
11995 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
11996
11997 VkPipelineRasterizationStateCreateInfo rs_ci = {};
11998 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130011999 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012000
12001 VkPipelineColorBlendAttachmentState att = {};
12002 att.blendEnable = VK_FALSE;
12003 att.colorWriteMask = 0xf;
12004
12005 VkPipelineColorBlendStateCreateInfo cb_ci = {};
12006 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12007 // Enable logicOp & set logicOp to value 1 beyond allowed entries
12008 cb_ci.logicOpEnable = VK_TRUE;
12009 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
12010 cb_ci.attachmentCount = 1;
12011 cb_ci.pAttachments = &att;
12012
Chris Forbes8aeacbf2016-10-03 14:25:08 +130012013 VkPipelineMultisampleStateCreateInfo ms_ci = {};
12014 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12015 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12016
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012017 VkGraphicsPipelineCreateInfo gp_ci = {};
12018 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12019 gp_ci.stageCount = 2;
12020 gp_ci.pStages = shaderStages;
12021 gp_ci.pVertexInputState = &vi_ci;
12022 gp_ci.pInputAssemblyState = &ia_ci;
12023 gp_ci.pViewportState = &vp_state_ci;
12024 gp_ci.pRasterizationState = &rs_ci;
12025 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130012026 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012027 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12028 gp_ci.layout = pipeline_layout;
12029 gp_ci.renderPass = renderPass();
12030
12031 VkPipelineCacheCreateInfo pc_ci = {};
12032 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12033
12034 VkPipeline pipeline;
12035 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012036 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012037 ASSERT_VK_SUCCESS(err);
12038
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012039 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012040 m_errorMonitor->VerifyFound();
12041 if (VK_SUCCESS == err) {
12042 vkDestroyPipeline(m_device->device(), pipeline, NULL);
12043 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012044 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
12045 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12046}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012047#endif // DRAW_STATE_TESTS
12048
Tobin Ehlis0788f522015-05-26 16:11:58 -060012049#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060012050#if GTEST_IS_THREADSAFE
12051struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012052 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012053 VkEvent event;
12054 bool bailout;
12055};
12056
Karl Schultz6addd812016-02-02 17:17:23 -070012057extern "C" void *AddToCommandBuffer(void *arg) {
12058 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012059
Mike Stroyana6d14942016-07-13 15:10:05 -060012060 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012061 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012062 if (data->bailout) {
12063 break;
12064 }
12065 }
12066 return NULL;
12067}
12068
Karl Schultz6addd812016-02-02 17:17:23 -070012069TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012070 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012071
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012073
Mike Stroyanaccf7692015-05-12 16:00:45 -060012074 ASSERT_NO_FATAL_FAILURE(InitState());
12075 ASSERT_NO_FATAL_FAILURE(InitViewport());
12076 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12077
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012078 // Calls AllocateCommandBuffers
12079 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012080
12081 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012082 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012083
12084 VkEventCreateInfo event_info;
12085 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012086 VkResult err;
12087
12088 memset(&event_info, 0, sizeof(event_info));
12089 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12090
Chia-I Wuf7458c52015-10-26 21:10:41 +080012091 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012092 ASSERT_VK_SUCCESS(err);
12093
Mike Stroyanaccf7692015-05-12 16:00:45 -060012094 err = vkResetEvent(device(), event);
12095 ASSERT_VK_SUCCESS(err);
12096
12097 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012098 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012099 data.event = event;
12100 data.bailout = false;
12101 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060012102
12103 // First do some correct operations using multiple threads.
12104 // Add many entries to command buffer from another thread.
12105 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
12106 // Make non-conflicting calls from this thread at the same time.
12107 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060012108 uint32_t count;
12109 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060012110 }
12111 test_platform_thread_join(thread, NULL);
12112
12113 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060012114 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012115 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012116 // Add many entries to command buffer from this thread at the same time.
12117 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012118
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012119 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012120 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012121
Mike Stroyan10b8cb72016-01-22 15:22:03 -070012122 m_errorMonitor->SetBailout(NULL);
12123
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012124 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012125
Chia-I Wuf7458c52015-10-26 21:10:41 +080012126 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012127}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012128#endif // GTEST_IS_THREADSAFE
12129#endif // THREADING_TESTS
12130
Chris Forbes9f7ff632015-05-25 11:13:08 +120012131#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070012132TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012133 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12134 "with an impossible code size");
12135
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012137
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012138 ASSERT_NO_FATAL_FAILURE(InitState());
12139 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12140
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012141 VkShaderModule module;
12142 VkShaderModuleCreateInfo moduleCreateInfo;
12143 struct icd_spv_header spv;
12144
12145 spv.magic = ICD_SPV_MAGIC;
12146 spv.version = ICD_SPV_VERSION;
12147 spv.gen_magic = 0;
12148
12149 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12150 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012151 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012152 moduleCreateInfo.codeSize = 4;
12153 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012154 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012155
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012156 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012157}
12158
Karl Schultz6addd812016-02-02 17:17:23 -070012159TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012160 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12161 "with a bad magic number");
12162
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012164
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012165 ASSERT_NO_FATAL_FAILURE(InitState());
12166 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12167
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012168 VkShaderModule module;
12169 VkShaderModuleCreateInfo moduleCreateInfo;
12170 struct icd_spv_header spv;
12171
12172 spv.magic = ~ICD_SPV_MAGIC;
12173 spv.version = ICD_SPV_VERSION;
12174 spv.gen_magic = 0;
12175
12176 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12177 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012178 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012179 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12180 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012181 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012182
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012183 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012184}
12185
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012186#if 0
12187// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070012188TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012190 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012191
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012192 ASSERT_NO_FATAL_FAILURE(InitState());
12193 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12194
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012195 VkShaderModule module;
12196 VkShaderModuleCreateInfo moduleCreateInfo;
12197 struct icd_spv_header spv;
12198
12199 spv.magic = ICD_SPV_MAGIC;
12200 spv.version = ~ICD_SPV_VERSION;
12201 spv.gen_magic = 0;
12202
12203 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12204 moduleCreateInfo.pNext = NULL;
12205
Karl Schultz6addd812016-02-02 17:17:23 -070012206 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012207 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12208 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012209 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012210
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012211 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012212}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012213#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012214
Karl Schultz6addd812016-02-02 17:17:23 -070012215TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012216 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
12217 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012219
Chris Forbes9f7ff632015-05-25 11:13:08 +120012220 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012221 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012222
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012223 char const *vsSource = "#version 450\n"
12224 "\n"
12225 "layout(location=0) out float x;\n"
12226 "out gl_PerVertex {\n"
12227 " vec4 gl_Position;\n"
12228 "};\n"
12229 "void main(){\n"
12230 " gl_Position = vec4(1);\n"
12231 " x = 0;\n"
12232 "}\n";
12233 char const *fsSource = "#version 450\n"
12234 "\n"
12235 "layout(location=0) out vec4 color;\n"
12236 "void main(){\n"
12237 " color = vec4(1);\n"
12238 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120012239
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012240 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12241 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012242
12243 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012244 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012245 pipe.AddShader(&vs);
12246 pipe.AddShader(&fs);
12247
Chris Forbes9f7ff632015-05-25 11:13:08 +120012248 VkDescriptorSetObj descriptorSet(m_device);
12249 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012250 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012251
Tony Barbour5781e8f2015-08-04 16:23:11 -060012252 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012253
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012254 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012255}
Chris Forbes9f7ff632015-05-25 11:13:08 +120012256
Mark Mueller098c9cb2016-09-08 09:01:57 -060012257TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
12258 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
12259
12260 ASSERT_NO_FATAL_FAILURE(InitState());
12261 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12262
12263 const char *bad_specialization_message =
12264 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
12265
12266 char const *vsSource =
12267 "#version 450\n"
12268 "\n"
12269 "out gl_PerVertex {\n"
12270 " vec4 gl_Position;\n"
12271 "};\n"
12272 "void main(){\n"
12273 " gl_Position = vec4(1);\n"
12274 "}\n";
12275
12276 char const *fsSource =
12277 "#version 450\n"
12278 "\n"
12279 "layout (constant_id = 0) const float r = 0.0f;\n"
12280 "layout(location = 0) out vec4 uFragColor;\n"
12281 "void main(){\n"
12282 " uFragColor = vec4(r,1,0,1);\n"
12283 "}\n";
12284
12285 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12286 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12287
12288 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12289 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12290
12291 VkPipelineLayout pipeline_layout;
12292 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12293
12294 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
12295 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12296 vp_state_create_info.viewportCount = 1;
12297 VkViewport viewport = {};
12298 vp_state_create_info.pViewports = &viewport;
12299 vp_state_create_info.scissorCount = 1;
12300 VkRect2D scissors = {};
12301 vp_state_create_info.pScissors = &scissors;
12302
12303 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
12304
12305 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
12306 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
12307 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
12308 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
12309
12310 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {
12311 vs.GetStageCreateInfo(),
12312 fs.GetStageCreateInfo()
12313 };
12314
12315 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
12316 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12317
12318 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
12319 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12320 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12321
12322 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
12323 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
12324 rasterization_state_create_info.pNext = nullptr;
12325 rasterization_state_create_info.lineWidth = 1.0f;
12326 rasterization_state_create_info.rasterizerDiscardEnable = true;
12327
12328 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
12329 color_blend_attachment_state.blendEnable = VK_FALSE;
12330 color_blend_attachment_state.colorWriteMask = 0xf;
12331
12332 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
12333 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12334 color_blend_state_create_info.attachmentCount = 1;
12335 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
12336
12337 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
12338 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12339 graphicspipe_create_info.stageCount = 2;
12340 graphicspipe_create_info.pStages = shader_stage_create_info;
12341 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
12342 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
12343 graphicspipe_create_info.pViewportState = &vp_state_create_info;
12344 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
12345 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
12346 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
12347 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12348 graphicspipe_create_info.layout = pipeline_layout;
12349 graphicspipe_create_info.renderPass = renderPass();
12350
12351 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
12352 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12353
12354 VkPipelineCache pipelineCache;
12355 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
12356
12357 // This structure maps constant ids to data locations.
12358 const VkSpecializationMapEntry entry =
12359 // id, offset, size
12360 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
12361
12362 uint32_t data = 1;
12363
12364 // Set up the info describing spec map and data
12365 const VkSpecializationInfo specialization_info = {
12366 1,
12367 &entry,
12368 1 * sizeof(float),
12369 &data,
12370 };
12371 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
12372
12373 VkPipeline pipeline;
12374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
12375 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
12376 m_errorMonitor->VerifyFound();
12377
12378 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
12379 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12380}
12381
12382TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
12383 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
12384
12385 ASSERT_NO_FATAL_FAILURE(InitState());
12386 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12387
12388 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
12389
12390 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
12391 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12392 descriptor_pool_type_count[0].descriptorCount = 1;
12393 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
12394 descriptor_pool_type_count[1].descriptorCount = 1;
12395
12396 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12397 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12398 descriptor_pool_create_info.maxSets = 1;
12399 descriptor_pool_create_info.poolSizeCount = 2;
12400 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
12401 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12402
12403 VkDescriptorPool descriptorset_pool;
12404 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
12405
12406 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
12407 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
12408 descriptorset_layout_binding.descriptorCount = 1;
12409 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12410
12411 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
12412 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12413 descriptorset_layout_create_info.bindingCount = 1;
12414 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12415
12416 VkDescriptorSetLayout descriptorset_layout;
12417 ASSERT_VK_SUCCESS(vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
12418
12419 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
12420 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12421 descriptorset_allocate_info.descriptorSetCount = 1;
12422 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12423 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
12424 VkDescriptorSet descriptorset;
12425 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
12426
12427 // Challenge core_validation with a non uniform buffer type.
12428 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
12429
Mark Mueller098c9cb2016-09-08 09:01:57 -060012430 char const *vsSource =
12431 "#version 450\n"
12432 "\n"
12433 "layout (std140, set = 0, binding = 0) uniform buf {\n"
12434 " mat4 mvp;\n"
12435 "} ubuf;\n"
12436 "out gl_PerVertex {\n"
12437 " vec4 gl_Position;\n"
12438 "};\n"
12439 "void main(){\n"
12440 " gl_Position = ubuf.mvp * vec4(1);\n"
12441 "}\n";
12442
12443 char const *fsSource =
12444 "#version 450\n"
12445 "\n"
12446 "layout(location = 0) out vec4 uFragColor;\n"
12447 "void main(){\n"
12448 " uFragColor = vec4(0,1,0,1);\n"
12449 "}\n";
12450
12451 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12452 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12453
12454 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12455 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12456 pipeline_layout_create_info.setLayoutCount = 1;
12457 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12458
12459 VkPipelineLayout pipeline_layout;
12460 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12461
12462 VkPipelineObj pipe(m_device);
12463 pipe.AddColorAttachment();
12464 pipe.AddShader(&vs);
12465 pipe.AddShader(&fs);
12466
12467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
12468 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12469 m_errorMonitor->VerifyFound();
12470
12471 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12472 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
12473 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
12474}
12475
12476TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
12477 TEST_DESCRIPTION(
12478 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
12479
12480 ASSERT_NO_FATAL_FAILURE(InitState());
12481 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12482
12483 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
12484
12485 VkDescriptorPoolSize descriptor_pool_type_count = {};
12486 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12487 descriptor_pool_type_count.descriptorCount = 1;
12488
12489 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12490 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12491 descriptor_pool_create_info.maxSets = 1;
12492 descriptor_pool_create_info.poolSizeCount = 1;
12493 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
12494 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12495
12496 VkDescriptorPool descriptorset_pool;
12497 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
12498
12499 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
12500 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12501 descriptorset_layout_binding.descriptorCount = 1;
12502 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
12503 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12504
12505 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
12506 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12507 descriptorset_layout_create_info.bindingCount = 1;
12508 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12509
12510 VkDescriptorSetLayout descriptorset_layout;
12511 ASSERT_VK_SUCCESS(vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info,
12512 nullptr, &descriptorset_layout));
12513
12514 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
12515 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12516 descriptorset_allocate_info.descriptorSetCount = 1;
12517 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12518 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
12519 VkDescriptorSet descriptorset;
12520 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
12521
12522 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12523
Mark Mueller098c9cb2016-09-08 09:01:57 -060012524 char const *vsSource =
12525 "#version 450\n"
12526 "\n"
12527 "layout (std140, set = 0, binding = 0) uniform buf {\n"
12528 " mat4 mvp;\n"
12529 "} ubuf;\n"
12530 "out gl_PerVertex {\n"
12531 " vec4 gl_Position;\n"
12532 "};\n"
12533 "void main(){\n"
12534 " gl_Position = ubuf.mvp * vec4(1);\n"
12535 "}\n";
12536
12537 char const *fsSource =
12538 "#version 450\n"
12539 "\n"
12540 "layout(location = 0) out vec4 uFragColor;\n"
12541 "void main(){\n"
12542 " uFragColor = vec4(0,1,0,1);\n"
12543 "}\n";
12544
12545 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12546 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12547
12548 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12549 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12550 pipeline_layout_create_info.setLayoutCount = 1;
12551 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12552
12553 VkPipelineLayout pipeline_layout;
12554 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12555
12556 VkPipelineObj pipe(m_device);
12557 pipe.AddColorAttachment();
12558 pipe.AddShader(&vs);
12559 pipe.AddShader(&fs);
12560
12561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
12562 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12563 m_errorMonitor->VerifyFound();
12564
12565 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12566 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
12567 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
12568}
12569
12570TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
12571 TEST_DESCRIPTION("Create a graphics pipleine in which a push constant range containing a push constant block member is not "
12572 "accessible from the current shader stage.");
12573
12574 ASSERT_NO_FATAL_FAILURE(InitState());
12575 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12576
12577 const char *push_constant_not_accessible_message =
12578 "Push constant range covering variable starting at offset 0 not accessible from stage VK_SHADER_STAGE_VERTEX_BIT";
12579
12580 char const *vsSource =
12581 "#version 450\n"
12582 "\n"
12583 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
12584 "out gl_PerVertex {\n"
12585 " vec4 gl_Position;\n"
12586 "};\n"
12587 "void main(){\n"
12588 " gl_Position = vec4(consts.x);\n"
12589 "}\n";
12590
12591 char const *fsSource =
12592 "#version 450\n"
12593 "\n"
12594 "layout(location = 0) out vec4 uFragColor;\n"
12595 "void main(){\n"
12596 " uFragColor = vec4(0,1,0,1);\n"
12597 "}\n";
12598
12599 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12600 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12601
12602 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12603 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12604
12605 // Set up a push constant range
12606 VkPushConstantRange push_constant_ranges = {};
12607 // Set to the wrong stage to challenge core_validation
12608 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12609 push_constant_ranges.size = 4;
12610
12611 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
12612 pipeline_layout_create_info.pushConstantRangeCount = 1;
12613
12614 VkPipelineLayout pipeline_layout;
12615 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12616
12617 VkPipelineObj pipe(m_device);
12618 pipe.AddColorAttachment();
12619 pipe.AddShader(&vs);
12620 pipe.AddShader(&fs);
12621
12622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
12623 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12624 m_errorMonitor->VerifyFound();
12625
12626 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12627}
12628
12629TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
12630 TEST_DESCRIPTION(
12631 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
12632
12633 ASSERT_NO_FATAL_FAILURE(InitState());
12634 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12635
12636 const char *feature_not_enabled_message =
12637 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
12638
12639 // Some awkward steps are required to test with custom device features.
12640 std::vector<const char *> device_extension_names;
12641 auto features = m_device->phy().features();
12642 // Disable support for 64 bit floats
12643 features.shaderFloat64 = false;
12644 // The sacrificial device object
12645 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12646
12647 char const *vsSource = "#version 450\n"
12648 "\n"
12649 "out gl_PerVertex {\n"
12650 " vec4 gl_Position;\n"
12651 "};\n"
12652 "void main(){\n"
12653 " gl_Position = vec4(1);\n"
12654 "}\n";
12655 char const *fsSource = "#version 450\n"
12656 "\n"
12657 "layout(location=0) out vec4 color;\n"
12658 "void main(){\n"
12659 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
12660 " color = vec4(green);\n"
12661 "}\n";
12662
12663 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12664 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12665
12666 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060012667
12668 VkPipelineObj pipe(&test_device);
12669 pipe.AddColorAttachment();
12670 pipe.AddShader(&vs);
12671 pipe.AddShader(&fs);
12672
12673 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12674 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12675 VkPipelineLayout pipeline_layout;
12676 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12677
12678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
12679 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
12680 m_errorMonitor->VerifyFound();
12681
12682 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
12683}
12684
12685TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
12686 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
12687
12688 ASSERT_NO_FATAL_FAILURE(InitState());
12689 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12690
12691 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
12692
12693 char const *vsSource = "#version 450\n"
12694 "\n"
12695 "out gl_PerVertex {\n"
12696 " vec4 gl_Position;\n"
12697 "};\n"
12698 "layout(xfb_buffer = 1) out;"
12699 "void main(){\n"
12700 " gl_Position = vec4(1);\n"
12701 "}\n";
12702 char const *fsSource = "#version 450\n"
12703 "\n"
12704 "layout(location=0) out vec4 color;\n"
12705 "void main(){\n"
12706 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
12707 " color = vec4(green);\n"
12708 "}\n";
12709
12710 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12711 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12712
12713 VkPipelineObj pipe(m_device);
12714 pipe.AddColorAttachment();
12715 pipe.AddShader(&vs);
12716 pipe.AddShader(&fs);
12717
12718 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12719 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12720 VkPipelineLayout pipeline_layout;
12721 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12722
12723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
12724 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12725 m_errorMonitor->VerifyFound();
12726
12727 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12728}
12729
Karl Schultz6addd812016-02-02 17:17:23 -070012730TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012731 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12732 "which is not present in the outputs of the previous stage");
12733
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012735
Chris Forbes59cb88d2015-05-25 11:13:13 +120012736 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012737 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012738
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012739 char const *vsSource = "#version 450\n"
12740 "\n"
12741 "out gl_PerVertex {\n"
12742 " vec4 gl_Position;\n"
12743 "};\n"
12744 "void main(){\n"
12745 " gl_Position = vec4(1);\n"
12746 "}\n";
12747 char const *fsSource = "#version 450\n"
12748 "\n"
12749 "layout(location=0) in float x;\n"
12750 "layout(location=0) out vec4 color;\n"
12751 "void main(){\n"
12752 " color = vec4(x);\n"
12753 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120012754
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012755 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12756 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012757
12758 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012759 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012760 pipe.AddShader(&vs);
12761 pipe.AddShader(&fs);
12762
Chris Forbes59cb88d2015-05-25 11:13:13 +120012763 VkDescriptorSetObj descriptorSet(m_device);
12764 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012765 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012766
Tony Barbour5781e8f2015-08-04 16:23:11 -060012767 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012768
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012769 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012770}
12771
Karl Schultz6addd812016-02-02 17:17:23 -070012772TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012773 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12774 "within an interace block, which is not present in the outputs "
12775 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012777
12778 ASSERT_NO_FATAL_FAILURE(InitState());
12779 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12780
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012781 char const *vsSource = "#version 450\n"
12782 "\n"
12783 "out gl_PerVertex {\n"
12784 " vec4 gl_Position;\n"
12785 "};\n"
12786 "void main(){\n"
12787 " gl_Position = vec4(1);\n"
12788 "}\n";
12789 char const *fsSource = "#version 450\n"
12790 "\n"
12791 "in block { layout(location=0) float x; } ins;\n"
12792 "layout(location=0) out vec4 color;\n"
12793 "void main(){\n"
12794 " color = vec4(ins.x);\n"
12795 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130012796
12797 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12798 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12799
12800 VkPipelineObj pipe(m_device);
12801 pipe.AddColorAttachment();
12802 pipe.AddShader(&vs);
12803 pipe.AddShader(&fs);
12804
12805 VkDescriptorSetObj descriptorSet(m_device);
12806 descriptorSet.AppendDummy();
12807 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12808
12809 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12810
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012811 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012812}
12813
Karl Schultz6addd812016-02-02 17:17:23 -070012814TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012815 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012816 "across the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0.0: 'ptr to "
12818 "output arr[2] of float32' vs 'ptr to "
12819 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130012820
12821 ASSERT_NO_FATAL_FAILURE(InitState());
12822 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12823
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012824 char const *vsSource = "#version 450\n"
12825 "\n"
12826 "layout(location=0) out float x[2];\n"
12827 "out gl_PerVertex {\n"
12828 " vec4 gl_Position;\n"
12829 "};\n"
12830 "void main(){\n"
12831 " x[0] = 0; x[1] = 0;\n"
12832 " gl_Position = vec4(1);\n"
12833 "}\n";
12834 char const *fsSource = "#version 450\n"
12835 "\n"
12836 "layout(location=0) in float x[3];\n"
12837 "layout(location=0) out vec4 color;\n"
12838 "void main(){\n"
12839 " color = vec4(x[0] + x[1] + x[2]);\n"
12840 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130012841
12842 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12843 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12844
12845 VkPipelineObj pipe(m_device);
12846 pipe.AddColorAttachment();
12847 pipe.AddShader(&vs);
12848 pipe.AddShader(&fs);
12849
12850 VkDescriptorSetObj descriptorSet(m_device);
12851 descriptorSet.AppendDummy();
12852 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12853
12854 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12855
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012856 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130012857}
12858
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060012859
Karl Schultz6addd812016-02-02 17:17:23 -070012860TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012861 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012862 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012864
Chris Forbesb56af562015-05-25 11:13:17 +120012865 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120012867
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012868 char const *vsSource = "#version 450\n"
12869 "\n"
12870 "layout(location=0) out int x;\n"
12871 "out gl_PerVertex {\n"
12872 " vec4 gl_Position;\n"
12873 "};\n"
12874 "void main(){\n"
12875 " x = 0;\n"
12876 " gl_Position = vec4(1);\n"
12877 "}\n";
12878 char const *fsSource = "#version 450\n"
12879 "\n"
12880 "layout(location=0) in float x;\n" /* VS writes int */
12881 "layout(location=0) out vec4 color;\n"
12882 "void main(){\n"
12883 " color = vec4(x);\n"
12884 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120012885
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012886 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12887 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120012888
12889 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012890 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120012891 pipe.AddShader(&vs);
12892 pipe.AddShader(&fs);
12893
Chris Forbesb56af562015-05-25 11:13:17 +120012894 VkDescriptorSetObj descriptorSet(m_device);
12895 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012896 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120012897
Tony Barbour5781e8f2015-08-04 16:23:11 -060012898 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120012899
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012900 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120012901}
12902
Karl Schultz6addd812016-02-02 17:17:23 -070012903TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012904 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012905 "the vertex->fragment shader interface, when the variable is contained within "
Chris Forbes1cc79542016-07-20 11:13:44 +120012906 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012908
12909 ASSERT_NO_FATAL_FAILURE(InitState());
12910 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12911
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012912 char const *vsSource = "#version 450\n"
12913 "\n"
12914 "out block { layout(location=0) int x; } outs;\n"
12915 "out gl_PerVertex {\n"
12916 " vec4 gl_Position;\n"
12917 "};\n"
12918 "void main(){\n"
12919 " outs.x = 0;\n"
12920 " gl_Position = vec4(1);\n"
12921 "}\n";
12922 char const *fsSource = "#version 450\n"
12923 "\n"
12924 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
12925 "layout(location=0) out vec4 color;\n"
12926 "void main(){\n"
12927 " color = vec4(ins.x);\n"
12928 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130012929
12930 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12931 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12932
12933 VkPipelineObj pipe(m_device);
12934 pipe.AddColorAttachment();
12935 pipe.AddShader(&vs);
12936 pipe.AddShader(&fs);
12937
12938 VkDescriptorSetObj descriptorSet(m_device);
12939 descriptorSet.AppendDummy();
12940 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12941
12942 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12943
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012944 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012945}
12946
12947TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012948 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012949 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
Chris Forbes1cc79542016-07-20 11:13:44 +120012950 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012951 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 +130012952
12953 ASSERT_NO_FATAL_FAILURE(InitState());
12954 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12955
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012956 char const *vsSource = "#version 450\n"
12957 "\n"
12958 "out block { layout(location=1) float x; } outs;\n"
12959 "out gl_PerVertex {\n"
12960 " vec4 gl_Position;\n"
12961 "};\n"
12962 "void main(){\n"
12963 " outs.x = 0;\n"
12964 " gl_Position = vec4(1);\n"
12965 "}\n";
12966 char const *fsSource = "#version 450\n"
12967 "\n"
12968 "in block { layout(location=0) float x; } ins;\n"
12969 "layout(location=0) out vec4 color;\n"
12970 "void main(){\n"
12971 " color = vec4(ins.x);\n"
12972 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130012973
12974 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12975 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12976
12977 VkPipelineObj pipe(m_device);
12978 pipe.AddColorAttachment();
12979 pipe.AddShader(&vs);
12980 pipe.AddShader(&fs);
12981
12982 VkDescriptorSetObj descriptorSet(m_device);
12983 descriptorSet.AppendDummy();
12984 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12985
12986 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12987
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012988 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012989}
12990
12991TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012992 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012993 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
Chris Forbes1cc79542016-07-20 11:13:44 +120012994 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012995 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 +130012996
12997 ASSERT_NO_FATAL_FAILURE(InitState());
12998 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12999
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013000 char const *vsSource = "#version 450\n"
13001 "\n"
13002 "out block { layout(location=0, component=0) float x; } outs;\n"
13003 "out gl_PerVertex {\n"
13004 " vec4 gl_Position;\n"
13005 "};\n"
13006 "void main(){\n"
13007 " outs.x = 0;\n"
13008 " gl_Position = vec4(1);\n"
13009 "}\n";
13010 char const *fsSource = "#version 450\n"
13011 "\n"
13012 "in block { layout(location=0, component=1) float x; } ins;\n"
13013 "layout(location=0) out vec4 color;\n"
13014 "void main(){\n"
13015 " color = vec4(ins.x);\n"
13016 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130013017
13018 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13019 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13020
13021 VkPipelineObj pipe(m_device);
13022 pipe.AddColorAttachment();
13023 pipe.AddShader(&vs);
13024 pipe.AddShader(&fs);
13025
13026 VkDescriptorSetObj descriptorSet(m_device);
13027 descriptorSet.AppendDummy();
13028 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13029
13030 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13031
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013032 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013033}
13034
Chris Forbes1f3b0152016-11-30 12:48:40 +130013035TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
13036 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
13037
13038 ASSERT_NO_FATAL_FAILURE(InitState());
13039 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13040
13041 char const *vsSource = "#version 450\n"
13042 "layout(location=0) out mediump float x;\n"
13043 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13044 char const *fsSource = "#version 450\n"
13045 "layout(location=0) in highp float x;\n"
13046 "layout(location=0) out vec4 color;\n"
13047 "void main() { color = vec4(x); }\n";
13048
13049 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13050 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13051
13052 VkPipelineObj pipe(m_device);
13053 pipe.AddColorAttachment();
13054 pipe.AddShader(&vs);
13055 pipe.AddShader(&fs);
13056
13057 VkDescriptorSetObj descriptorSet(m_device);
13058 descriptorSet.AppendDummy();
13059 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13060
13061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
13062
13063 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13064
13065 m_errorMonitor->VerifyFound();
13066}
13067
Chris Forbes870a39e2016-11-30 12:55:56 +130013068TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
13069 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
13070
13071 ASSERT_NO_FATAL_FAILURE(InitState());
13072 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13073
13074 char const *vsSource = "#version 450\n"
13075 "out block { layout(location=0) mediump float x; };\n"
13076 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13077 char const *fsSource = "#version 450\n"
13078 "in block { layout(location=0) highp float x; };\n"
13079 "layout(location=0) out vec4 color;\n"
13080 "void main() { color = vec4(x); }\n";
13081
13082 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13083 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13084
13085 VkPipelineObj pipe(m_device);
13086 pipe.AddColorAttachment();
13087 pipe.AddShader(&vs);
13088 pipe.AddShader(&fs);
13089
13090 VkDescriptorSetObj descriptorSet(m_device);
13091 descriptorSet.AppendDummy();
13092 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13093
13094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
13095
13096 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13097
13098 m_errorMonitor->VerifyFound();
13099}
13100
Karl Schultz6addd812016-02-02 17:17:23 -070013101TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013102 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
13103 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013105
Chris Forbesde136e02015-05-25 11:13:28 +120013106 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013107 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120013108
13109 VkVertexInputBindingDescription input_binding;
13110 memset(&input_binding, 0, sizeof(input_binding));
13111
13112 VkVertexInputAttributeDescription input_attrib;
13113 memset(&input_attrib, 0, sizeof(input_attrib));
13114 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13115
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013116 char const *vsSource = "#version 450\n"
13117 "\n"
13118 "out gl_PerVertex {\n"
13119 " vec4 gl_Position;\n"
13120 "};\n"
13121 "void main(){\n"
13122 " gl_Position = vec4(1);\n"
13123 "}\n";
13124 char const *fsSource = "#version 450\n"
13125 "\n"
13126 "layout(location=0) out vec4 color;\n"
13127 "void main(){\n"
13128 " color = vec4(1);\n"
13129 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120013130
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013131 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13132 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120013133
13134 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013135 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120013136 pipe.AddShader(&vs);
13137 pipe.AddShader(&fs);
13138
13139 pipe.AddVertexInputBindings(&input_binding, 1);
13140 pipe.AddVertexInputAttribs(&input_attrib, 1);
13141
Chris Forbesde136e02015-05-25 11:13:28 +120013142 VkDescriptorSetObj descriptorSet(m_device);
13143 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013144 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120013145
Tony Barbour5781e8f2015-08-04 16:23:11 -060013146 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120013147
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013148 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120013149}
13150
Karl Schultz6addd812016-02-02 17:17:23 -070013151TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013152 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
13153 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013154 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130013155
13156 ASSERT_NO_FATAL_FAILURE(InitState());
13157 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13158
13159 VkVertexInputBindingDescription input_binding;
13160 memset(&input_binding, 0, sizeof(input_binding));
13161
13162 VkVertexInputAttributeDescription input_attrib;
13163 memset(&input_attrib, 0, sizeof(input_attrib));
13164 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13165
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013166 char const *vsSource = "#version 450\n"
13167 "\n"
13168 "layout(location=1) in float x;\n"
13169 "out gl_PerVertex {\n"
13170 " vec4 gl_Position;\n"
13171 "};\n"
13172 "void main(){\n"
13173 " gl_Position = vec4(x);\n"
13174 "}\n";
13175 char const *fsSource = "#version 450\n"
13176 "\n"
13177 "layout(location=0) out vec4 color;\n"
13178 "void main(){\n"
13179 " color = vec4(1);\n"
13180 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130013181
13182 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13183 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13184
13185 VkPipelineObj pipe(m_device);
13186 pipe.AddColorAttachment();
13187 pipe.AddShader(&vs);
13188 pipe.AddShader(&fs);
13189
13190 pipe.AddVertexInputBindings(&input_binding, 1);
13191 pipe.AddVertexInputAttribs(&input_attrib, 1);
13192
13193 VkDescriptorSetObj descriptorSet(m_device);
13194 descriptorSet.AppendDummy();
13195 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13196
13197 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13198
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013199 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130013200}
13201
Karl Schultz6addd812016-02-02 17:17:23 -070013202TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013203 TEST_DESCRIPTION("Test that an error is produced for a vertex shader input which is not "
Chris Forbes1cc79542016-07-20 11:13:44 +120013204 "provided by a vertex attribute");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013205 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 -060013206
Chris Forbes62e8e502015-05-25 11:13:29 +120013207 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013208 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120013209
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013210 char const *vsSource = "#version 450\n"
13211 "\n"
13212 "layout(location=0) in vec4 x;\n" /* not provided */
13213 "out gl_PerVertex {\n"
13214 " vec4 gl_Position;\n"
13215 "};\n"
13216 "void main(){\n"
13217 " gl_Position = x;\n"
13218 "}\n";
13219 char const *fsSource = "#version 450\n"
13220 "\n"
13221 "layout(location=0) out vec4 color;\n"
13222 "void main(){\n"
13223 " color = vec4(1);\n"
13224 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120013225
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013226 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13227 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120013228
13229 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013230 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120013231 pipe.AddShader(&vs);
13232 pipe.AddShader(&fs);
13233
Chris Forbes62e8e502015-05-25 11:13:29 +120013234 VkDescriptorSetObj descriptorSet(m_device);
13235 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013236 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120013237
Tony Barbour5781e8f2015-08-04 16:23:11 -060013238 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120013239
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013240 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120013241}
13242
Karl Schultz6addd812016-02-02 17:17:23 -070013243TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013244 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
13245 "fundamental type (float/int/uint) of an attribute and the "
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013246 "vertex shader input that consumes it");
13247 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 -060013248
Chris Forbesc97d98e2015-05-25 11:13:31 +120013249 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013250 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013251
13252 VkVertexInputBindingDescription input_binding;
13253 memset(&input_binding, 0, sizeof(input_binding));
13254
13255 VkVertexInputAttributeDescription input_attrib;
13256 memset(&input_attrib, 0, sizeof(input_attrib));
13257 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13258
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013259 char const *vsSource = "#version 450\n"
13260 "\n"
13261 "layout(location=0) in int x;\n" /* attrib provided float */
13262 "out gl_PerVertex {\n"
13263 " vec4 gl_Position;\n"
13264 "};\n"
13265 "void main(){\n"
13266 " gl_Position = vec4(x);\n"
13267 "}\n";
13268 char const *fsSource = "#version 450\n"
13269 "\n"
13270 "layout(location=0) out vec4 color;\n"
13271 "void main(){\n"
13272 " color = vec4(1);\n"
13273 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120013274
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013275 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13276 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013277
13278 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013279 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013280 pipe.AddShader(&vs);
13281 pipe.AddShader(&fs);
13282
13283 pipe.AddVertexInputBindings(&input_binding, 1);
13284 pipe.AddVertexInputAttribs(&input_attrib, 1);
13285
Chris Forbesc97d98e2015-05-25 11:13:31 +120013286 VkDescriptorSetObj descriptorSet(m_device);
13287 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013288 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013289
Tony Barbour5781e8f2015-08-04 16:23:11 -060013290 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013291
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013292 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013293}
13294
Chris Forbesc68b43c2016-04-06 11:18:47 +120013295TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013296 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
13297 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13299 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120013300
13301 ASSERT_NO_FATAL_FAILURE(InitState());
13302 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13303
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013304 char const *vsSource = "#version 450\n"
13305 "\n"
13306 "out gl_PerVertex {\n"
13307 " vec4 gl_Position;\n"
13308 "};\n"
13309 "void main(){\n"
13310 " gl_Position = vec4(1);\n"
13311 "}\n";
13312 char const *fsSource = "#version 450\n"
13313 "\n"
13314 "layout(location=0) out vec4 color;\n"
13315 "void main(){\n"
13316 " color = vec4(1);\n"
13317 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120013318
13319 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13320 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13321
13322 VkPipelineObj pipe(m_device);
13323 pipe.AddColorAttachment();
13324 pipe.AddShader(&vs);
Mike Weiblencce7ec72016-10-17 19:33:05 -060013325 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120013326 pipe.AddShader(&fs);
13327
13328 VkDescriptorSetObj descriptorSet(m_device);
13329 descriptorSet.AppendDummy();
13330 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13331
13332 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13333
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013334 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120013335}
13336
Chris Forbes82ff92a2016-09-09 10:50:24 +120013337TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
13338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13339 "No entrypoint found named `foo`");
13340
13341 ASSERT_NO_FATAL_FAILURE(InitState());
13342 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13343
13344 char const *vsSource = "#version 450\n"
13345 "out gl_PerVertex {\n"
13346 " vec4 gl_Position;\n"
13347 "};\n"
13348 "void main(){\n"
13349 " gl_Position = vec4(0);\n"
13350 "}\n";
13351 char const *fsSource = "#version 450\n"
13352 "\n"
13353 "layout(location=0) out vec4 color;\n"
13354 "void main(){\n"
13355 " color = vec4(1);\n"
13356 "}\n";
13357
13358 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13359 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
13360
13361 VkPipelineObj pipe(m_device);
13362 pipe.AddColorAttachment();
13363 pipe.AddShader(&vs);
13364 pipe.AddShader(&fs);
13365
13366 VkDescriptorSetObj descriptorSet(m_device);
13367 descriptorSet.AppendDummy();
13368 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13369
13370 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13371
13372 m_errorMonitor->VerifyFound();
13373}
13374
Chris Forbesae9d8cd2016-09-13 16:32:57 +120013375TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
13376 m_errorMonitor->SetDesiredFailureMsg(
13377 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13378 "pDepthStencilState is NULL when rasterization is enabled and subpass "
13379 "uses a depth/stencil attachment");
13380
13381 ASSERT_NO_FATAL_FAILURE(InitState());
13382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13383
13384 char const *vsSource = "#version 450\n"
13385 "void main(){ gl_Position = vec4(0); }\n";
13386 char const *fsSource = "#version 450\n"
13387 "\n"
13388 "layout(location=0) out vec4 color;\n"
13389 "void main(){\n"
13390 " color = vec4(1);\n"
13391 "}\n";
13392
13393 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13394 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13395
13396 VkPipelineObj pipe(m_device);
13397 pipe.AddColorAttachment();
13398 pipe.AddShader(&vs);
13399 pipe.AddShader(&fs);
13400
13401 VkDescriptorSetObj descriptorSet(m_device);
13402 descriptorSet.AppendDummy();
13403 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13404
13405 VkAttachmentDescription attachments[] = {
13406 { 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
13407 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13408 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13409 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
13410 },
13411 { 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT,
13412 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13413 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13414 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
13415 },
13416 };
13417 VkAttachmentReference refs[] = {
13418 { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL },
13419 { 1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL },
13420 };
13421 VkSubpassDescription subpass = {
13422 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
13423 1, &refs[0], nullptr, &refs[1],
13424 0, nullptr
13425 };
13426 VkRenderPassCreateInfo rpci = {
13427 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
13428 0, 2, attachments, 1, &subpass, 0, nullptr
13429 };
13430 VkRenderPass rp;
13431 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13432 ASSERT_VK_SUCCESS(err);
13433
13434 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
13435
13436 m_errorMonitor->VerifyFound();
13437
13438 vkDestroyRenderPass(m_device->device(), rp, nullptr);
13439}
13440
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013441TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013442 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
13443 "the TCS without the patch decoration, but consumed in the TES "
13444 "with the decoration.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is per-vertex in tessellation control shader stage "
13446 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120013447
13448 ASSERT_NO_FATAL_FAILURE(InitState());
13449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13450
Chris Forbesc1e852d2016-04-04 19:26:42 +120013451 if (!m_device->phy().features().tessellationShader) {
13452 printf("Device does not support tessellation shaders; skipped.\n");
13453 return;
13454 }
13455
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013456 char const *vsSource = "#version 450\n"
13457 "void main(){}\n";
13458 char const *tcsSource = "#version 450\n"
13459 "layout(location=0) out int x[];\n"
13460 "layout(vertices=3) out;\n"
13461 "void main(){\n"
13462 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13463 " gl_TessLevelInner[0] = 1;\n"
13464 " x[gl_InvocationID] = gl_InvocationID;\n"
13465 "}\n";
13466 char const *tesSource = "#version 450\n"
13467 "layout(triangles, equal_spacing, cw) in;\n"
13468 "layout(location=0) patch in int x;\n"
13469 "out gl_PerVertex { vec4 gl_Position; };\n"
13470 "void main(){\n"
13471 " gl_Position.xyz = gl_TessCoord;\n"
13472 " gl_Position.w = x;\n"
13473 "}\n";
13474 char const *fsSource = "#version 450\n"
13475 "layout(location=0) out vec4 color;\n"
13476 "void main(){\n"
13477 " color = vec4(1);\n"
13478 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120013479
13480 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13481 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13482 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13483 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13484
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013485 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
13486 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120013487
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013488 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120013489
13490 VkPipelineObj pipe(m_device);
13491 pipe.SetInputAssembly(&iasci);
13492 pipe.SetTessellation(&tsci);
13493 pipe.AddColorAttachment();
13494 pipe.AddShader(&vs);
13495 pipe.AddShader(&tcs);
13496 pipe.AddShader(&tes);
13497 pipe.AddShader(&fs);
13498
13499 VkDescriptorSetObj descriptorSet(m_device);
13500 descriptorSet.AppendDummy();
13501 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13502
13503 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13504
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013505 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120013506}
13507
Karl Schultz6addd812016-02-02 17:17:23 -070013508TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013509 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
13510 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013511 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13512 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013513
Chris Forbes280ba2c2015-06-12 11:16:41 +120013514 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013515 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013516
13517 /* Two binding descriptions for binding 0 */
13518 VkVertexInputBindingDescription input_bindings[2];
13519 memset(input_bindings, 0, sizeof(input_bindings));
13520
13521 VkVertexInputAttributeDescription input_attrib;
13522 memset(&input_attrib, 0, sizeof(input_attrib));
13523 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13524
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013525 char const *vsSource = "#version 450\n"
13526 "\n"
13527 "layout(location=0) in float x;\n" /* attrib provided float */
13528 "out gl_PerVertex {\n"
13529 " vec4 gl_Position;\n"
13530 "};\n"
13531 "void main(){\n"
13532 " gl_Position = vec4(x);\n"
13533 "}\n";
13534 char const *fsSource = "#version 450\n"
13535 "\n"
13536 "layout(location=0) out vec4 color;\n"
13537 "void main(){\n"
13538 " color = vec4(1);\n"
13539 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120013540
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013541 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13542 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013543
13544 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013545 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013546 pipe.AddShader(&vs);
13547 pipe.AddShader(&fs);
13548
13549 pipe.AddVertexInputBindings(input_bindings, 2);
13550 pipe.AddVertexInputAttribs(&input_attrib, 1);
13551
Chris Forbes280ba2c2015-06-12 11:16:41 +120013552 VkDescriptorSetObj descriptorSet(m_device);
13553 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013554 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013555
Tony Barbour5781e8f2015-08-04 16:23:11 -060013556 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013557
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013558 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013559}
Chris Forbes8f68b562015-05-25 11:13:32 +120013560
Karl Schultz6addd812016-02-02 17:17:23 -070013561TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mike Weiblencce7ec72016-10-17 19:33:05 -060013562 TEST_DESCRIPTION("Test that an error is produced for a fragment shader which does not "
Chris Forbes1cc79542016-07-20 11:13:44 +120013563 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013565
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013566 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013567
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013568 char const *vsSource = "#version 450\n"
13569 "\n"
13570 "out gl_PerVertex {\n"
13571 " vec4 gl_Position;\n"
13572 "};\n"
13573 "void main(){\n"
13574 " gl_Position = vec4(1);\n"
13575 "}\n";
13576 char const *fsSource = "#version 450\n"
13577 "\n"
13578 "void main(){\n"
13579 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013580
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013581 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13582 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013583
13584 VkPipelineObj pipe(m_device);
13585 pipe.AddShader(&vs);
13586 pipe.AddShader(&fs);
13587
Chia-I Wu08accc62015-07-07 11:50:03 +080013588 /* set up CB 0, not written */
13589 pipe.AddColorAttachment();
13590 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013591
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013592 VkDescriptorSetObj descriptorSet(m_device);
13593 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013594 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013595
Tony Barbour5781e8f2015-08-04 16:23:11 -060013596 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013597
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013598 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013599}
13600
Karl Schultz6addd812016-02-02 17:17:23 -070013601TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mike Weiblencce7ec72016-10-17 19:33:05 -060013602 TEST_DESCRIPTION("Test that a warning is produced for a fragment shader which provides a spurious "
Chris Forbes1cc79542016-07-20 11:13:44 +120013603 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013605 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013606
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013607 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013608
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013609 char const *vsSource = "#version 450\n"
13610 "\n"
13611 "out gl_PerVertex {\n"
13612 " vec4 gl_Position;\n"
13613 "};\n"
13614 "void main(){\n"
13615 " gl_Position = vec4(1);\n"
13616 "}\n";
13617 char const *fsSource = "#version 450\n"
13618 "\n"
13619 "layout(location=0) out vec4 x;\n"
13620 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
13621 "void main(){\n"
13622 " x = vec4(1);\n"
13623 " y = vec4(1);\n"
13624 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013625
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013626 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13627 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013628
13629 VkPipelineObj pipe(m_device);
13630 pipe.AddShader(&vs);
13631 pipe.AddShader(&fs);
13632
Chia-I Wu08accc62015-07-07 11:50:03 +080013633 /* set up CB 0, not written */
13634 pipe.AddColorAttachment();
13635 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013636 /* FS writes CB 1, but we don't configure it */
13637
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013638 VkDescriptorSetObj descriptorSet(m_device);
13639 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013640 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013641
Tony Barbour5781e8f2015-08-04 16:23:11 -060013642 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013643
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013644 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013645}
13646
Karl Schultz6addd812016-02-02 17:17:23 -070013647TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013648 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
Mike Weiblencce7ec72016-10-17 19:33:05 -060013649 "type of an fragment shader output variable, and the format of the corresponding attachment");
13650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013651
Chris Forbesa36d69e2015-05-25 11:13:44 +120013652 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013653
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013654 char const *vsSource = "#version 450\n"
13655 "\n"
13656 "out gl_PerVertex {\n"
13657 " vec4 gl_Position;\n"
13658 "};\n"
13659 "void main(){\n"
13660 " gl_Position = vec4(1);\n"
13661 "}\n";
13662 char const *fsSource = "#version 450\n"
13663 "\n"
13664 "layout(location=0) out ivec4 x;\n" /* not UNORM */
13665 "void main(){\n"
13666 " x = ivec4(1);\n"
13667 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120013668
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013669 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13670 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013671
13672 VkPipelineObj pipe(m_device);
13673 pipe.AddShader(&vs);
13674 pipe.AddShader(&fs);
13675
Chia-I Wu08accc62015-07-07 11:50:03 +080013676 /* set up CB 0; type is UNORM by default */
13677 pipe.AddColorAttachment();
13678 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013679
Chris Forbesa36d69e2015-05-25 11:13:44 +120013680 VkDescriptorSetObj descriptorSet(m_device);
13681 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013682 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013683
Tony Barbour5781e8f2015-08-04 16:23:11 -060013684 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013685
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013686 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120013687}
Chris Forbes7b1b8932015-06-05 14:43:36 +120013688
Karl Schultz6addd812016-02-02 17:17:23 -070013689TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013690 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
13691 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013693
Chris Forbes556c76c2015-08-14 12:04:59 +120013694 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120013695
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013696 char const *vsSource = "#version 450\n"
13697 "\n"
13698 "out gl_PerVertex {\n"
13699 " vec4 gl_Position;\n"
13700 "};\n"
13701 "void main(){\n"
13702 " gl_Position = vec4(1);\n"
13703 "}\n";
13704 char const *fsSource = "#version 450\n"
13705 "\n"
13706 "layout(location=0) out vec4 x;\n"
13707 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
13708 "void main(){\n"
13709 " x = vec4(bar.y);\n"
13710 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120013711
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013712 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13713 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120013714
Chris Forbes556c76c2015-08-14 12:04:59 +120013715 VkPipelineObj pipe(m_device);
13716 pipe.AddShader(&vs);
13717 pipe.AddShader(&fs);
13718
13719 /* set up CB 0; type is UNORM by default */
13720 pipe.AddColorAttachment();
13721 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13722
13723 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013724 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120013725
13726 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13727
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013728 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120013729}
13730
Chris Forbes5c59e902016-02-26 16:56:09 +130013731TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013732 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
13733 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130013735
13736 ASSERT_NO_FATAL_FAILURE(InitState());
13737
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013738 char const *vsSource = "#version 450\n"
13739 "\n"
13740 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13741 "out gl_PerVertex {\n"
13742 " vec4 gl_Position;\n"
13743 "};\n"
13744 "void main(){\n"
13745 " gl_Position = vec4(consts.x);\n"
13746 "}\n";
13747 char const *fsSource = "#version 450\n"
13748 "\n"
13749 "layout(location=0) out vec4 x;\n"
13750 "void main(){\n"
13751 " x = vec4(1);\n"
13752 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130013753
13754 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13755 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13756
13757 VkPipelineObj pipe(m_device);
13758 pipe.AddShader(&vs);
13759 pipe.AddShader(&fs);
13760
13761 /* set up CB 0; type is UNORM by default */
13762 pipe.AddColorAttachment();
13763 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13764
13765 VkDescriptorSetObj descriptorSet(m_device);
13766 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13767
13768 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13769
13770 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013771 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130013772}
13773
Chris Forbes3fb17902016-08-22 14:57:55 +120013774TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
13775 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
13776 "which is not included in the subpass description");
13777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13778 "consumes input attachment index 0 but not provided in subpass");
13779
13780 ASSERT_NO_FATAL_FAILURE(InitState());
13781
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013782 char const *vsSource = "#version 450\n"
13783 "\n"
13784 "out gl_PerVertex {\n"
13785 " vec4 gl_Position;\n"
13786 "};\n"
13787 "void main(){\n"
13788 " gl_Position = vec4(1);\n"
13789 "}\n";
13790 char const *fsSource = "#version 450\n"
13791 "\n"
13792 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
13793 "layout(location=0) out vec4 color;\n"
13794 "void main() {\n"
13795 " color = subpassLoad(x);\n"
13796 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120013797
13798 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13799 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13800
13801 VkPipelineObj pipe(m_device);
13802 pipe.AddShader(&vs);
13803 pipe.AddShader(&fs);
13804 pipe.AddColorAttachment();
13805 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13806
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013807 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
13808 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120013809 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013810 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120013811 ASSERT_VK_SUCCESS(err);
13812
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013813 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120013814 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013815 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120013816 ASSERT_VK_SUCCESS(err);
13817
13818 // error here.
13819 pipe.CreateVKPipeline(pl, renderPass());
13820
13821 m_errorMonitor->VerifyFound();
13822
13823 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13824 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13825}
13826
Chris Forbes5a9a0472016-08-22 16:02:09 +120013827TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
13828 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
13829 "with a format having a different fundamental type");
13830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13831 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
13832
13833 ASSERT_NO_FATAL_FAILURE(InitState());
13834
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013835 char const *vsSource = "#version 450\n"
13836 "\n"
13837 "out gl_PerVertex {\n"
13838 " vec4 gl_Position;\n"
13839 "};\n"
13840 "void main(){\n"
13841 " gl_Position = vec4(1);\n"
13842 "}\n";
13843 char const *fsSource = "#version 450\n"
13844 "\n"
13845 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
13846 "layout(location=0) out vec4 color;\n"
13847 "void main() {\n"
13848 " color = subpassLoad(x);\n"
13849 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120013850
13851 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13852 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13853
13854 VkPipelineObj pipe(m_device);
13855 pipe.AddShader(&vs);
13856 pipe.AddShader(&fs);
13857 pipe.AddColorAttachment();
13858 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13859
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013860 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
13861 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013862 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013863 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120013864 ASSERT_VK_SUCCESS(err);
13865
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013866 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013867 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013868 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120013869 ASSERT_VK_SUCCESS(err);
13870
13871 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013872 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
13873 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
13874 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
13875 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
13876 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 +120013877 };
13878 VkAttachmentReference color = {
13879 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
13880 };
13881 VkAttachmentReference input = {
13882 1, VK_IMAGE_LAYOUT_GENERAL,
13883 };
13884
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013885 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013886
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013887 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013888 VkRenderPass rp;
13889 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13890 ASSERT_VK_SUCCESS(err);
13891
13892 // error here.
13893 pipe.CreateVKPipeline(pl, rp);
13894
13895 m_errorMonitor->VerifyFound();
13896
13897 vkDestroyRenderPass(m_device->device(), rp, nullptr);
13898 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13899 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13900}
13901
Chris Forbes541f7b02016-08-22 15:30:27 +120013902TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
13903 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
13904 "which is not included in the subpass description -- array case");
13905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13906 "consumes input attachment index 1 but not provided in subpass");
13907
13908 ASSERT_NO_FATAL_FAILURE(InitState());
13909
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013910 char const *vsSource = "#version 450\n"
13911 "\n"
13912 "out gl_PerVertex {\n"
13913 " vec4 gl_Position;\n"
13914 "};\n"
13915 "void main(){\n"
13916 " gl_Position = vec4(1);\n"
13917 "}\n";
13918 char const *fsSource = "#version 450\n"
13919 "\n"
13920 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[2];\n"
13921 "layout(location=0) out vec4 color;\n"
13922 "void main() {\n"
13923 " color = subpassLoad(xs[1]);\n"
13924 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120013925
13926 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13927 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13928
13929 VkPipelineObj pipe(m_device);
13930 pipe.AddShader(&vs);
13931 pipe.AddShader(&fs);
13932 pipe.AddColorAttachment();
13933 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13934
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013935 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
13936 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120013937 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013938 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120013939 ASSERT_VK_SUCCESS(err);
13940
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013941 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120013942 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013943 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120013944 ASSERT_VK_SUCCESS(err);
13945
13946 // error here.
13947 pipe.CreateVKPipeline(pl, renderPass());
13948
13949 m_errorMonitor->VerifyFound();
13950
13951 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13952 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13953}
13954
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013955TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013956 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
13957 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013959
13960 ASSERT_NO_FATAL_FAILURE(InitState());
13961
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013962 char const *csSource = "#version 450\n"
13963 "\n"
13964 "layout(local_size_x=1) in;\n"
13965 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13966 "void main(){\n"
13967 " x = vec4(1);\n"
13968 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013969
13970 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13971
13972 VkDescriptorSetObj descriptorSet(m_device);
13973 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13974
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013975 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13976 nullptr,
13977 0,
13978 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
13979 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
13980 descriptorSet.GetPipelineLayout(),
13981 VK_NULL_HANDLE,
13982 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013983
13984 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013985 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013986
13987 m_errorMonitor->VerifyFound();
13988
13989 if (err == VK_SUCCESS) {
13990 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13991 }
13992}
13993
Chris Forbes22a9b092016-07-19 14:34:05 +120013994TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013995 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
13996 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13998 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120013999
14000 ASSERT_NO_FATAL_FAILURE(InitState());
14001
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014002 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
14003 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120014004 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014005 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120014006 ASSERT_VK_SUCCESS(err);
14007
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014008 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120014009 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014010 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120014011 ASSERT_VK_SUCCESS(err);
14012
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014013 char const *csSource = "#version 450\n"
14014 "\n"
14015 "layout(local_size_x=1) in;\n"
14016 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14017 "void main() {\n"
14018 " x.x = 1.0f;\n"
14019 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120014020 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14021
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014022 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14023 nullptr,
14024 0,
14025 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
14026 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
14027 pl,
14028 VK_NULL_HANDLE,
14029 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120014030
14031 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014032 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120014033
14034 m_errorMonitor->VerifyFound();
14035
14036 if (err == VK_SUCCESS) {
14037 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14038 }
14039
14040 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14041 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14042}
14043
Chris Forbes50020592016-07-27 13:52:41 +120014044TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
14045 TEST_DESCRIPTION("Test that an error is produced when an image view type "
14046 "does not match the dimensionality declared in the shader");
14047
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014048 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 +120014049
14050 ASSERT_NO_FATAL_FAILURE(InitState());
14051 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14052
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014053 char const *vsSource = "#version 450\n"
14054 "\n"
14055 "out gl_PerVertex { vec4 gl_Position; };\n"
14056 "void main() { gl_Position = vec4(0); }\n";
14057 char const *fsSource = "#version 450\n"
14058 "\n"
14059 "layout(set=0, binding=0) uniform sampler3D s;\n"
14060 "layout(location=0) out vec4 color;\n"
14061 "void main() {\n"
14062 " color = texture(s, vec3(0));\n"
14063 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120014064 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14065 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14066
14067 VkPipelineObj pipe(m_device);
14068 pipe.AddShader(&vs);
14069 pipe.AddShader(&fs);
14070 pipe.AddColorAttachment();
14071
14072 VkTextureObj texture(m_device, nullptr);
14073 VkSamplerObj sampler(m_device);
14074
14075 VkDescriptorSetObj descriptorSet(m_device);
14076 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14077 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14078
14079 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14080 ASSERT_VK_SUCCESS(err);
14081
14082 BeginCommandBuffer();
14083
14084 m_commandBuffer->BindPipeline(pipe);
14085 m_commandBuffer->BindDescriptorSet(descriptorSet);
14086
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014087 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120014088 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014089 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120014090 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14091
14092 // error produced here.
14093 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14094
14095 m_errorMonitor->VerifyFound();
14096
14097 EndCommandBuffer();
14098}
14099
Chris Forbes5533bfc2016-07-27 14:12:34 +120014100TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
14101 TEST_DESCRIPTION("Test that an error is produced when a multisampled images "
14102 "are consumed via singlesample images types in the shader, or vice versa.");
14103
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120014105
14106 ASSERT_NO_FATAL_FAILURE(InitState());
14107 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14108
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014109 char const *vsSource = "#version 450\n"
14110 "\n"
14111 "out gl_PerVertex { vec4 gl_Position; };\n"
14112 "void main() { gl_Position = vec4(0); }\n";
14113 char const *fsSource = "#version 450\n"
14114 "\n"
14115 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
14116 "layout(location=0) out vec4 color;\n"
14117 "void main() {\n"
14118 " color = texelFetch(s, ivec2(0), 0);\n"
14119 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120014120 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14121 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14122
14123 VkPipelineObj pipe(m_device);
14124 pipe.AddShader(&vs);
14125 pipe.AddShader(&fs);
14126 pipe.AddColorAttachment();
14127
14128 VkTextureObj texture(m_device, nullptr);
14129 VkSamplerObj sampler(m_device);
14130
14131 VkDescriptorSetObj descriptorSet(m_device);
14132 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14133 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14134
14135 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14136 ASSERT_VK_SUCCESS(err);
14137
14138 BeginCommandBuffer();
14139
14140 m_commandBuffer->BindPipeline(pipe);
14141 m_commandBuffer->BindDescriptorSet(descriptorSet);
14142
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014143 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120014144 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014145 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120014146 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14147
14148 // error produced here.
14149 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14150
14151 m_errorMonitor->VerifyFound();
14152
14153 EndCommandBuffer();
14154}
14155
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014156#endif // SHADER_CHECKER_TESTS
14157
14158#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060014159TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014161
14162 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014163
14164 // Create an image
14165 VkImage image;
14166
Karl Schultz6addd812016-02-02 17:17:23 -070014167 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14168 const int32_t tex_width = 32;
14169 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014170
14171 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014172 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14173 image_create_info.pNext = NULL;
14174 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14175 image_create_info.format = tex_format;
14176 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014177 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070014178 image_create_info.extent.depth = 1;
14179 image_create_info.mipLevels = 1;
14180 image_create_info.arrayLayers = 1;
14181 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14182 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14183 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14184 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014185
14186 // Introduce error by sending down a bogus width extent
14187 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014188 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014189
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014190 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014191}
14192
Mark Youngc48c4c12016-04-11 14:26:49 -060014193TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14195 "CreateImage extents is 0 for at least one required dimension");
Mark Youngc48c4c12016-04-11 14:26:49 -060014196
14197 ASSERT_NO_FATAL_FAILURE(InitState());
14198
14199 // Create an image
14200 VkImage image;
14201
14202 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14203 const int32_t tex_width = 32;
14204 const int32_t tex_height = 32;
14205
14206 VkImageCreateInfo image_create_info = {};
14207 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14208 image_create_info.pNext = NULL;
14209 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14210 image_create_info.format = tex_format;
14211 image_create_info.extent.width = tex_width;
14212 image_create_info.extent.height = tex_height;
14213 image_create_info.extent.depth = 1;
14214 image_create_info.mipLevels = 1;
14215 image_create_info.arrayLayers = 1;
14216 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14217 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14218 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14219 image_create_info.flags = 0;
14220
14221 // Introduce error by sending down a bogus width extent
14222 image_create_info.extent.width = 0;
14223 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14224
14225 m_errorMonitor->VerifyFound();
14226}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014227#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120014228
Tobin Ehliscde08892015-09-22 10:11:37 -060014229#if IMAGE_TESTS
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070014230
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014231TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
14232 TEST_DESCRIPTION("Create a render pass with an attachment description "
14233 "format set to VK_FORMAT_UNDEFINED");
14234
14235 ASSERT_NO_FATAL_FAILURE(InitState());
14236 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14237
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014239
14240 VkAttachmentReference color_attach = {};
14241 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
14242 color_attach.attachment = 0;
14243 VkSubpassDescription subpass = {};
14244 subpass.colorAttachmentCount = 1;
14245 subpass.pColorAttachments = &color_attach;
14246
14247 VkRenderPassCreateInfo rpci = {};
14248 rpci.subpassCount = 1;
14249 rpci.pSubpasses = &subpass;
14250 rpci.attachmentCount = 1;
14251 VkAttachmentDescription attach_desc = {};
14252 attach_desc.format = VK_FORMAT_UNDEFINED;
14253 rpci.pAttachments = &attach_desc;
14254 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
14255 VkRenderPass rp;
14256 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
14257
14258 m_errorMonitor->VerifyFound();
14259
14260 if (result == VK_SUCCESS) {
14261 vkDestroyRenderPass(m_device->device(), rp, NULL);
14262 }
14263}
14264
Karl Schultz6addd812016-02-02 17:17:23 -070014265TEST_F(VkLayerTest, InvalidImageView) {
14266 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060014267
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseMipLevel 10 ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014269
Tobin Ehliscde08892015-09-22 10:11:37 -060014270 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060014271
Mike Stroyana3082432015-09-25 13:39:21 -060014272 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070014273 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060014274
Karl Schultz6addd812016-02-02 17:17:23 -070014275 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14276 const int32_t tex_width = 32;
14277 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060014278
14279 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014280 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14281 image_create_info.pNext = NULL;
14282 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14283 image_create_info.format = tex_format;
14284 image_create_info.extent.width = tex_width;
14285 image_create_info.extent.height = tex_height;
14286 image_create_info.extent.depth = 1;
14287 image_create_info.mipLevels = 1;
14288 image_create_info.arrayLayers = 1;
14289 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14290 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14291 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14292 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060014293
Chia-I Wuf7458c52015-10-26 21:10:41 +080014294 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060014295 ASSERT_VK_SUCCESS(err);
14296
14297 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130014298 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070014299 image_view_create_info.image = image;
14300 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14301 image_view_create_info.format = tex_format;
14302 image_view_create_info.subresourceRange.layerCount = 1;
14303 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
14304 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014305 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060014306
14307 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014308 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060014309
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014310 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060014311 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060014312}
Mike Stroyana3082432015-09-25 13:39:21 -060014313
Mark Youngd339ba32016-05-30 13:28:35 -060014314TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
14315 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060014316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060014317 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060014318
14319 ASSERT_NO_FATAL_FAILURE(InitState());
14320
14321 // Create an image and try to create a view with no memory backing the image
14322 VkImage image;
14323
14324 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14325 const int32_t tex_width = 32;
14326 const int32_t tex_height = 32;
14327
14328 VkImageCreateInfo image_create_info = {};
14329 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14330 image_create_info.pNext = NULL;
14331 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14332 image_create_info.format = tex_format;
14333 image_create_info.extent.width = tex_width;
14334 image_create_info.extent.height = tex_height;
14335 image_create_info.extent.depth = 1;
14336 image_create_info.mipLevels = 1;
14337 image_create_info.arrayLayers = 1;
14338 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14339 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14340 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14341 image_create_info.flags = 0;
14342
14343 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14344 ASSERT_VK_SUCCESS(err);
14345
14346 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130014347 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060014348 image_view_create_info.image = image;
14349 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14350 image_view_create_info.format = tex_format;
14351 image_view_create_info.subresourceRange.layerCount = 1;
14352 image_view_create_info.subresourceRange.baseMipLevel = 0;
14353 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014354 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060014355
14356 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014357 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060014358
14359 m_errorMonitor->VerifyFound();
14360 vkDestroyImage(m_device->device(), image, NULL);
14361 // If last error is success, it still created the view, so delete it.
14362 if (err == VK_SUCCESS) {
14363 vkDestroyImageView(m_device->device(), view, NULL);
14364 }
Mark Youngd339ba32016-05-30 13:28:35 -060014365}
14366
Karl Schultz6addd812016-02-02 17:17:23 -070014367TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014368 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView(): Color image "
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014370 "formats must have ONLY the "
14371 "VK_IMAGE_ASPECT_COLOR_BIT set");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14373 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014374
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014375 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014376
Karl Schultz6addd812016-02-02 17:17:23 -070014377 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014378 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014379 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014380 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014381
14382 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014383 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014384 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070014385 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14386 image_view_create_info.format = tex_format;
14387 image_view_create_info.subresourceRange.baseMipLevel = 0;
14388 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014389 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014390 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014391 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014392
14393 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014394 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014395
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014396 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014397}
14398
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014399TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070014400 VkResult err;
14401 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014402
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14404 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014405
Mike Stroyana3082432015-09-25 13:39:21 -060014406 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014407
14408 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014409 VkImage srcImage;
14410 VkImage dstImage;
14411 VkDeviceMemory srcMem;
14412 VkDeviceMemory destMem;
14413 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014414
14415 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014416 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14417 image_create_info.pNext = NULL;
14418 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14419 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14420 image_create_info.extent.width = 32;
14421 image_create_info.extent.height = 32;
14422 image_create_info.extent.depth = 1;
14423 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014424 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070014425 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14426 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14427 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14428 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014429
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014430 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014431 ASSERT_VK_SUCCESS(err);
14432
Mark Lobodzinski867787a2016-10-14 11:49:55 -060014433 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014434 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014435 ASSERT_VK_SUCCESS(err);
14436
14437 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014438 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014439 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14440 memAlloc.pNext = NULL;
14441 memAlloc.allocationSize = 0;
14442 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014443
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014444 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014445 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014446 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014447 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014448 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014449 ASSERT_VK_SUCCESS(err);
14450
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014451 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014452 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014453 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014454 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014455 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014456 ASSERT_VK_SUCCESS(err);
14457
14458 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14459 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014460 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014461 ASSERT_VK_SUCCESS(err);
14462
14463 BeginCommandBuffer();
14464 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014465 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014466 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014467 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014468 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060014469 copyRegion.srcOffset.x = 0;
14470 copyRegion.srcOffset.y = 0;
14471 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014472 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014473 copyRegion.dstSubresource.mipLevel = 0;
14474 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014475 // Introduce failure by forcing the dst layerCount to differ from src
14476 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014477 copyRegion.dstOffset.x = 0;
14478 copyRegion.dstOffset.y = 0;
14479 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014480 copyRegion.extent.width = 1;
14481 copyRegion.extent.height = 1;
14482 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014483 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014484 EndCommandBuffer();
14485
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014486 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014487
Chia-I Wuf7458c52015-10-26 21:10:41 +080014488 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014489 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014490 vkFreeMemory(m_device->device(), srcMem, NULL);
14491 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014492}
14493
Tony Barbourd6673642016-05-05 14:46:39 -060014494TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
14495
14496 TEST_DESCRIPTION("Creating images with unsuported formats ");
14497
14498 ASSERT_NO_FATAL_FAILURE(InitState());
14499 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14500 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014501 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 -060014502 VK_IMAGE_TILING_OPTIMAL, 0);
14503 ASSERT_TRUE(image.initialized());
14504
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014505 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130014506 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014507 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014508 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14509 image_create_info.format = VK_FORMAT_UNDEFINED;
14510 image_create_info.extent.width = 32;
14511 image_create_info.extent.height = 32;
14512 image_create_info.extent.depth = 1;
14513 image_create_info.mipLevels = 1;
14514 image_create_info.arrayLayers = 1;
14515 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14516 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14517 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014518
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14520 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014521
14522 VkImage localImage;
14523 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
14524 m_errorMonitor->VerifyFound();
14525
Tony Barbourd6673642016-05-05 14:46:39 -060014526 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014527 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060014528 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
14529 VkFormat format = static_cast<VkFormat>(f);
14530 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014531 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060014532 unsupported = format;
14533 break;
14534 }
14535 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014536
Tony Barbourd6673642016-05-05 14:46:39 -060014537 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060014538 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060014540
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014541 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060014542 m_errorMonitor->VerifyFound();
14543 }
14544}
14545
14546TEST_F(VkLayerTest, ImageLayerViewTests) {
14547 VkResult ret;
14548 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
14549
14550 ASSERT_NO_FATAL_FAILURE(InitState());
14551
14552 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014553 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 -060014554 VK_IMAGE_TILING_OPTIMAL, 0);
14555 ASSERT_TRUE(image.initialized());
14556
14557 VkImageView imgView;
14558 VkImageViewCreateInfo imgViewInfo = {};
14559 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
14560 imgViewInfo.image = image.handle();
14561 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
14562 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14563 imgViewInfo.subresourceRange.layerCount = 1;
14564 imgViewInfo.subresourceRange.baseMipLevel = 0;
14565 imgViewInfo.subresourceRange.levelCount = 1;
14566 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14567
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseMipLevel");
Tony Barbourd6673642016-05-05 14:46:39 -060014569 // View can't have baseMipLevel >= image's mipLevels - Expect
14570 // VIEW_CREATE_ERROR
14571 imgViewInfo.subresourceRange.baseMipLevel = 1;
14572 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14573 m_errorMonitor->VerifyFound();
14574 imgViewInfo.subresourceRange.baseMipLevel = 0;
14575
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseArrayLayer");
Tony Barbourd6673642016-05-05 14:46:39 -060014577 // View can't have baseArrayLayer >= image's arraySize - Expect
14578 // VIEW_CREATE_ERROR
14579 imgViewInfo.subresourceRange.baseArrayLayer = 1;
14580 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14581 m_errorMonitor->VerifyFound();
14582 imgViewInfo.subresourceRange.baseArrayLayer = 0;
14583
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with 0 in "
14585 "pCreateInfo->subresourceRange."
14586 "levelCount");
Tony Barbourd6673642016-05-05 14:46:39 -060014587 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
14588 imgViewInfo.subresourceRange.levelCount = 0;
14589 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14590 m_errorMonitor->VerifyFound();
14591 imgViewInfo.subresourceRange.levelCount = 1;
14592
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with 0 in "
14594 "pCreateInfo->subresourceRange."
14595 "layerCount");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014596 m_errorMonitor->SetDesiredFailureMsg(
14597 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14598 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060014599 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
14600 imgViewInfo.subresourceRange.layerCount = 0;
14601 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14602 m_errorMonitor->VerifyFound();
14603 imgViewInfo.subresourceRange.layerCount = 1;
14604
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "but both must be color formats");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Formats MUST be IDENTICAL unless "
14607 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
14608 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060014609 // Can't use depth format for view into color image - Expect INVALID_FORMAT
14610 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
14611 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14612 m_errorMonitor->VerifyFound();
14613 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14614
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Formats MUST be IDENTICAL unless "
14616 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
14617 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060014618 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
14619 // VIEW_CREATE_ERROR
14620 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
14621 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14622 m_errorMonitor->VerifyFound();
14623 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14624
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "can support ImageViews with "
14626 "differing formats but they must be "
14627 "in the same compatibility class.");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014628 // TODO: Update framework to easily passing mutable flag into ImageObj init
14629 // For now just allowing image for this one test to not have memory bound
14630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14631 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060014632 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
14633 // VIEW_CREATE_ERROR
14634 VkImageCreateInfo mutImgInfo = image.create_info();
14635 VkImage mutImage;
14636 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014637 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060014638 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
14639 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14640 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
14641 ASSERT_VK_SUCCESS(ret);
14642 imgViewInfo.image = mutImage;
14643 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14644 m_errorMonitor->VerifyFound();
14645 imgViewInfo.image = image.handle();
14646 vkDestroyImage(m_device->handle(), mutImage, NULL);
14647}
14648
14649TEST_F(VkLayerTest, MiscImageLayerTests) {
14650
14651 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
14652
14653 ASSERT_NO_FATAL_FAILURE(InitState());
14654
14655 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014656 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 -060014657 VK_IMAGE_TILING_OPTIMAL, 0);
14658 ASSERT_TRUE(image.initialized());
14659
Tony Barbourd6673642016-05-05 14:46:39 -060014660 vk_testing::Buffer buffer;
14661 VkMemoryPropertyFlags reqs = 0;
14662 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
14663 VkBufferImageCopy region = {};
14664 region.bufferRowLength = 128;
14665 region.bufferImageHeight = 128;
14666 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14667 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070014668 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060014669 region.imageExtent.height = 4;
14670 region.imageExtent.width = 4;
14671 region.imageExtent.depth = 1;
14672 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060014673
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070014674 // Image must have offset.z of 0 and extent.depth of 1
14675 // Introduce failure by setting imageExtent.depth to 0
14676 region.imageExtent.depth = 0;
14677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
14678 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14679 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
14680 m_errorMonitor->VerifyFound();
14681
14682 region.imageExtent.depth = 1;
14683
14684 // Image must have offset.z of 0 and extent.depth of 1
14685 // Introduce failure by setting imageOffset.z to 4
14686 region.imageOffset.z = 4;
14687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
14688 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14689 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
14690 m_errorMonitor->VerifyFound();
14691
14692 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014693 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
14694 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
14695 region.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014697 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14698 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014699 m_errorMonitor->VerifyFound();
14700
14701 // BufferOffset must be a multiple of 4
14702 // Introduce failure by setting bufferOffset to a value not divisible by 4
14703 region.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014705 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14706 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014707 m_errorMonitor->VerifyFound();
14708
14709 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
14710 region.bufferOffset = 0;
14711 region.imageExtent.height = 128;
14712 region.imageExtent.width = 128;
14713 // Introduce failure by setting bufferRowLength > 0 but less than width
14714 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014716 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14717 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014718 m_errorMonitor->VerifyFound();
14719
14720 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
14721 region.bufferRowLength = 128;
14722 // Introduce failure by setting bufferRowHeight > 0 but less than height
14723 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014725 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14726 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014727 m_errorMonitor->VerifyFound();
14728
14729 region.bufferImageHeight = 128;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14731 "If the format of srcImage is a depth, stencil, depth stencil or "
14732 "integer-based format then filter must be VK_FILTER_NEAREST");
Tony Barbourd6673642016-05-05 14:46:39 -060014733 // Expect INVALID_FILTER
14734 VkImageObj intImage1(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014735 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 -060014736 VkImageObj intImage2(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014737 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 -060014738 VkImageBlit blitRegion = {};
14739 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14740 blitRegion.srcSubresource.baseArrayLayer = 0;
14741 blitRegion.srcSubresource.layerCount = 1;
14742 blitRegion.srcSubresource.mipLevel = 0;
14743 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14744 blitRegion.dstSubresource.baseArrayLayer = 0;
14745 blitRegion.dstSubresource.layerCount = 1;
14746 blitRegion.dstSubresource.mipLevel = 0;
14747
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014748 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
14749 intImage2.layout(), 16, &blitRegion, VK_FILTER_LINEAR);
Tony Barbourd6673642016-05-05 14:46:39 -060014750 m_errorMonitor->VerifyFound();
14751
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060014752 // Look for NULL-blit warning
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "Offsets specify a zero-volume area.");
14754 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
14755 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060014756 m_errorMonitor->VerifyFound();
14757
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014758 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with 0 in ppMemoryBarriers");
Tony Barbourd6673642016-05-05 14:46:39 -060014759 VkImageMemoryBarrier img_barrier;
14760 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
14761 img_barrier.pNext = NULL;
14762 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
14763 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
14764 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14765 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14766 img_barrier.image = image.handle();
14767 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14768 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14769 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14770 img_barrier.subresourceRange.baseArrayLayer = 0;
14771 img_barrier.subresourceRange.baseMipLevel = 0;
14772 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
14773 img_barrier.subresourceRange.layerCount = 0;
14774 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014775 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
14776 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060014777 m_errorMonitor->VerifyFound();
14778 img_barrier.subresourceRange.layerCount = 1;
14779}
14780
14781TEST_F(VkLayerTest, ImageFormatLimits) {
14782
14783 TEST_DESCRIPTION("Exceed the limits of image format ");
14784
Cody Northropc31a84f2016-08-22 10:41:47 -060014785 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060014787 VkImageCreateInfo image_create_info = {};
14788 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14789 image_create_info.pNext = NULL;
14790 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14791 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14792 image_create_info.extent.width = 32;
14793 image_create_info.extent.height = 32;
14794 image_create_info.extent.depth = 1;
14795 image_create_info.mipLevels = 1;
14796 image_create_info.arrayLayers = 1;
14797 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14798 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14799 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14800 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14801 image_create_info.flags = 0;
14802
14803 VkImage nullImg;
14804 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014805 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
14806 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Tony Barbourd6673642016-05-05 14:46:39 -060014807 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
14808 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14809 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14810 m_errorMonitor->VerifyFound();
14811 image_create_info.extent.depth = 1;
14812
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060014814 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
14815 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14816 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14817 m_errorMonitor->VerifyFound();
14818 image_create_info.mipLevels = 1;
14819
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060014821 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
14822 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14823 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14824 m_errorMonitor->VerifyFound();
14825 image_create_info.arrayLayers = 1;
14826
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060014828 int samples = imgFmtProps.sampleCounts >> 1;
14829 image_create_info.samples = (VkSampleCountFlagBits)samples;
14830 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14831 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14832 m_errorMonitor->VerifyFound();
14833 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14834
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pCreateInfo->initialLayout, must be "
14836 "VK_IMAGE_LAYOUT_UNDEFINED or "
14837 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060014838 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14839 // Expect INVALID_LAYOUT
14840 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14841 m_errorMonitor->VerifyFound();
14842 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14843}
14844
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014845TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
14846
14847 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060014848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014849
14850 ASSERT_NO_FATAL_FAILURE(InitState());
14851
14852 VkImageObj src_image(m_device);
14853 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
14854 VkImageObj dst_image(m_device);
14855 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
14856
14857 BeginCommandBuffer();
14858 VkImageCopy copy_region;
14859 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14860 copy_region.srcSubresource.mipLevel = 0;
14861 copy_region.srcSubresource.baseArrayLayer = 0;
14862 copy_region.srcSubresource.layerCount = 0;
14863 copy_region.srcOffset.x = 0;
14864 copy_region.srcOffset.y = 0;
14865 copy_region.srcOffset.z = 0;
14866 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14867 copy_region.dstSubresource.mipLevel = 0;
14868 copy_region.dstSubresource.baseArrayLayer = 0;
14869 copy_region.dstSubresource.layerCount = 0;
14870 copy_region.dstOffset.x = 0;
14871 copy_region.dstOffset.y = 0;
14872 copy_region.dstOffset.z = 0;
14873 copy_region.extent.width = 64;
14874 copy_region.extent.height = 64;
14875 copy_region.extent.depth = 1;
14876 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
14877 &copy_region);
14878 EndCommandBuffer();
14879
14880 m_errorMonitor->VerifyFound();
14881}
14882
14883TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
14884
14885 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060014886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014887
14888 ASSERT_NO_FATAL_FAILURE(InitState());
14889
14890 VkImageObj src_image(m_device);
14891 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
14892 VkImageObj dst_image(m_device);
14893 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
14894
14895 BeginCommandBuffer();
14896 VkImageCopy copy_region;
14897 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14898 copy_region.srcSubresource.mipLevel = 0;
14899 copy_region.srcSubresource.baseArrayLayer = 0;
14900 copy_region.srcSubresource.layerCount = 0;
14901 copy_region.srcOffset.x = 0;
14902 copy_region.srcOffset.y = 0;
14903 copy_region.srcOffset.z = 0;
14904 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14905 copy_region.dstSubresource.mipLevel = 0;
14906 copy_region.dstSubresource.baseArrayLayer = 0;
14907 copy_region.dstSubresource.layerCount = 0;
14908 copy_region.dstOffset.x = 0;
14909 copy_region.dstOffset.y = 0;
14910 copy_region.dstOffset.z = 0;
14911 copy_region.extent.width = 64;
14912 copy_region.extent.height = 64;
14913 copy_region.extent.depth = 1;
14914 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
14915 &copy_region);
14916 EndCommandBuffer();
14917
14918 m_errorMonitor->VerifyFound();
14919}
14920
Karl Schultz6addd812016-02-02 17:17:23 -070014921TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060014922 VkResult err;
14923 bool pass;
14924
14925 // Create color images with different format sizes and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14927 "vkCmdCopyImage called with unmatched source and dest image format sizes");
Karl Schultzbdb75952016-04-19 11:36:49 -060014928
14929 ASSERT_NO_FATAL_FAILURE(InitState());
14930
14931 // Create two images of different types and try to copy between them
14932 VkImage srcImage;
14933 VkImage dstImage;
14934 VkDeviceMemory srcMem;
14935 VkDeviceMemory destMem;
14936 VkMemoryRequirements memReqs;
14937
14938 VkImageCreateInfo image_create_info = {};
14939 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14940 image_create_info.pNext = NULL;
14941 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14942 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14943 image_create_info.extent.width = 32;
14944 image_create_info.extent.height = 32;
14945 image_create_info.extent.depth = 1;
14946 image_create_info.mipLevels = 1;
14947 image_create_info.arrayLayers = 1;
14948 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14949 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14950 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14951 image_create_info.flags = 0;
14952
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014953 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060014954 ASSERT_VK_SUCCESS(err);
14955
14956 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14957 // Introduce failure by creating second image with a different-sized format.
14958 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
14959
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014960 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060014961 ASSERT_VK_SUCCESS(err);
14962
14963 // Allocate memory
14964 VkMemoryAllocateInfo memAlloc = {};
14965 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14966 memAlloc.pNext = NULL;
14967 memAlloc.allocationSize = 0;
14968 memAlloc.memoryTypeIndex = 0;
14969
14970 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
14971 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014972 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060014973 ASSERT_TRUE(pass);
14974 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
14975 ASSERT_VK_SUCCESS(err);
14976
14977 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
14978 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014979 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060014980 ASSERT_TRUE(pass);
14981 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
14982 ASSERT_VK_SUCCESS(err);
14983
14984 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14985 ASSERT_VK_SUCCESS(err);
14986 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
14987 ASSERT_VK_SUCCESS(err);
14988
14989 BeginCommandBuffer();
14990 VkImageCopy copyRegion;
14991 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14992 copyRegion.srcSubresource.mipLevel = 0;
14993 copyRegion.srcSubresource.baseArrayLayer = 0;
14994 copyRegion.srcSubresource.layerCount = 0;
14995 copyRegion.srcOffset.x = 0;
14996 copyRegion.srcOffset.y = 0;
14997 copyRegion.srcOffset.z = 0;
14998 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14999 copyRegion.dstSubresource.mipLevel = 0;
15000 copyRegion.dstSubresource.baseArrayLayer = 0;
15001 copyRegion.dstSubresource.layerCount = 0;
15002 copyRegion.dstOffset.x = 0;
15003 copyRegion.dstOffset.y = 0;
15004 copyRegion.dstOffset.z = 0;
15005 copyRegion.extent.width = 1;
15006 copyRegion.extent.height = 1;
15007 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015008 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Karl Schultzbdb75952016-04-19 11:36:49 -060015009 EndCommandBuffer();
15010
15011 m_errorMonitor->VerifyFound();
15012
15013 vkDestroyImage(m_device->device(), srcImage, NULL);
15014 vkDestroyImage(m_device->device(), dstImage, NULL);
15015 vkFreeMemory(m_device->device(), srcMem, NULL);
15016 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015017}
15018
Karl Schultz6addd812016-02-02 17:17:23 -070015019TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
15020 VkResult err;
15021 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015022
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015023 // Create a color image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015024 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15025 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015026
Mike Stroyana3082432015-09-25 13:39:21 -060015027 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015028
15029 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015030 VkImage srcImage;
15031 VkImage dstImage;
15032 VkDeviceMemory srcMem;
15033 VkDeviceMemory destMem;
15034 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015035
15036 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015037 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15038 image_create_info.pNext = NULL;
15039 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15040 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15041 image_create_info.extent.width = 32;
15042 image_create_info.extent.height = 32;
15043 image_create_info.extent.depth = 1;
15044 image_create_info.mipLevels = 1;
15045 image_create_info.arrayLayers = 1;
15046 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15047 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15048 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15049 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015050
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015051 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015052 ASSERT_VK_SUCCESS(err);
15053
Karl Schultzbdb75952016-04-19 11:36:49 -060015054 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15055
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015056 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070015057 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015058 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015059 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015060
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015061 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015062 ASSERT_VK_SUCCESS(err);
15063
15064 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015065 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015066 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15067 memAlloc.pNext = NULL;
15068 memAlloc.allocationSize = 0;
15069 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015070
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015071 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015072 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015073 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015074 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015075 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015076 ASSERT_VK_SUCCESS(err);
15077
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015078 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015079 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015080 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015081 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015082 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015083 ASSERT_VK_SUCCESS(err);
15084
15085 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15086 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015087 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015088 ASSERT_VK_SUCCESS(err);
15089
15090 BeginCommandBuffer();
15091 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015092 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015093 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015094 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015095 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015096 copyRegion.srcOffset.x = 0;
15097 copyRegion.srcOffset.y = 0;
15098 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015099 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015100 copyRegion.dstSubresource.mipLevel = 0;
15101 copyRegion.dstSubresource.baseArrayLayer = 0;
15102 copyRegion.dstSubresource.layerCount = 0;
15103 copyRegion.dstOffset.x = 0;
15104 copyRegion.dstOffset.y = 0;
15105 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015106 copyRegion.extent.width = 1;
15107 copyRegion.extent.height = 1;
15108 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015109 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015110 EndCommandBuffer();
15111
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015112 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015113
Chia-I Wuf7458c52015-10-26 21:10:41 +080015114 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015115 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015116 vkFreeMemory(m_device->device(), srcMem, NULL);
15117 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015118}
15119
Karl Schultz6addd812016-02-02 17:17:23 -070015120TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
15121 VkResult err;
15122 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015123
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15125 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015126
Mike Stroyana3082432015-09-25 13:39:21 -060015127 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015128
15129 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015130 VkImage srcImage;
15131 VkImage dstImage;
15132 VkDeviceMemory srcMem;
15133 VkDeviceMemory destMem;
15134 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015135
15136 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015137 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15138 image_create_info.pNext = NULL;
15139 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15140 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15141 image_create_info.extent.width = 32;
15142 image_create_info.extent.height = 1;
15143 image_create_info.extent.depth = 1;
15144 image_create_info.mipLevels = 1;
15145 image_create_info.arrayLayers = 1;
15146 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15147 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15148 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15149 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015150
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015151 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015152 ASSERT_VK_SUCCESS(err);
15153
Karl Schultz6addd812016-02-02 17:17:23 -070015154 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015155
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015156 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015157 ASSERT_VK_SUCCESS(err);
15158
15159 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015160 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015161 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15162 memAlloc.pNext = NULL;
15163 memAlloc.allocationSize = 0;
15164 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015165
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015166 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015167 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015168 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015169 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015170 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015171 ASSERT_VK_SUCCESS(err);
15172
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015173 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015174 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015175 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015176 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015177 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015178 ASSERT_VK_SUCCESS(err);
15179
15180 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15181 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015182 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015183 ASSERT_VK_SUCCESS(err);
15184
15185 BeginCommandBuffer();
15186 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015187 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15188 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015189 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015190 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015191 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015192 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015193 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015194 resolveRegion.srcOffset.x = 0;
15195 resolveRegion.srcOffset.y = 0;
15196 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015197 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015198 resolveRegion.dstSubresource.mipLevel = 0;
15199 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015200 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015201 resolveRegion.dstOffset.x = 0;
15202 resolveRegion.dstOffset.y = 0;
15203 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015204 resolveRegion.extent.width = 1;
15205 resolveRegion.extent.height = 1;
15206 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015207 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015208 EndCommandBuffer();
15209
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015210 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015211
Chia-I Wuf7458c52015-10-26 21:10:41 +080015212 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015213 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015214 vkFreeMemory(m_device->device(), srcMem, NULL);
15215 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015216}
15217
Karl Schultz6addd812016-02-02 17:17:23 -070015218TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
15219 VkResult err;
15220 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015221
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15223 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015224
Mike Stroyana3082432015-09-25 13:39:21 -060015225 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015226
Chris Forbesa7530692016-05-08 12:35:39 +120015227 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015228 VkImage srcImage;
15229 VkImage dstImage;
15230 VkDeviceMemory srcMem;
15231 VkDeviceMemory destMem;
15232 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015233
15234 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015235 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15236 image_create_info.pNext = NULL;
15237 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15238 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15239 image_create_info.extent.width = 32;
15240 image_create_info.extent.height = 1;
15241 image_create_info.extent.depth = 1;
15242 image_create_info.mipLevels = 1;
15243 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120015244 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015245 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15246 // Note: Some implementations expect color attachment usage for any
15247 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015248 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015249 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015250
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015251 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015252 ASSERT_VK_SUCCESS(err);
15253
Karl Schultz6addd812016-02-02 17:17:23 -070015254 // Note: Some implementations expect color attachment usage for any
15255 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015256 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015257
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015258 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015259 ASSERT_VK_SUCCESS(err);
15260
15261 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015262 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015263 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15264 memAlloc.pNext = NULL;
15265 memAlloc.allocationSize = 0;
15266 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015267
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015268 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015269 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015270 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015271 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015272 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015273 ASSERT_VK_SUCCESS(err);
15274
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015275 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015276 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015277 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015278 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015279 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015280 ASSERT_VK_SUCCESS(err);
15281
15282 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15283 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015284 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015285 ASSERT_VK_SUCCESS(err);
15286
15287 BeginCommandBuffer();
15288 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015289 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15290 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015291 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015292 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015293 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015294 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015295 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015296 resolveRegion.srcOffset.x = 0;
15297 resolveRegion.srcOffset.y = 0;
15298 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015299 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015300 resolveRegion.dstSubresource.mipLevel = 0;
15301 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015302 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015303 resolveRegion.dstOffset.x = 0;
15304 resolveRegion.dstOffset.y = 0;
15305 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015306 resolveRegion.extent.width = 1;
15307 resolveRegion.extent.height = 1;
15308 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015309 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015310 EndCommandBuffer();
15311
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015312 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015313
Chia-I Wuf7458c52015-10-26 21:10:41 +080015314 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015315 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015316 vkFreeMemory(m_device->device(), srcMem, NULL);
15317 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015318}
15319
Karl Schultz6addd812016-02-02 17:17:23 -070015320TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
15321 VkResult err;
15322 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015323
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15325 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015326
Mike Stroyana3082432015-09-25 13:39:21 -060015327 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015328
15329 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015330 VkImage srcImage;
15331 VkImage dstImage;
15332 VkDeviceMemory srcMem;
15333 VkDeviceMemory destMem;
15334 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015335
15336 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015337 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15338 image_create_info.pNext = NULL;
15339 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15340 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15341 image_create_info.extent.width = 32;
15342 image_create_info.extent.height = 1;
15343 image_create_info.extent.depth = 1;
15344 image_create_info.mipLevels = 1;
15345 image_create_info.arrayLayers = 1;
15346 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15347 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15348 // Note: Some implementations expect color attachment usage for any
15349 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015350 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015351 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015352
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015353 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015354 ASSERT_VK_SUCCESS(err);
15355
Karl Schultz6addd812016-02-02 17:17:23 -070015356 // Set format to something other than source image
15357 image_create_info.format = VK_FORMAT_R32_SFLOAT;
15358 // Note: Some implementations expect color attachment usage for any
15359 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015360 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015361 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015362
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015363 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015364 ASSERT_VK_SUCCESS(err);
15365
15366 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015367 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015368 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15369 memAlloc.pNext = NULL;
15370 memAlloc.allocationSize = 0;
15371 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015372
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015373 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015374 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015375 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015376 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015377 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015378 ASSERT_VK_SUCCESS(err);
15379
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015380 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015381 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015382 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015383 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015384 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015385 ASSERT_VK_SUCCESS(err);
15386
15387 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15388 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015389 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015390 ASSERT_VK_SUCCESS(err);
15391
15392 BeginCommandBuffer();
15393 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015394 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15395 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015396 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015397 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015398 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015399 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015400 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015401 resolveRegion.srcOffset.x = 0;
15402 resolveRegion.srcOffset.y = 0;
15403 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015404 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015405 resolveRegion.dstSubresource.mipLevel = 0;
15406 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015407 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015408 resolveRegion.dstOffset.x = 0;
15409 resolveRegion.dstOffset.y = 0;
15410 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015411 resolveRegion.extent.width = 1;
15412 resolveRegion.extent.height = 1;
15413 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015414 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015415 EndCommandBuffer();
15416
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015417 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015418
Chia-I Wuf7458c52015-10-26 21:10:41 +080015419 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015420 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015421 vkFreeMemory(m_device->device(), srcMem, NULL);
15422 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015423}
15424
Karl Schultz6addd812016-02-02 17:17:23 -070015425TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
15426 VkResult err;
15427 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015428
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15430 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015431
Mike Stroyana3082432015-09-25 13:39:21 -060015432 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015433
15434 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015435 VkImage srcImage;
15436 VkImage dstImage;
15437 VkDeviceMemory srcMem;
15438 VkDeviceMemory destMem;
15439 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015440
15441 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015442 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15443 image_create_info.pNext = NULL;
15444 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15445 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15446 image_create_info.extent.width = 32;
15447 image_create_info.extent.height = 1;
15448 image_create_info.extent.depth = 1;
15449 image_create_info.mipLevels = 1;
15450 image_create_info.arrayLayers = 1;
15451 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15452 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15453 // Note: Some implementations expect color attachment usage for any
15454 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015455 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015456 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015457
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015458 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015459 ASSERT_VK_SUCCESS(err);
15460
Karl Schultz6addd812016-02-02 17:17:23 -070015461 image_create_info.imageType = VK_IMAGE_TYPE_1D;
15462 // Note: Some implementations expect color attachment usage for any
15463 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015464 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015465 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015466
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015467 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015468 ASSERT_VK_SUCCESS(err);
15469
15470 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015471 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015472 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15473 memAlloc.pNext = NULL;
15474 memAlloc.allocationSize = 0;
15475 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015476
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015477 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015478 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015479 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015480 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015481 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015482 ASSERT_VK_SUCCESS(err);
15483
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015484 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015485 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015486 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015487 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015488 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015489 ASSERT_VK_SUCCESS(err);
15490
15491 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15492 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015493 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015494 ASSERT_VK_SUCCESS(err);
15495
15496 BeginCommandBuffer();
15497 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015498 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15499 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015500 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015501 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015502 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015503 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015504 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015505 resolveRegion.srcOffset.x = 0;
15506 resolveRegion.srcOffset.y = 0;
15507 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015508 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015509 resolveRegion.dstSubresource.mipLevel = 0;
15510 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015511 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015512 resolveRegion.dstOffset.x = 0;
15513 resolveRegion.dstOffset.y = 0;
15514 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015515 resolveRegion.extent.width = 1;
15516 resolveRegion.extent.height = 1;
15517 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015518 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015519 EndCommandBuffer();
15520
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015521 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015522
Chia-I Wuf7458c52015-10-26 21:10:41 +080015523 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015524 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015525 vkFreeMemory(m_device->device(), srcMem, NULL);
15526 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015527}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015528
Karl Schultz6addd812016-02-02 17:17:23 -070015529TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015530 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070015531 // to using a DS format, then cause it to hit error due to COLOR_BIT not
15532 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015533 // The image format check comes 2nd in validation so we trigger it first,
15534 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070015535 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015536
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15538 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015539
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015540 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015541
Chia-I Wu1b99bb22015-10-27 19:25:11 +080015542 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015543 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15544 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015545
15546 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015547 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
15548 ds_pool_ci.pNext = NULL;
15549 ds_pool_ci.maxSets = 1;
15550 ds_pool_ci.poolSizeCount = 1;
15551 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015552
15553 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015554 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015555 ASSERT_VK_SUCCESS(err);
15556
15557 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015558 dsl_binding.binding = 0;
15559 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15560 dsl_binding.descriptorCount = 1;
15561 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
15562 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015563
15564 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015565 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
15566 ds_layout_ci.pNext = NULL;
15567 ds_layout_ci.bindingCount = 1;
15568 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015569 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015570 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015571 ASSERT_VK_SUCCESS(err);
15572
15573 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015574 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080015575 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070015576 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015577 alloc_info.descriptorPool = ds_pool;
15578 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015579 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015580 ASSERT_VK_SUCCESS(err);
15581
Karl Schultz6addd812016-02-02 17:17:23 -070015582 VkImage image_bad;
15583 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015584 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060015585 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015586 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070015587 const int32_t tex_width = 32;
15588 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015589
15590 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015591 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15592 image_create_info.pNext = NULL;
15593 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15594 image_create_info.format = tex_format_bad;
15595 image_create_info.extent.width = tex_width;
15596 image_create_info.extent.height = tex_height;
15597 image_create_info.extent.depth = 1;
15598 image_create_info.mipLevels = 1;
15599 image_create_info.arrayLayers = 1;
15600 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15601 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015602 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015603 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015604
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015605 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015606 ASSERT_VK_SUCCESS(err);
15607 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015608 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15609 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015610 ASSERT_VK_SUCCESS(err);
15611
15612 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015613 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015614 image_view_create_info.image = image_bad;
15615 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15616 image_view_create_info.format = tex_format_bad;
15617 image_view_create_info.subresourceRange.baseArrayLayer = 0;
15618 image_view_create_info.subresourceRange.baseMipLevel = 0;
15619 image_view_create_info.subresourceRange.layerCount = 1;
15620 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015621 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015622
15623 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015624 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015625
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015626 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015627
Chia-I Wuf7458c52015-10-26 21:10:41 +080015628 vkDestroyImage(m_device->device(), image_bad, NULL);
15629 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015630 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
15631 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015632}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015633
15634TEST_F(VkLayerTest, ClearImageErrors) {
15635 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
15636 "ClearDepthStencilImage with a color image.");
15637
15638 ASSERT_NO_FATAL_FAILURE(InitState());
15639 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15640
15641 // Renderpass is started here so end it as Clear cmds can't be in renderpass
15642 BeginCommandBuffer();
15643 m_commandBuffer->EndRenderPass();
15644
15645 // Color image
15646 VkClearColorValue clear_color;
15647 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
15648 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
15649 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
15650 const int32_t img_width = 32;
15651 const int32_t img_height = 32;
15652 VkImageCreateInfo image_create_info = {};
15653 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15654 image_create_info.pNext = NULL;
15655 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15656 image_create_info.format = color_format;
15657 image_create_info.extent.width = img_width;
15658 image_create_info.extent.height = img_height;
15659 image_create_info.extent.depth = 1;
15660 image_create_info.mipLevels = 1;
15661 image_create_info.arrayLayers = 1;
15662 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15663 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15664 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15665
15666 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015667 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015668
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015669 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015670
15671 // Depth/Stencil image
15672 VkClearDepthStencilValue clear_value = {0};
15673 reqs = 0; // don't need HOST_VISIBLE DS image
15674 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
15675 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
15676 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
15677 ds_image_create_info.extent.width = 64;
15678 ds_image_create_info.extent.height = 64;
15679 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15680 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
15681
15682 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015683 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015684
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015685 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 -060015686
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015688
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015689 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015690 &color_range);
15691
15692 m_errorMonitor->VerifyFound();
15693
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with "
15695 "image created without "
15696 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060015697
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015698 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060015699 &color_range);
15700
15701 m_errorMonitor->VerifyFound();
15702
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015703 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15705 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015706
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015707 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(),
15708 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015709
15710 m_errorMonitor->VerifyFound();
15711}
Tobin Ehliscde08892015-09-22 10:11:37 -060015712#endif // IMAGE_TESTS
15713
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060015714
15715// WSI Enabled Tests
15716//
Chris Forbes09368e42016-10-13 11:59:22 +130015717#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060015718TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
15719
15720#if defined(VK_USE_PLATFORM_XCB_KHR)
15721 VkSurfaceKHR surface = VK_NULL_HANDLE;
15722
15723 VkResult err;
15724 bool pass;
15725 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
15726 VkSwapchainCreateInfoKHR swapchain_create_info = {};
15727 // uint32_t swapchain_image_count = 0;
15728 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
15729 // uint32_t image_index = 0;
15730 // VkPresentInfoKHR present_info = {};
15731
15732 ASSERT_NO_FATAL_FAILURE(InitState());
15733
15734 // Use the create function from one of the VK_KHR_*_surface extension in
15735 // order to create a surface, testing all known errors in the process,
15736 // before successfully creating a surface:
15737 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
15738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
15739 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
15740 pass = (err != VK_SUCCESS);
15741 ASSERT_TRUE(pass);
15742 m_errorMonitor->VerifyFound();
15743
15744 // Next, try to create a surface with the wrong
15745 // VkXcbSurfaceCreateInfoKHR::sType:
15746 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
15747 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
15748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
15749 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
15750 pass = (err != VK_SUCCESS);
15751 ASSERT_TRUE(pass);
15752 m_errorMonitor->VerifyFound();
15753
15754 // Create a native window, and then correctly create a surface:
15755 xcb_connection_t *connection;
15756 xcb_screen_t *screen;
15757 xcb_window_t xcb_window;
15758 xcb_intern_atom_reply_t *atom_wm_delete_window;
15759
15760 const xcb_setup_t *setup;
15761 xcb_screen_iterator_t iter;
15762 int scr;
15763 uint32_t value_mask, value_list[32];
15764 int width = 1;
15765 int height = 1;
15766
15767 connection = xcb_connect(NULL, &scr);
15768 ASSERT_TRUE(connection != NULL);
15769 setup = xcb_get_setup(connection);
15770 iter = xcb_setup_roots_iterator(setup);
15771 while (scr-- > 0)
15772 xcb_screen_next(&iter);
15773 screen = iter.data;
15774
15775 xcb_window = xcb_generate_id(connection);
15776
15777 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
15778 value_list[0] = screen->black_pixel;
15779 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
15780
15781 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
15782 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
15783
15784 /* Magic code that will send notification when window is destroyed */
15785 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
15786 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
15787
15788 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
15789 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
15790 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
15791 free(reply);
15792
15793 xcb_map_window(connection, xcb_window);
15794
15795 // Force the x/y coordinates to 100,100 results are identical in consecutive
15796 // runs
15797 const uint32_t coords[] = { 100, 100 };
15798 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
15799
15800 // Finally, try to correctly create a surface:
15801 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
15802 xcb_create_info.pNext = NULL;
15803 xcb_create_info.flags = 0;
15804 xcb_create_info.connection = connection;
15805 xcb_create_info.window = xcb_window;
15806 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
15807 pass = (err == VK_SUCCESS);
15808 ASSERT_TRUE(pass);
15809
15810 // Check if surface supports presentation:
15811
15812 // 1st, do so without having queried the queue families:
15813 VkBool32 supported = false;
15814 // TODO: Get the following error to come out:
15815 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15816 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
15817 "function");
15818 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
15819 pass = (err != VK_SUCCESS);
15820 // ASSERT_TRUE(pass);
15821 // m_errorMonitor->VerifyFound();
15822
15823 // Next, query a queue family index that's too large:
15824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
15825 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
15826 pass = (err != VK_SUCCESS);
15827 ASSERT_TRUE(pass);
15828 m_errorMonitor->VerifyFound();
15829
15830 // Finally, do so correctly:
15831 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
15832 // SUPPORTED
15833 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
15834 pass = (err == VK_SUCCESS);
15835 ASSERT_TRUE(pass);
15836
15837 // Before proceeding, try to create a swapchain without having called
15838 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
15839 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
15840 swapchain_create_info.pNext = NULL;
15841 swapchain_create_info.flags = 0;
15842 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15843 swapchain_create_info.surface = surface;
15844 swapchain_create_info.imageArrayLayers = 1;
15845 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
15846 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
15847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15848 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
15849 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15850 pass = (err != VK_SUCCESS);
15851 ASSERT_TRUE(pass);
15852 m_errorMonitor->VerifyFound();
15853
15854 // Get the surface capabilities:
15855 VkSurfaceCapabilitiesKHR surface_capabilities;
15856
15857 // Do so correctly (only error logged by this entrypoint is if the
15858 // extension isn't enabled):
15859 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
15860 pass = (err == VK_SUCCESS);
15861 ASSERT_TRUE(pass);
15862
15863 // Get the surface formats:
15864 uint32_t surface_format_count;
15865
15866 // First, try without a pointer to surface_format_count:
15867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
15868 "specified as NULL");
15869 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
15870 pass = (err == VK_SUCCESS);
15871 ASSERT_TRUE(pass);
15872 m_errorMonitor->VerifyFound();
15873
15874 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
15875 // correctly done a 1st try (to get the count):
15876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
15877 surface_format_count = 0;
15878 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
15879 pass = (err == VK_SUCCESS);
15880 ASSERT_TRUE(pass);
15881 m_errorMonitor->VerifyFound();
15882
15883 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
15884 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
15885 pass = (err == VK_SUCCESS);
15886 ASSERT_TRUE(pass);
15887
15888 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
15889 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
15890
15891 // Next, do a 2nd try with surface_format_count being set too high:
15892 surface_format_count += 5;
15893 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
15894 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
15895 pass = (err == VK_SUCCESS);
15896 ASSERT_TRUE(pass);
15897 m_errorMonitor->VerifyFound();
15898
15899 // Finally, do a correct 1st and 2nd try:
15900 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
15901 pass = (err == VK_SUCCESS);
15902 ASSERT_TRUE(pass);
15903 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
15904 pass = (err == VK_SUCCESS);
15905 ASSERT_TRUE(pass);
15906
15907 // Get the surface present modes:
15908 uint32_t surface_present_mode_count;
15909
15910 // First, try without a pointer to surface_format_count:
15911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
15912 "specified as NULL");
15913
15914 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
15915 pass = (err == VK_SUCCESS);
15916 ASSERT_TRUE(pass);
15917 m_errorMonitor->VerifyFound();
15918
15919 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
15920 // correctly done a 1st try (to get the count):
15921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
15922 surface_present_mode_count = 0;
15923 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
15924 (VkPresentModeKHR *)&surface_present_mode_count);
15925 pass = (err == VK_SUCCESS);
15926 ASSERT_TRUE(pass);
15927 m_errorMonitor->VerifyFound();
15928
15929 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
15930 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
15931 pass = (err == VK_SUCCESS);
15932 ASSERT_TRUE(pass);
15933
15934 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
15935 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
15936
15937 // Next, do a 2nd try with surface_format_count being set too high:
15938 surface_present_mode_count += 5;
15939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
15940 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
15941 pass = (err == VK_SUCCESS);
15942 ASSERT_TRUE(pass);
15943 m_errorMonitor->VerifyFound();
15944
15945 // Finally, do a correct 1st and 2nd try:
15946 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
15947 pass = (err == VK_SUCCESS);
15948 ASSERT_TRUE(pass);
15949 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
15950 pass = (err == VK_SUCCESS);
15951 ASSERT_TRUE(pass);
15952
15953 // Create a swapchain:
15954
15955 // First, try without a pointer to swapchain_create_info:
15956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
15957 "specified as NULL");
15958
15959 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
15960 pass = (err != VK_SUCCESS);
15961 ASSERT_TRUE(pass);
15962 m_errorMonitor->VerifyFound();
15963
15964 // Next, call with a non-NULL swapchain_create_info, that has the wrong
15965 // sType:
15966 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
15967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
15968
15969 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15970 pass = (err != VK_SUCCESS);
15971 ASSERT_TRUE(pass);
15972 m_errorMonitor->VerifyFound();
15973
15974 // Next, call with a NULL swapchain pointer:
15975 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
15976 swapchain_create_info.pNext = NULL;
15977 swapchain_create_info.flags = 0;
15978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
15979 "specified as NULL");
15980
15981 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
15982 pass = (err != VK_SUCCESS);
15983 ASSERT_TRUE(pass);
15984 m_errorMonitor->VerifyFound();
15985
15986 // TODO: Enhance swapchain layer so that
15987 // swapchain_create_info.queueFamilyIndexCount is checked against something?
15988
15989 // Next, call with a queue family index that's too large:
15990 uint32_t queueFamilyIndex[2] = { 100000, 0 };
15991 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
15992 swapchain_create_info.queueFamilyIndexCount = 2;
15993 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
15994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
15995 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15996 pass = (err != VK_SUCCESS);
15997 ASSERT_TRUE(pass);
15998 m_errorMonitor->VerifyFound();
15999
16000 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
16001 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
16002 swapchain_create_info.queueFamilyIndexCount = 1;
16003 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16004 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
16005 "pCreateInfo->pQueueFamilyIndices).");
16006 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16007 pass = (err != VK_SUCCESS);
16008 ASSERT_TRUE(pass);
16009 m_errorMonitor->VerifyFound();
16010
16011 // Next, call with an invalid imageSharingMode:
16012 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
16013 swapchain_create_info.queueFamilyIndexCount = 1;
16014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16015 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
16016 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16017 pass = (err != VK_SUCCESS);
16018 ASSERT_TRUE(pass);
16019 m_errorMonitor->VerifyFound();
16020 // Fix for the future:
16021 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
16022 // SUPPORTED
16023 swapchain_create_info.queueFamilyIndexCount = 0;
16024 queueFamilyIndex[0] = 0;
16025 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
16026
16027 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
16028 // Get the images from a swapchain:
16029 // Acquire an image from a swapchain:
16030 // Present an image to a swapchain:
16031 // Destroy the swapchain:
16032
16033 // TODOs:
16034 //
16035 // - Try destroying the device without first destroying the swapchain
16036 //
16037 // - Try destroying the device without first destroying the surface
16038 //
16039 // - Try destroying the surface without first destroying the swapchain
16040
16041 // Destroy the surface:
16042 vkDestroySurfaceKHR(instance(), surface, NULL);
16043
16044 // Tear down the window:
16045 xcb_destroy_window(connection, xcb_window);
16046 xcb_disconnect(connection);
16047
16048#else // VK_USE_PLATFORM_XCB_KHR
16049 return;
16050#endif // VK_USE_PLATFORM_XCB_KHR
16051}
Chris Forbes09368e42016-10-13 11:59:22 +130016052#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016053
16054//
16055// POSITIVE VALIDATION TESTS
16056//
16057// These tests do not expect to encounter ANY validation errors pass only if this is true
16058
Tobin Ehlise0006882016-11-03 10:14:28 -060016059TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
16060 TEST_DESCRIPTION("Perform an image layout transition in a secondary command buffer followed "
16061 "by a transition in the primary.");
16062 VkResult err;
16063 m_errorMonitor->ExpectSuccess();
16064 ASSERT_NO_FATAL_FAILURE(InitState());
16065 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16066 // Allocate a secondary and primary cmd buffer
16067 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
16068 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
16069 command_buffer_allocate_info.commandPool = m_commandPool;
16070 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
16071 command_buffer_allocate_info.commandBufferCount = 1;
16072
16073 VkCommandBuffer secondary_command_buffer;
16074 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
16075 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
16076 VkCommandBuffer primary_command_buffer;
16077 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
16078 VkCommandBufferBeginInfo command_buffer_begin_info = {};
16079 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
16080 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
16081 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
16082 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
16083 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
16084
16085 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
16086 ASSERT_VK_SUCCESS(err);
16087 VkImageObj image(m_device);
16088 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
16089 ASSERT_TRUE(image.initialized());
16090 VkImageMemoryBarrier img_barrier = {};
16091 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16092 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16093 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16094 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16095 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16096 img_barrier.image = image.handle();
16097 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16098 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16099 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16100 img_barrier.subresourceRange.baseArrayLayer = 0;
16101 img_barrier.subresourceRange.baseMipLevel = 0;
16102 img_barrier.subresourceRange.layerCount = 1;
16103 img_barrier.subresourceRange.levelCount = 1;
16104 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
16105 0, nullptr, 1, &img_barrier);
16106 err = vkEndCommandBuffer(secondary_command_buffer);
16107 ASSERT_VK_SUCCESS(err);
16108
16109 // Now update primary cmd buffer to execute secondary and transitions image
16110 command_buffer_begin_info.pInheritanceInfo = nullptr;
16111 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
16112 ASSERT_VK_SUCCESS(err);
16113 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
16114 VkImageMemoryBarrier img_barrier2 = {};
16115 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16116 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16117 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16118 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16119 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16120 img_barrier2.image = image.handle();
16121 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16122 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16123 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16124 img_barrier2.subresourceRange.baseArrayLayer = 0;
16125 img_barrier2.subresourceRange.baseMipLevel = 0;
16126 img_barrier2.subresourceRange.layerCount = 1;
16127 img_barrier2.subresourceRange.levelCount = 1;
16128 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
16129 nullptr, 1, &img_barrier2);
16130 err = vkEndCommandBuffer(primary_command_buffer);
16131 ASSERT_VK_SUCCESS(err);
16132 VkSubmitInfo submit_info = {};
16133 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
16134 submit_info.commandBufferCount = 1;
16135 submit_info.pCommandBuffers = &primary_command_buffer;
16136 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
16137 ASSERT_VK_SUCCESS(err);
16138 m_errorMonitor->VerifyNotFound();
16139 err = vkDeviceWaitIdle(m_device->device());
16140 ASSERT_VK_SUCCESS(err);
16141 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &secondary_command_buffer);
16142 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &primary_command_buffer);
16143}
16144
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016145// This is a positive test. No failures are expected.
16146TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
16147 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSets validation code "
16148 "is ignoring VkWriteDescriptorSet members that are not "
16149 "related to the descriptor type specified by "
16150 "VkWriteDescriptorSet::descriptorType. Correct "
16151 "validation behavior will result in the test running to "
16152 "completion without validation errors.");
16153
16154 const uintptr_t invalid_ptr = 0xcdcdcdcd;
16155
16156 ASSERT_NO_FATAL_FAILURE(InitState());
16157
16158 // Image Case
16159 {
16160 m_errorMonitor->ExpectSuccess();
16161
16162 VkImage image;
16163 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16164 const int32_t tex_width = 32;
16165 const int32_t tex_height = 32;
16166 VkImageCreateInfo image_create_info = {};
16167 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16168 image_create_info.pNext = NULL;
16169 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16170 image_create_info.format = tex_format;
16171 image_create_info.extent.width = tex_width;
16172 image_create_info.extent.height = tex_height;
16173 image_create_info.extent.depth = 1;
16174 image_create_info.mipLevels = 1;
16175 image_create_info.arrayLayers = 1;
16176 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16177 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16178 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16179 image_create_info.flags = 0;
16180 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16181 ASSERT_VK_SUCCESS(err);
16182
16183 VkMemoryRequirements memory_reqs;
16184 VkDeviceMemory image_memory;
16185 bool pass;
16186 VkMemoryAllocateInfo memory_info = {};
16187 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16188 memory_info.pNext = NULL;
16189 memory_info.allocationSize = 0;
16190 memory_info.memoryTypeIndex = 0;
16191 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
16192 memory_info.allocationSize = memory_reqs.size;
16193 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16194 ASSERT_TRUE(pass);
16195 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
16196 ASSERT_VK_SUCCESS(err);
16197 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
16198 ASSERT_VK_SUCCESS(err);
16199
16200 VkImageViewCreateInfo image_view_create_info = {};
16201 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16202 image_view_create_info.image = image;
16203 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16204 image_view_create_info.format = tex_format;
16205 image_view_create_info.subresourceRange.layerCount = 1;
16206 image_view_create_info.subresourceRange.baseMipLevel = 0;
16207 image_view_create_info.subresourceRange.levelCount = 1;
16208 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16209
16210 VkImageView view;
16211 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
16212 ASSERT_VK_SUCCESS(err);
16213
16214 VkDescriptorPoolSize ds_type_count = {};
16215 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16216 ds_type_count.descriptorCount = 1;
16217
16218 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16219 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16220 ds_pool_ci.pNext = NULL;
16221 ds_pool_ci.maxSets = 1;
16222 ds_pool_ci.poolSizeCount = 1;
16223 ds_pool_ci.pPoolSizes = &ds_type_count;
16224
16225 VkDescriptorPool ds_pool;
16226 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16227 ASSERT_VK_SUCCESS(err);
16228
16229 VkDescriptorSetLayoutBinding dsl_binding = {};
16230 dsl_binding.binding = 0;
16231 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16232 dsl_binding.descriptorCount = 1;
16233 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16234 dsl_binding.pImmutableSamplers = NULL;
16235
16236 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16237 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16238 ds_layout_ci.pNext = NULL;
16239 ds_layout_ci.bindingCount = 1;
16240 ds_layout_ci.pBindings = &dsl_binding;
16241 VkDescriptorSetLayout ds_layout;
16242 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16243 ASSERT_VK_SUCCESS(err);
16244
16245 VkDescriptorSet descriptor_set;
16246 VkDescriptorSetAllocateInfo alloc_info = {};
16247 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16248 alloc_info.descriptorSetCount = 1;
16249 alloc_info.descriptorPool = ds_pool;
16250 alloc_info.pSetLayouts = &ds_layout;
16251 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16252 ASSERT_VK_SUCCESS(err);
16253
16254 VkDescriptorImageInfo image_info = {};
16255 image_info.imageView = view;
16256 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
16257
16258 VkWriteDescriptorSet descriptor_write;
16259 memset(&descriptor_write, 0, sizeof(descriptor_write));
16260 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16261 descriptor_write.dstSet = descriptor_set;
16262 descriptor_write.dstBinding = 0;
16263 descriptor_write.descriptorCount = 1;
16264 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16265 descriptor_write.pImageInfo = &image_info;
16266
16267 // Set pBufferInfo and pTexelBufferView to invalid values, which should
16268 // be
16269 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
16270 // This will most likely produce a crash if the parameter_validation
16271 // layer
16272 // does not correctly ignore pBufferInfo.
16273 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
16274 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
16275
16276 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16277
16278 m_errorMonitor->VerifyNotFound();
16279
16280 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16281 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16282 vkDestroyImageView(m_device->device(), view, NULL);
16283 vkDestroyImage(m_device->device(), image, NULL);
16284 vkFreeMemory(m_device->device(), image_memory, NULL);
16285 }
16286
16287 // Buffer Case
16288 {
16289 m_errorMonitor->ExpectSuccess();
16290
16291 VkBuffer buffer;
16292 uint32_t queue_family_index = 0;
16293 VkBufferCreateInfo buffer_create_info = {};
16294 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16295 buffer_create_info.size = 1024;
16296 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16297 buffer_create_info.queueFamilyIndexCount = 1;
16298 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
16299
16300 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
16301 ASSERT_VK_SUCCESS(err);
16302
16303 VkMemoryRequirements memory_reqs;
16304 VkDeviceMemory buffer_memory;
16305 bool pass;
16306 VkMemoryAllocateInfo memory_info = {};
16307 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16308 memory_info.pNext = NULL;
16309 memory_info.allocationSize = 0;
16310 memory_info.memoryTypeIndex = 0;
16311
16312 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
16313 memory_info.allocationSize = memory_reqs.size;
16314 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16315 ASSERT_TRUE(pass);
16316
16317 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
16318 ASSERT_VK_SUCCESS(err);
16319 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
16320 ASSERT_VK_SUCCESS(err);
16321
16322 VkDescriptorPoolSize ds_type_count = {};
16323 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16324 ds_type_count.descriptorCount = 1;
16325
16326 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16327 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16328 ds_pool_ci.pNext = NULL;
16329 ds_pool_ci.maxSets = 1;
16330 ds_pool_ci.poolSizeCount = 1;
16331 ds_pool_ci.pPoolSizes = &ds_type_count;
16332
16333 VkDescriptorPool ds_pool;
16334 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16335 ASSERT_VK_SUCCESS(err);
16336
16337 VkDescriptorSetLayoutBinding dsl_binding = {};
16338 dsl_binding.binding = 0;
16339 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16340 dsl_binding.descriptorCount = 1;
16341 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16342 dsl_binding.pImmutableSamplers = NULL;
16343
16344 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16345 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16346 ds_layout_ci.pNext = NULL;
16347 ds_layout_ci.bindingCount = 1;
16348 ds_layout_ci.pBindings = &dsl_binding;
16349 VkDescriptorSetLayout ds_layout;
16350 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16351 ASSERT_VK_SUCCESS(err);
16352
16353 VkDescriptorSet descriptor_set;
16354 VkDescriptorSetAllocateInfo alloc_info = {};
16355 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16356 alloc_info.descriptorSetCount = 1;
16357 alloc_info.descriptorPool = ds_pool;
16358 alloc_info.pSetLayouts = &ds_layout;
16359 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16360 ASSERT_VK_SUCCESS(err);
16361
16362 VkDescriptorBufferInfo buffer_info = {};
16363 buffer_info.buffer = buffer;
16364 buffer_info.offset = 0;
16365 buffer_info.range = 1024;
16366
16367 VkWriteDescriptorSet descriptor_write;
16368 memset(&descriptor_write, 0, sizeof(descriptor_write));
16369 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16370 descriptor_write.dstSet = descriptor_set;
16371 descriptor_write.dstBinding = 0;
16372 descriptor_write.descriptorCount = 1;
16373 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16374 descriptor_write.pBufferInfo = &buffer_info;
16375
16376 // Set pImageInfo and pTexelBufferView to invalid values, which should
16377 // be
16378 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
16379 // This will most likely produce a crash if the parameter_validation
16380 // layer
16381 // does not correctly ignore pImageInfo.
16382 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
16383 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
16384
16385 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16386
16387 m_errorMonitor->VerifyNotFound();
16388
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016389 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16390 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16391 vkDestroyBuffer(m_device->device(), buffer, NULL);
16392 vkFreeMemory(m_device->device(), buffer_memory, NULL);
16393 }
16394
16395 // Texel Buffer Case
16396 {
16397 m_errorMonitor->ExpectSuccess();
16398
16399 VkBuffer buffer;
16400 uint32_t queue_family_index = 0;
16401 VkBufferCreateInfo buffer_create_info = {};
16402 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16403 buffer_create_info.size = 1024;
16404 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
16405 buffer_create_info.queueFamilyIndexCount = 1;
16406 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
16407
16408 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
16409 ASSERT_VK_SUCCESS(err);
16410
16411 VkMemoryRequirements memory_reqs;
16412 VkDeviceMemory buffer_memory;
16413 bool pass;
16414 VkMemoryAllocateInfo memory_info = {};
16415 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16416 memory_info.pNext = NULL;
16417 memory_info.allocationSize = 0;
16418 memory_info.memoryTypeIndex = 0;
16419
16420 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
16421 memory_info.allocationSize = memory_reqs.size;
16422 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16423 ASSERT_TRUE(pass);
16424
16425 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
16426 ASSERT_VK_SUCCESS(err);
16427 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
16428 ASSERT_VK_SUCCESS(err);
16429
16430 VkBufferViewCreateInfo buff_view_ci = {};
16431 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
16432 buff_view_ci.buffer = buffer;
16433 buff_view_ci.format = VK_FORMAT_R8_UNORM;
16434 buff_view_ci.range = VK_WHOLE_SIZE;
16435 VkBufferView buffer_view;
16436 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
16437
16438 VkDescriptorPoolSize ds_type_count = {};
16439 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16440 ds_type_count.descriptorCount = 1;
16441
16442 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16443 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16444 ds_pool_ci.pNext = NULL;
16445 ds_pool_ci.maxSets = 1;
16446 ds_pool_ci.poolSizeCount = 1;
16447 ds_pool_ci.pPoolSizes = &ds_type_count;
16448
16449 VkDescriptorPool ds_pool;
16450 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16451 ASSERT_VK_SUCCESS(err);
16452
16453 VkDescriptorSetLayoutBinding dsl_binding = {};
16454 dsl_binding.binding = 0;
16455 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16456 dsl_binding.descriptorCount = 1;
16457 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16458 dsl_binding.pImmutableSamplers = NULL;
16459
16460 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16461 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16462 ds_layout_ci.pNext = NULL;
16463 ds_layout_ci.bindingCount = 1;
16464 ds_layout_ci.pBindings = &dsl_binding;
16465 VkDescriptorSetLayout ds_layout;
16466 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16467 ASSERT_VK_SUCCESS(err);
16468
16469 VkDescriptorSet descriptor_set;
16470 VkDescriptorSetAllocateInfo alloc_info = {};
16471 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16472 alloc_info.descriptorSetCount = 1;
16473 alloc_info.descriptorPool = ds_pool;
16474 alloc_info.pSetLayouts = &ds_layout;
16475 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16476 ASSERT_VK_SUCCESS(err);
16477
16478 VkWriteDescriptorSet descriptor_write;
16479 memset(&descriptor_write, 0, sizeof(descriptor_write));
16480 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16481 descriptor_write.dstSet = descriptor_set;
16482 descriptor_write.dstBinding = 0;
16483 descriptor_write.descriptorCount = 1;
16484 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16485 descriptor_write.pTexelBufferView = &buffer_view;
16486
16487 // Set pImageInfo and pBufferInfo to invalid values, which should be
16488 // ignored for descriptorType ==
16489 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
16490 // This will most likely produce a crash if the parameter_validation
16491 // layer
16492 // does not correctly ignore pImageInfo and pBufferInfo.
16493 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
16494 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
16495
16496 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16497
16498 m_errorMonitor->VerifyNotFound();
16499
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016500 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16501 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16502 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
16503 vkDestroyBuffer(m_device->device(), buffer, NULL);
16504 vkFreeMemory(m_device->device(), buffer_memory, NULL);
16505 }
16506}
16507
Tobin Ehlisf7428442016-10-25 07:58:24 -060016508TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
16509 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
16510
16511 ASSERT_NO_FATAL_FAILURE(InitState());
16512 // Create layout where two binding #s are "1"
16513 static const uint32_t NUM_BINDINGS = 3;
16514 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
16515 dsl_binding[0].binding = 1;
16516 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16517 dsl_binding[0].descriptorCount = 1;
16518 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16519 dsl_binding[0].pImmutableSamplers = NULL;
16520 dsl_binding[1].binding = 0;
16521 dsl_binding[1].descriptorCount = 1;
16522 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16523 dsl_binding[1].descriptorCount = 1;
16524 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16525 dsl_binding[1].pImmutableSamplers = NULL;
16526 dsl_binding[2].binding = 1; // Duplicate binding should cause error
16527 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16528 dsl_binding[2].descriptorCount = 1;
16529 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16530 dsl_binding[2].pImmutableSamplers = NULL;
16531
16532 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16533 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16534 ds_layout_ci.pNext = NULL;
16535 ds_layout_ci.bindingCount = NUM_BINDINGS;
16536 ds_layout_ci.pBindings = dsl_binding;
16537 VkDescriptorSetLayout ds_layout;
16538 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
16539 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16540 m_errorMonitor->VerifyFound();
16541}
16542
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060016543TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016544 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
16545
16546 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016547
16548 BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016549
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060016550 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
16551
16552 {
16553 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
16554 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
16555 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16556 m_errorMonitor->VerifyFound();
16557 }
16558
16559 {
16560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
16561 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
16562 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16563 m_errorMonitor->VerifyFound();
16564 }
16565
16566 {
16567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
16568 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
16569 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16570 m_errorMonitor->VerifyFound();
16571 }
16572
16573 {
16574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
16575 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
16576 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16577 m_errorMonitor->VerifyFound();
16578 }
16579
16580 {
16581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
16582 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
16583 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16584 m_errorMonitor->VerifyFound();
16585 }
16586
16587 {
16588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
16589 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
16590 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16591 m_errorMonitor->VerifyFound();
16592 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016593
16594 {
16595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
16596 VkRect2D scissor = {{-1, 0}, {16, 16}};
16597 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16598 m_errorMonitor->VerifyFound();
16599 }
16600
16601 {
16602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
16603 VkRect2D scissor = {{0, -2}, {16, 16}};
16604 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16605 m_errorMonitor->VerifyFound();
16606 }
16607
16608 {
16609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
16610 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
16611 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16612 m_errorMonitor->VerifyFound();
16613 }
16614
16615 {
16616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
16617 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
16618 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16619 m_errorMonitor->VerifyFound();
16620 }
16621
16622 EndCommandBuffer();
16623}
16624
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016625// This is a positive test. No failures are expected.
16626TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
16627 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
16628 VkResult err;
16629
16630 ASSERT_NO_FATAL_FAILURE(InitState());
16631 m_errorMonitor->ExpectSuccess();
16632 VkDescriptorPoolSize ds_type_count = {};
16633 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16634 ds_type_count.descriptorCount = 2;
16635
16636 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16637 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16638 ds_pool_ci.pNext = NULL;
16639 ds_pool_ci.maxSets = 1;
16640 ds_pool_ci.poolSizeCount = 1;
16641 ds_pool_ci.pPoolSizes = &ds_type_count;
16642
16643 VkDescriptorPool ds_pool;
16644 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16645 ASSERT_VK_SUCCESS(err);
16646
16647 // Create layout with two uniform buffer descriptors w/ empty binding between them
16648 static const uint32_t NUM_BINDINGS = 3;
16649 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
16650 dsl_binding[0].binding = 0;
16651 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16652 dsl_binding[0].descriptorCount = 1;
16653 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
16654 dsl_binding[0].pImmutableSamplers = NULL;
16655 dsl_binding[1].binding = 1;
16656 dsl_binding[1].descriptorCount = 0; // empty binding
16657 dsl_binding[2].binding = 2;
16658 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16659 dsl_binding[2].descriptorCount = 1;
16660 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
16661 dsl_binding[2].pImmutableSamplers = NULL;
16662
16663 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16664 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16665 ds_layout_ci.pNext = NULL;
16666 ds_layout_ci.bindingCount = NUM_BINDINGS;
16667 ds_layout_ci.pBindings = dsl_binding;
16668 VkDescriptorSetLayout ds_layout;
16669 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16670 ASSERT_VK_SUCCESS(err);
16671
16672 VkDescriptorSet descriptor_set = {};
16673 VkDescriptorSetAllocateInfo alloc_info = {};
16674 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16675 alloc_info.descriptorSetCount = 1;
16676 alloc_info.descriptorPool = ds_pool;
16677 alloc_info.pSetLayouts = &ds_layout;
16678 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16679 ASSERT_VK_SUCCESS(err);
16680
16681 // Create a buffer to be used for update
16682 VkBufferCreateInfo buff_ci = {};
16683 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16684 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16685 buff_ci.size = 256;
16686 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16687 VkBuffer buffer;
16688 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
16689 ASSERT_VK_SUCCESS(err);
16690 // Have to bind memory to buffer before descriptor update
16691 VkMemoryAllocateInfo mem_alloc = {};
16692 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16693 mem_alloc.pNext = NULL;
16694 mem_alloc.allocationSize = 512; // one allocation for both buffers
16695 mem_alloc.memoryTypeIndex = 0;
16696
16697 VkMemoryRequirements mem_reqs;
16698 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
16699 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
16700 if (!pass) {
16701 vkDestroyBuffer(m_device->device(), buffer, NULL);
16702 return;
16703 }
16704
16705 VkDeviceMemory mem;
16706 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
16707 ASSERT_VK_SUCCESS(err);
16708 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
16709 ASSERT_VK_SUCCESS(err);
16710
16711 // Only update the descriptor at binding 2
16712 VkDescriptorBufferInfo buff_info = {};
16713 buff_info.buffer = buffer;
16714 buff_info.offset = 0;
16715 buff_info.range = VK_WHOLE_SIZE;
16716 VkWriteDescriptorSet descriptor_write = {};
16717 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16718 descriptor_write.dstBinding = 2;
16719 descriptor_write.descriptorCount = 1;
16720 descriptor_write.pTexelBufferView = nullptr;
16721 descriptor_write.pBufferInfo = &buff_info;
16722 descriptor_write.pImageInfo = nullptr;
16723 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16724 descriptor_write.dstSet = descriptor_set;
16725
16726 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16727
16728 m_errorMonitor->VerifyNotFound();
16729 // Cleanup
16730 vkFreeMemory(m_device->device(), mem, NULL);
16731 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16732 vkDestroyBuffer(m_device->device(), buffer, NULL);
16733 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16734}
16735
16736// This is a positive test. No failures are expected.
16737TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
16738 VkResult err;
16739 bool pass;
16740
16741 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
16742 "the buffer, create an image, and bind the same memory to "
16743 "it");
16744
16745 m_errorMonitor->ExpectSuccess();
16746
16747 ASSERT_NO_FATAL_FAILURE(InitState());
16748
16749 VkBuffer buffer;
16750 VkImage image;
16751 VkDeviceMemory mem;
16752 VkMemoryRequirements mem_reqs;
16753
16754 VkBufferCreateInfo buf_info = {};
16755 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16756 buf_info.pNext = NULL;
16757 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16758 buf_info.size = 256;
16759 buf_info.queueFamilyIndexCount = 0;
16760 buf_info.pQueueFamilyIndices = NULL;
16761 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16762 buf_info.flags = 0;
16763 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
16764 ASSERT_VK_SUCCESS(err);
16765
16766 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
16767
16768 VkMemoryAllocateInfo alloc_info = {};
16769 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16770 alloc_info.pNext = NULL;
16771 alloc_info.memoryTypeIndex = 0;
16772
16773 // Ensure memory is big enough for both bindings
16774 alloc_info.allocationSize = 0x10000;
16775
16776 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
16777 if (!pass) {
16778 vkDestroyBuffer(m_device->device(), buffer, NULL);
16779 return;
16780 }
16781
16782 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
16783 ASSERT_VK_SUCCESS(err);
16784
16785 uint8_t *pData;
16786 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
16787 ASSERT_VK_SUCCESS(err);
16788
16789 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
16790
16791 vkUnmapMemory(m_device->device(), mem);
16792
16793 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
16794 ASSERT_VK_SUCCESS(err);
16795
16796 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
16797 // memory. In fact, it was never used by the GPU.
16798 // Just be be sure, wait for idle.
16799 vkDestroyBuffer(m_device->device(), buffer, NULL);
16800 vkDeviceWaitIdle(m_device->device());
16801
16802 VkImageCreateInfo image_create_info = {};
16803 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16804 image_create_info.pNext = NULL;
16805 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16806 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
16807 image_create_info.extent.width = 64;
16808 image_create_info.extent.height = 64;
16809 image_create_info.extent.depth = 1;
16810 image_create_info.mipLevels = 1;
16811 image_create_info.arrayLayers = 1;
16812 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16813 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16814 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
16815 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16816 image_create_info.queueFamilyIndexCount = 0;
16817 image_create_info.pQueueFamilyIndices = NULL;
16818 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16819 image_create_info.flags = 0;
16820
16821 VkMemoryAllocateInfo mem_alloc = {};
16822 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16823 mem_alloc.pNext = NULL;
16824 mem_alloc.allocationSize = 0;
16825 mem_alloc.memoryTypeIndex = 0;
16826
16827 /* Create a mappable image. It will be the texture if linear images are ok
16828 * to be textures or it will be the staging image if they are not.
16829 */
16830 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16831 ASSERT_VK_SUCCESS(err);
16832
16833 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
16834
16835 mem_alloc.allocationSize = mem_reqs.size;
16836
16837 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
16838 if (!pass) {
16839 vkDestroyImage(m_device->device(), image, NULL);
16840 return;
16841 }
16842
16843 // VALIDATION FAILURE:
16844 err = vkBindImageMemory(m_device->device(), image, mem, 0);
16845 ASSERT_VK_SUCCESS(err);
16846
16847 m_errorMonitor->VerifyNotFound();
16848
16849 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016850 vkDestroyImage(m_device->device(), image, NULL);
16851}
16852
Tobin Ehlis953e8392016-11-17 10:54:13 -070016853TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
16854 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
16855 // We previously had a bug where dynamic offset of inactive bindings was still being used
16856 VkResult err;
16857 m_errorMonitor->ExpectSuccess();
16858
16859 ASSERT_NO_FATAL_FAILURE(InitState());
16860 ASSERT_NO_FATAL_FAILURE(InitViewport());
16861 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16862
16863 VkDescriptorPoolSize ds_type_count = {};
16864 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16865 ds_type_count.descriptorCount = 3;
16866
16867 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16868 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16869 ds_pool_ci.pNext = NULL;
16870 ds_pool_ci.maxSets = 1;
16871 ds_pool_ci.poolSizeCount = 1;
16872 ds_pool_ci.pPoolSizes = &ds_type_count;
16873
16874 VkDescriptorPool ds_pool;
16875 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16876 ASSERT_VK_SUCCESS(err);
16877
16878 const uint32_t BINDING_COUNT = 3;
16879 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070016880 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070016881 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16882 dsl_binding[0].descriptorCount = 1;
16883 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16884 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070016885 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070016886 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16887 dsl_binding[1].descriptorCount = 1;
16888 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16889 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070016890 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070016891 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16892 dsl_binding[2].descriptorCount = 1;
16893 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16894 dsl_binding[2].pImmutableSamplers = NULL;
16895
16896 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16897 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16898 ds_layout_ci.pNext = NULL;
16899 ds_layout_ci.bindingCount = BINDING_COUNT;
16900 ds_layout_ci.pBindings = dsl_binding;
16901 VkDescriptorSetLayout ds_layout;
16902 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16903 ASSERT_VK_SUCCESS(err);
16904
16905 VkDescriptorSet descriptor_set;
16906 VkDescriptorSetAllocateInfo alloc_info = {};
16907 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16908 alloc_info.descriptorSetCount = 1;
16909 alloc_info.descriptorPool = ds_pool;
16910 alloc_info.pSetLayouts = &ds_layout;
16911 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16912 ASSERT_VK_SUCCESS(err);
16913
16914 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
16915 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
16916 pipeline_layout_ci.pNext = NULL;
16917 pipeline_layout_ci.setLayoutCount = 1;
16918 pipeline_layout_ci.pSetLayouts = &ds_layout;
16919
16920 VkPipelineLayout pipeline_layout;
16921 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
16922 ASSERT_VK_SUCCESS(err);
16923
16924 // Create two buffers to update the descriptors with
16925 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
16926 uint32_t qfi = 0;
16927 VkBufferCreateInfo buffCI = {};
16928 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16929 buffCI.size = 2048;
16930 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16931 buffCI.queueFamilyIndexCount = 1;
16932 buffCI.pQueueFamilyIndices = &qfi;
16933
16934 VkBuffer dyub1;
16935 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
16936 ASSERT_VK_SUCCESS(err);
16937 // buffer2
16938 buffCI.size = 1024;
16939 VkBuffer dyub2;
16940 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
16941 ASSERT_VK_SUCCESS(err);
16942 // Allocate memory and bind to buffers
16943 VkMemoryAllocateInfo mem_alloc[2] = {};
16944 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16945 mem_alloc[0].pNext = NULL;
16946 mem_alloc[0].memoryTypeIndex = 0;
16947 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16948 mem_alloc[1].pNext = NULL;
16949 mem_alloc[1].memoryTypeIndex = 0;
16950
16951 VkMemoryRequirements mem_reqs1;
16952 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
16953 VkMemoryRequirements mem_reqs2;
16954 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
16955 mem_alloc[0].allocationSize = mem_reqs1.size;
16956 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
16957 mem_alloc[1].allocationSize = mem_reqs2.size;
16958 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
16959 if (!pass) {
16960 vkDestroyBuffer(m_device->device(), dyub1, NULL);
16961 vkDestroyBuffer(m_device->device(), dyub2, NULL);
16962 return;
16963 }
16964
16965 VkDeviceMemory mem1;
16966 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
16967 ASSERT_VK_SUCCESS(err);
16968 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
16969 ASSERT_VK_SUCCESS(err);
16970 VkDeviceMemory mem2;
16971 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
16972 ASSERT_VK_SUCCESS(err);
16973 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
16974 ASSERT_VK_SUCCESS(err);
16975 // Update descriptors
16976 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
16977 buff_info[0].buffer = dyub1;
16978 buff_info[0].offset = 0;
16979 buff_info[0].range = 256;
16980 buff_info[1].buffer = dyub1;
16981 buff_info[1].offset = 256;
16982 buff_info[1].range = 512;
16983 buff_info[2].buffer = dyub2;
16984 buff_info[2].offset = 0;
16985 buff_info[2].range = 512;
16986
16987 VkWriteDescriptorSet descriptor_write;
16988 memset(&descriptor_write, 0, sizeof(descriptor_write));
16989 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16990 descriptor_write.dstSet = descriptor_set;
16991 descriptor_write.dstBinding = 0;
16992 descriptor_write.descriptorCount = BINDING_COUNT;
16993 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16994 descriptor_write.pBufferInfo = buff_info;
16995
16996 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16997
16998 BeginCommandBuffer();
16999
17000 // Create PSO to be used for draw-time errors below
17001 char const *vsSource = "#version 450\n"
17002 "\n"
17003 "out gl_PerVertex { \n"
17004 " vec4 gl_Position;\n"
17005 "};\n"
17006 "void main(){\n"
17007 " gl_Position = vec4(1);\n"
17008 "}\n";
17009 char const *fsSource = "#version 450\n"
17010 "\n"
17011 "layout(location=0) out vec4 x;\n"
17012 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
17013 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
17014 "void main(){\n"
17015 " x = vec4(bar1.y) + vec4(bar2.y);\n"
17016 "}\n";
17017 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
17018 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
17019 VkPipelineObj pipe(m_device);
17020 pipe.SetViewport(m_viewports);
17021 pipe.SetScissor(m_scissors);
17022 pipe.AddShader(&vs);
17023 pipe.AddShader(&fs);
17024 pipe.AddColorAttachment();
17025 pipe.CreateVKPipeline(pipeline_layout, renderPass());
17026
17027 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
17028 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
17029 // we used to have a bug in this case.
17030 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
17031 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
17032 &descriptor_set, BINDING_COUNT, dyn_off);
17033 Draw(1, 0, 0, 0);
17034 m_errorMonitor->VerifyNotFound();
17035
17036 vkDestroyBuffer(m_device->device(), dyub1, NULL);
17037 vkDestroyBuffer(m_device->device(), dyub2, NULL);
17038 vkFreeMemory(m_device->device(), mem1, NULL);
17039 vkFreeMemory(m_device->device(), mem2, NULL);
17040
17041 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
17042 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17043 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17044}
17045
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017046TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
17047
17048 TEST_DESCRIPTION("Ensure that validations handling of non-coherent memory "
17049 "mapping while using VK_WHOLE_SIZE does not cause access "
17050 "violations");
17051 VkResult err;
17052 uint8_t *pData;
17053 ASSERT_NO_FATAL_FAILURE(InitState());
17054
17055 VkDeviceMemory mem;
17056 VkMemoryRequirements mem_reqs;
17057 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017058 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017059 VkMemoryAllocateInfo alloc_info = {};
17060 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17061 alloc_info.pNext = NULL;
17062 alloc_info.memoryTypeIndex = 0;
17063
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017064 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017065 alloc_info.allocationSize = allocation_size;
17066
17067 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
17068 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
17069 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
17070 if (!pass) {
17071 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
17072 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
17073 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
17074 if (!pass) {
17075 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
17076 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
17077 VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
17078 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
17079 if (!pass) {
17080 return;
17081 }
17082 }
17083 }
17084
17085 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
17086 ASSERT_VK_SUCCESS(err);
17087
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017088 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017089 m_errorMonitor->ExpectSuccess();
17090 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
17091 ASSERT_VK_SUCCESS(err);
17092 VkMappedMemoryRange mmr = {};
17093 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17094 mmr.memory = mem;
17095 mmr.offset = 0;
17096 mmr.size = VK_WHOLE_SIZE;
17097 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17098 ASSERT_VK_SUCCESS(err);
17099 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17100 ASSERT_VK_SUCCESS(err);
17101 m_errorMonitor->VerifyNotFound();
17102 vkUnmapMemory(m_device->device(), mem);
17103
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017104 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017105 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017106 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017107 ASSERT_VK_SUCCESS(err);
17108 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17109 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017110 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017111 mmr.size = VK_WHOLE_SIZE;
17112 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17113 ASSERT_VK_SUCCESS(err);
17114 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17115 ASSERT_VK_SUCCESS(err);
17116 m_errorMonitor->VerifyNotFound();
17117 vkUnmapMemory(m_device->device(), mem);
17118
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017119 // Map with offset and size
17120 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017121 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017122 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017123 ASSERT_VK_SUCCESS(err);
17124 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17125 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017126 mmr.offset = 4 * atom_size;
17127 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017128 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17129 ASSERT_VK_SUCCESS(err);
17130 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17131 ASSERT_VK_SUCCESS(err);
17132 m_errorMonitor->VerifyNotFound();
17133 vkUnmapMemory(m_device->device(), mem);
17134
17135 // Map without offset and flush WHOLE_SIZE with two separate offsets
17136 m_errorMonitor->ExpectSuccess();
17137 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
17138 ASSERT_VK_SUCCESS(err);
17139 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17140 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017141 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017142 mmr.size = VK_WHOLE_SIZE;
17143 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17144 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017145 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017146 mmr.size = VK_WHOLE_SIZE;
17147 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17148 ASSERT_VK_SUCCESS(err);
17149 m_errorMonitor->VerifyNotFound();
17150 vkUnmapMemory(m_device->device(), mem);
17151
17152 vkFreeMemory(m_device->device(), mem, NULL);
17153}
17154
17155// This is a positive test. We used to expect error in this case but spec now allows it
17156TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
17157 m_errorMonitor->ExpectSuccess();
17158 vk_testing::Fence testFence;
17159 VkFenceCreateInfo fenceInfo = {};
17160 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
17161 fenceInfo.pNext = NULL;
17162
17163 ASSERT_NO_FATAL_FAILURE(InitState());
17164 testFence.init(*m_device, fenceInfo);
17165 VkFence fences[1] = { testFence.handle() };
17166 VkResult result = vkResetFences(m_device->device(), 1, fences);
17167 ASSERT_VK_SUCCESS(result);
17168
17169 m_errorMonitor->VerifyNotFound();
17170}
17171
17172TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
17173 m_errorMonitor->ExpectSuccess();
17174
17175 ASSERT_NO_FATAL_FAILURE(InitState());
17176 VkResult err;
17177
17178 // Record (empty!) command buffer that can be submitted multiple times
17179 // simultaneously.
17180 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
17181 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr };
17182 m_commandBuffer->BeginCommandBuffer(&cbbi);
17183 m_commandBuffer->EndCommandBuffer();
17184
17185 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
17186 VkFence fence;
17187 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
17188 ASSERT_VK_SUCCESS(err);
17189
17190 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
17191 VkSemaphore s1, s2;
17192 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
17193 ASSERT_VK_SUCCESS(err);
17194 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
17195 ASSERT_VK_SUCCESS(err);
17196
17197 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
17198 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1 };
17199 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
17200 ASSERT_VK_SUCCESS(err);
17201
17202 // Submit CB again, signaling s2.
17203 si.pSignalSemaphores = &s2;
17204 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
17205 ASSERT_VK_SUCCESS(err);
17206
17207 // Wait for fence.
17208 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
17209 ASSERT_VK_SUCCESS(err);
17210
17211 // CB is still in flight from second submission, but semaphore s1 is no
17212 // longer in flight. delete it.
17213 vkDestroySemaphore(m_device->device(), s1, nullptr);
17214
17215 m_errorMonitor->VerifyNotFound();
17216
17217 // Force device idle and clean up remaining objects
17218 vkDeviceWaitIdle(m_device->device());
17219 vkDestroySemaphore(m_device->device(), s2, nullptr);
17220 vkDestroyFence(m_device->device(), fence, nullptr);
17221}
17222
17223TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
17224 m_errorMonitor->ExpectSuccess();
17225
17226 ASSERT_NO_FATAL_FAILURE(InitState());
17227 VkResult err;
17228
17229 // A fence created signaled
17230 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
17231 VkFence f1;
17232 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
17233 ASSERT_VK_SUCCESS(err);
17234
17235 // A fence created not
17236 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
17237 VkFence f2;
17238 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
17239 ASSERT_VK_SUCCESS(err);
17240
17241 // Submit the unsignaled fence
17242 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr };
17243 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
17244
17245 // Wait on both fences, with signaled first.
17246 VkFence fences[] = { f1, f2 };
17247 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
17248
17249 // Should have both retired!
17250 vkDestroyFence(m_device->device(), f1, nullptr);
17251 vkDestroyFence(m_device->device(), f2, nullptr);
17252
17253 m_errorMonitor->VerifyNotFound();
17254}
17255
17256TEST_F(VkPositiveLayerTest, ValidUsage) {
17257 TEST_DESCRIPTION("Verify that creating an image view from an image with valid usage "
17258 "doesn't generate validation errors");
17259
17260 ASSERT_NO_FATAL_FAILURE(InitState());
17261
17262 m_errorMonitor->ExpectSuccess();
17263 // Verify that we can create a view with usage INPUT_ATTACHMENT
17264 VkImageObj image(m_device);
17265 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17266 ASSERT_TRUE(image.initialized());
17267 VkImageView imageView;
17268 VkImageViewCreateInfo ivci = {};
17269 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
17270 ivci.image = image.handle();
17271 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
17272 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
17273 ivci.subresourceRange.layerCount = 1;
17274 ivci.subresourceRange.baseMipLevel = 0;
17275 ivci.subresourceRange.levelCount = 1;
17276 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17277
17278 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
17279 m_errorMonitor->VerifyNotFound();
17280 vkDestroyImageView(m_device->device(), imageView, NULL);
17281}
17282
17283// This is a positive test. No failures are expected.
17284TEST_F(VkPositiveLayerTest, BindSparse) {
17285 TEST_DESCRIPTION("Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
17286 "and then free the memory");
17287
17288 ASSERT_NO_FATAL_FAILURE(InitState());
17289
17290 auto index = m_device->graphics_queue_node_index_;
17291 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT))
17292 return;
17293
17294 m_errorMonitor->ExpectSuccess();
17295
17296 VkImage image;
17297 VkImageCreateInfo image_create_info = {};
17298 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17299 image_create_info.pNext = NULL;
17300 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17301 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17302 image_create_info.extent.width = 64;
17303 image_create_info.extent.height = 64;
17304 image_create_info.extent.depth = 1;
17305 image_create_info.mipLevels = 1;
17306 image_create_info.arrayLayers = 1;
17307 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17308 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17309 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
17310 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
17311 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
17312 ASSERT_VK_SUCCESS(err);
17313
17314 VkMemoryRequirements memory_reqs;
17315 VkDeviceMemory memory_one, memory_two;
17316 bool pass;
17317 VkMemoryAllocateInfo memory_info = {};
17318 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17319 memory_info.pNext = NULL;
17320 memory_info.allocationSize = 0;
17321 memory_info.memoryTypeIndex = 0;
17322 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
17323 // Find an image big enough to allow sparse mapping of 2 memory regions
17324 // Increase the image size until it is at least twice the
17325 // size of the required alignment, to ensure we can bind both
17326 // allocated memory blocks to the image on aligned offsets.
17327 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
17328 vkDestroyImage(m_device->device(), image, nullptr);
17329 image_create_info.extent.width *= 2;
17330 image_create_info.extent.height *= 2;
17331 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
17332 ASSERT_VK_SUCCESS(err);
17333 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
17334 }
17335 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
17336 // at the end of the first
17337 memory_info.allocationSize = memory_reqs.alignment;
17338 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17339 ASSERT_TRUE(pass);
17340 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
17341 ASSERT_VK_SUCCESS(err);
17342 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
17343 ASSERT_VK_SUCCESS(err);
17344 VkSparseMemoryBind binds[2];
17345 binds[0].flags = 0;
17346 binds[0].memory = memory_one;
17347 binds[0].memoryOffset = 0;
17348 binds[0].resourceOffset = 0;
17349 binds[0].size = memory_info.allocationSize;
17350 binds[1].flags = 0;
17351 binds[1].memory = memory_two;
17352 binds[1].memoryOffset = 0;
17353 binds[1].resourceOffset = memory_info.allocationSize;
17354 binds[1].size = memory_info.allocationSize;
17355
17356 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
17357 opaqueBindInfo.image = image;
17358 opaqueBindInfo.bindCount = 2;
17359 opaqueBindInfo.pBinds = binds;
17360
17361 VkFence fence = VK_NULL_HANDLE;
17362 VkBindSparseInfo bindSparseInfo = {};
17363 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
17364 bindSparseInfo.imageOpaqueBindCount = 1;
17365 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
17366
17367 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
17368 vkQueueWaitIdle(m_device->m_queue);
17369 vkDestroyImage(m_device->device(), image, NULL);
17370 vkFreeMemory(m_device->device(), memory_one, NULL);
17371 vkFreeMemory(m_device->device(), memory_two, NULL);
17372 m_errorMonitor->VerifyNotFound();
17373}
17374
17375TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
17376 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
17377 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
17378 "the command buffer has prior knowledge of that "
17379 "attachment's layout.");
17380
17381 m_errorMonitor->ExpectSuccess();
17382
17383 ASSERT_NO_FATAL_FAILURE(InitState());
17384
17385 // A renderpass with one color attachment.
17386 VkAttachmentDescription attachment = { 0,
17387 VK_FORMAT_R8G8B8A8_UNORM,
17388 VK_SAMPLE_COUNT_1_BIT,
17389 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17390 VK_ATTACHMENT_STORE_OP_STORE,
17391 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17392 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17393 VK_IMAGE_LAYOUT_UNDEFINED,
17394 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17395
17396 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17397
17398 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17399
17400 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr };
17401
17402 VkRenderPass rp;
17403 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17404 ASSERT_VK_SUCCESS(err);
17405
17406 // A compatible framebuffer.
17407 VkImageObj image(m_device);
17408 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17409 ASSERT_TRUE(image.initialized());
17410
17411 VkImageViewCreateInfo ivci = {
17412 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17413 nullptr,
17414 0,
17415 image.handle(),
17416 VK_IMAGE_VIEW_TYPE_2D,
17417 VK_FORMAT_R8G8B8A8_UNORM,
17418 { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17419 VK_COMPONENT_SWIZZLE_IDENTITY },
17420 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
17421 };
17422 VkImageView view;
17423 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17424 ASSERT_VK_SUCCESS(err);
17425
17426 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17427 VkFramebuffer fb;
17428 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17429 ASSERT_VK_SUCCESS(err);
17430
17431 // Record a single command buffer which uses this renderpass twice. The
17432 // bug is triggered at the beginning of the second renderpass, when the
17433 // command buffer already has a layout recorded for the attachment.
17434 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17435 BeginCommandBuffer();
17436 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17437 vkCmdEndRenderPass(m_commandBuffer->handle());
17438 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17439
17440 m_errorMonitor->VerifyNotFound();
17441
17442 vkCmdEndRenderPass(m_commandBuffer->handle());
17443 EndCommandBuffer();
17444
17445 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17446 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17447 vkDestroyImageView(m_device->device(), view, nullptr);
17448}
17449
17450TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
17451 TEST_DESCRIPTION("This test should pass. Create a Framebuffer and "
17452 "command buffer, bind them together, then destroy "
17453 "command pool and framebuffer and verify there are no "
17454 "errors.");
17455
17456 m_errorMonitor->ExpectSuccess();
17457
17458 ASSERT_NO_FATAL_FAILURE(InitState());
17459
17460 // A renderpass with one color attachment.
17461 VkAttachmentDescription attachment = { 0,
17462 VK_FORMAT_R8G8B8A8_UNORM,
17463 VK_SAMPLE_COUNT_1_BIT,
17464 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17465 VK_ATTACHMENT_STORE_OP_STORE,
17466 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17467 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17468 VK_IMAGE_LAYOUT_UNDEFINED,
17469 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17470
17471 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17472
17473 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17474
17475 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr };
17476
17477 VkRenderPass rp;
17478 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17479 ASSERT_VK_SUCCESS(err);
17480
17481 // A compatible framebuffer.
17482 VkImageObj image(m_device);
17483 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17484 ASSERT_TRUE(image.initialized());
17485
17486 VkImageViewCreateInfo ivci = {
17487 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17488 nullptr,
17489 0,
17490 image.handle(),
17491 VK_IMAGE_VIEW_TYPE_2D,
17492 VK_FORMAT_R8G8B8A8_UNORM,
17493 { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17494 VK_COMPONENT_SWIZZLE_IDENTITY },
17495 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
17496 };
17497 VkImageView view;
17498 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17499 ASSERT_VK_SUCCESS(err);
17500
17501 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17502 VkFramebuffer fb;
17503 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17504 ASSERT_VK_SUCCESS(err);
17505
17506 // Explicitly create a command buffer to bind the FB to so that we can then
17507 // destroy the command pool in order to implicitly free command buffer
17508 VkCommandPool command_pool;
17509 VkCommandPoolCreateInfo pool_create_info{};
17510 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17511 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17512 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17513 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17514
17515 VkCommandBuffer command_buffer;
17516 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17517 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17518 command_buffer_allocate_info.commandPool = command_pool;
17519 command_buffer_allocate_info.commandBufferCount = 1;
17520 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17521 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
17522
17523 // Begin our cmd buffer with renderpass using our framebuffer
17524 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17525 VkCommandBufferBeginInfo begin_info{};
17526 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17527 vkBeginCommandBuffer(command_buffer, &begin_info);
17528
17529 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17530 vkCmdEndRenderPass(command_buffer);
17531 vkEndCommandBuffer(command_buffer);
17532 vkDestroyImageView(m_device->device(), view, nullptr);
17533 // Destroy command pool to implicitly free command buffer
17534 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
17535 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17536 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17537 m_errorMonitor->VerifyNotFound();
17538}
17539
17540TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
17541 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
17542 "transitions for the first subpass");
17543
17544 m_errorMonitor->ExpectSuccess();
17545
17546 ASSERT_NO_FATAL_FAILURE(InitState());
17547
17548 // A renderpass with one color attachment.
17549 VkAttachmentDescription attachment = { 0,
17550 VK_FORMAT_R8G8B8A8_UNORM,
17551 VK_SAMPLE_COUNT_1_BIT,
17552 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17553 VK_ATTACHMENT_STORE_OP_STORE,
17554 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17555 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17556 VK_IMAGE_LAYOUT_UNDEFINED,
17557 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17558
17559 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17560
17561 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17562
17563 VkSubpassDependency dep = { 0,
17564 0,
17565 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17566 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17567 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17568 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17569 VK_DEPENDENCY_BY_REGION_BIT };
17570
17571 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep };
17572
17573 VkResult err;
17574 VkRenderPass rp;
17575 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17576 ASSERT_VK_SUCCESS(err);
17577
17578 // A compatible framebuffer.
17579 VkImageObj image(m_device);
17580 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17581 ASSERT_TRUE(image.initialized());
17582
17583 VkImageViewCreateInfo ivci = {
17584 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17585 nullptr,
17586 0,
17587 image.handle(),
17588 VK_IMAGE_VIEW_TYPE_2D,
17589 VK_FORMAT_R8G8B8A8_UNORM,
17590 { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17591 VK_COMPONENT_SWIZZLE_IDENTITY },
17592 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
17593 };
17594 VkImageView view;
17595 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17596 ASSERT_VK_SUCCESS(err);
17597
17598 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17599 VkFramebuffer fb;
17600 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17601 ASSERT_VK_SUCCESS(err);
17602
17603 // Record a single command buffer which issues a pipeline barrier w/
17604 // image memory barrier for the attachment. This detects the previously
17605 // missing tracking of the subpass layout by throwing a validation error
17606 // if it doesn't occur.
17607 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17608 BeginCommandBuffer();
17609 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17610
17611 VkImageMemoryBarrier imb = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
17612 nullptr,
17613 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17614 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17615 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
17616 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
17617 VK_QUEUE_FAMILY_IGNORED,
17618 VK_QUEUE_FAMILY_IGNORED,
17619 image.handle(),
17620 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } };
17621 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17622 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
17623 &imb);
17624
17625 vkCmdEndRenderPass(m_commandBuffer->handle());
17626 m_errorMonitor->VerifyNotFound();
17627 EndCommandBuffer();
17628
17629 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17630 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17631 vkDestroyImageView(m_device->device(), view, nullptr);
17632}
17633
17634TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
17635 TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
17636 "is used as a depth/stencil framebuffer attachment, the "
17637 "aspectMask is ignored and both depth and stencil image "
17638 "subresources are used.");
17639
17640 VkFormatProperties format_properties;
17641 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
17642 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
17643 return;
17644 }
17645
17646 m_errorMonitor->ExpectSuccess();
17647
17648 ASSERT_NO_FATAL_FAILURE(InitState());
17649
17650 VkAttachmentDescription attachment = { 0,
17651 VK_FORMAT_D32_SFLOAT_S8_UINT,
17652 VK_SAMPLE_COUNT_1_BIT,
17653 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17654 VK_ATTACHMENT_STORE_OP_STORE,
17655 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17656 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17657 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
17658 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL };
17659
17660 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL };
17661
17662 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr };
17663
17664 VkSubpassDependency dep = { 0,
17665 0,
17666 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17667 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17668 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17669 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17670 VK_DEPENDENCY_BY_REGION_BIT};
17671
17672 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep };
17673
17674 VkResult err;
17675 VkRenderPass rp;
17676 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17677 ASSERT_VK_SUCCESS(err);
17678
17679 VkImageObj image(m_device);
17680 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
17681 0x26, // usage
17682 VK_IMAGE_TILING_OPTIMAL, 0);
17683 ASSERT_TRUE(image.initialized());
17684 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
17685
17686 VkImageViewCreateInfo ivci = {
17687 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17688 nullptr,
17689 0,
17690 image.handle(),
17691 VK_IMAGE_VIEW_TYPE_2D,
17692 VK_FORMAT_D32_SFLOAT_S8_UINT,
17693 { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A },
17694 { 0x2, 0, 1, 0, 1 },
17695 };
17696 VkImageView view;
17697 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17698 ASSERT_VK_SUCCESS(err);
17699
17700 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17701 VkFramebuffer fb;
17702 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17703 ASSERT_VK_SUCCESS(err);
17704
17705 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17706 BeginCommandBuffer();
17707 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17708
17709 VkImageMemoryBarrier imb = {};
17710 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17711 imb.pNext = nullptr;
17712 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
17713 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17714 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17715 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
17716 imb.srcQueueFamilyIndex = 0;
17717 imb.dstQueueFamilyIndex = 0;
17718 imb.image = image.handle();
17719 imb.subresourceRange.aspectMask = 0x6;
17720 imb.subresourceRange.baseMipLevel = 0;
17721 imb.subresourceRange.levelCount = 0x1;
17722 imb.subresourceRange.baseArrayLayer = 0;
17723 imb.subresourceRange.layerCount = 0x1;
17724
17725 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17726 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
17727 &imb);
17728
17729 vkCmdEndRenderPass(m_commandBuffer->handle());
17730 EndCommandBuffer();
17731 QueueCommandBuffer(false);
17732 m_errorMonitor->VerifyNotFound();
17733
17734 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17735 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17736 vkDestroyImageView(m_device->device(), view, nullptr);
17737}
17738
17739TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
17740 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
17741 "errors, when an attachment reference is "
17742 "VK_ATTACHMENT_UNUSED");
17743
17744 m_errorMonitor->ExpectSuccess();
17745
17746 ASSERT_NO_FATAL_FAILURE(InitState());
17747
17748 // A renderpass with no attachments
17749 VkAttachmentReference att_ref = { VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17750
17751 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17752
17753 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr };
17754
17755 VkRenderPass rp;
17756 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17757 ASSERT_VK_SUCCESS(err);
17758
17759 // A compatible framebuffer.
17760 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1 };
17761 VkFramebuffer fb;
17762 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17763 ASSERT_VK_SUCCESS(err);
17764
17765 // Record a command buffer which just begins and ends the renderpass. The
17766 // bug manifests in BeginRenderPass.
17767 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17768 BeginCommandBuffer();
17769 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17770 vkCmdEndRenderPass(m_commandBuffer->handle());
17771 m_errorMonitor->VerifyNotFound();
17772 EndCommandBuffer();
17773
17774 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17775 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17776}
17777
17778// This is a positive test. No errors are expected.
17779TEST_F(VkPositiveLayerTest, StencilLoadOp) {
17780 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
17781 "CLEAR. stencil[Load|Store]Op used to be ignored.");
17782 VkResult result = VK_SUCCESS;
17783 VkImageFormatProperties formatProps;
17784 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17785 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
17786 &formatProps);
17787 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
17788 return;
17789 }
17790
17791 ASSERT_NO_FATAL_FAILURE(InitState());
17792 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
17793 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
17794 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
17795 VkAttachmentDescription att = {};
17796 VkAttachmentReference ref = {};
17797 att.format = depth_stencil_fmt;
17798 att.samples = VK_SAMPLE_COUNT_1_BIT;
17799 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
17800 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
17801 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
17802 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
17803 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17804 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17805
17806 VkClearValue clear;
17807 clear.depthStencil.depth = 1.0;
17808 clear.depthStencil.stencil = 0;
17809 ref.attachment = 0;
17810 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17811
17812 VkSubpassDescription subpass = {};
17813 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
17814 subpass.flags = 0;
17815 subpass.inputAttachmentCount = 0;
17816 subpass.pInputAttachments = NULL;
17817 subpass.colorAttachmentCount = 0;
17818 subpass.pColorAttachments = NULL;
17819 subpass.pResolveAttachments = NULL;
17820 subpass.pDepthStencilAttachment = &ref;
17821 subpass.preserveAttachmentCount = 0;
17822 subpass.pPreserveAttachments = NULL;
17823
17824 VkRenderPass rp;
17825 VkRenderPassCreateInfo rp_info = {};
17826 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
17827 rp_info.attachmentCount = 1;
17828 rp_info.pAttachments = &att;
17829 rp_info.subpassCount = 1;
17830 rp_info.pSubpasses = &subpass;
17831 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
17832 ASSERT_VK_SUCCESS(result);
17833
17834 VkImageView *depthView = m_depthStencil->BindInfo();
17835 VkFramebufferCreateInfo fb_info = {};
17836 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
17837 fb_info.pNext = NULL;
17838 fb_info.renderPass = rp;
17839 fb_info.attachmentCount = 1;
17840 fb_info.pAttachments = depthView;
17841 fb_info.width = 100;
17842 fb_info.height = 100;
17843 fb_info.layers = 1;
17844 VkFramebuffer fb;
17845 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
17846 ASSERT_VK_SUCCESS(result);
17847
17848 VkRenderPassBeginInfo rpbinfo = {};
17849 rpbinfo.clearValueCount = 1;
17850 rpbinfo.pClearValues = &clear;
17851 rpbinfo.pNext = NULL;
17852 rpbinfo.renderPass = rp;
17853 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
17854 rpbinfo.renderArea.extent.width = 100;
17855 rpbinfo.renderArea.extent.height = 100;
17856 rpbinfo.renderArea.offset.x = 0;
17857 rpbinfo.renderArea.offset.y = 0;
17858 rpbinfo.framebuffer = fb;
17859
17860 VkFence fence = {};
17861 VkFenceCreateInfo fence_ci = {};
17862 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
17863 fence_ci.pNext = nullptr;
17864 fence_ci.flags = 0;
17865 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
17866 ASSERT_VK_SUCCESS(result);
17867
17868 m_commandBuffer->BeginCommandBuffer();
17869 m_commandBuffer->BeginRenderPass(rpbinfo);
17870 m_commandBuffer->EndRenderPass();
17871 m_commandBuffer->EndCommandBuffer();
17872 m_commandBuffer->QueueCommandBuffer(fence);
17873
17874 VkImageObj destImage(m_device);
17875 destImage.init(100, 100, depth_stencil_fmt, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17876 VK_IMAGE_TILING_OPTIMAL, 0);
17877 VkImageMemoryBarrier barrier = {};
17878 VkImageSubresourceRange range;
17879 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17880 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
17881 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
17882 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17883 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
17884 barrier.image = m_depthStencil->handle();
17885 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17886 range.baseMipLevel = 0;
17887 range.levelCount = 1;
17888 range.baseArrayLayer = 0;
17889 range.layerCount = 1;
17890 barrier.subresourceRange = range;
17891 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
17892 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
17893 cmdbuf.BeginCommandBuffer();
17894 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
17895 &barrier);
17896 barrier.srcAccessMask = 0;
17897 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17898 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
17899 barrier.image = destImage.handle();
17900 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
17901 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
17902 &barrier);
17903 VkImageCopy cregion;
17904 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17905 cregion.srcSubresource.mipLevel = 0;
17906 cregion.srcSubresource.baseArrayLayer = 0;
17907 cregion.srcSubresource.layerCount = 1;
17908 cregion.srcOffset.x = 0;
17909 cregion.srcOffset.y = 0;
17910 cregion.srcOffset.z = 0;
17911 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17912 cregion.dstSubresource.mipLevel = 0;
17913 cregion.dstSubresource.baseArrayLayer = 0;
17914 cregion.dstSubresource.layerCount = 1;
17915 cregion.dstOffset.x = 0;
17916 cregion.dstOffset.y = 0;
17917 cregion.dstOffset.z = 0;
17918 cregion.extent.width = 100;
17919 cregion.extent.height = 100;
17920 cregion.extent.depth = 1;
17921 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
17922 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
17923 cmdbuf.EndCommandBuffer();
17924
17925 VkSubmitInfo submit_info;
17926 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17927 submit_info.pNext = NULL;
17928 submit_info.waitSemaphoreCount = 0;
17929 submit_info.pWaitSemaphores = NULL;
17930 submit_info.pWaitDstStageMask = NULL;
17931 submit_info.commandBufferCount = 1;
17932 submit_info.pCommandBuffers = &cmdbuf.handle();
17933 submit_info.signalSemaphoreCount = 0;
17934 submit_info.pSignalSemaphores = NULL;
17935
17936 m_errorMonitor->ExpectSuccess();
17937 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
17938 m_errorMonitor->VerifyNotFound();
17939
17940 vkQueueWaitIdle(m_device->m_queue);
17941 vkDestroyFence(m_device->device(), fence, nullptr);
17942 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17943 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17944}
17945
17946// This is a positive test. No errors should be generated.
17947TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
17948 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
17949
17950 m_errorMonitor->ExpectSuccess();
17951 ASSERT_NO_FATAL_FAILURE(InitState());
17952
17953 VkEvent event;
17954 VkEventCreateInfo event_create_info{};
17955 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
17956 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
17957
17958 VkCommandPool command_pool;
17959 VkCommandPoolCreateInfo pool_create_info{};
17960 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17961 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17962 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17963 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17964
17965 VkCommandBuffer command_buffer;
17966 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17967 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17968 command_buffer_allocate_info.commandPool = command_pool;
17969 command_buffer_allocate_info.commandBufferCount = 1;
17970 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17971 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
17972
17973 VkQueue queue = VK_NULL_HANDLE;
17974 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
17975
17976 {
17977 VkCommandBufferBeginInfo begin_info{};
17978 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17979 vkBeginCommandBuffer(command_buffer, &begin_info);
17980
17981 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
17982 nullptr, 0, nullptr);
17983 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
17984 vkEndCommandBuffer(command_buffer);
17985 }
17986 {
17987 VkSubmitInfo submit_info{};
17988 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17989 submit_info.commandBufferCount = 1;
17990 submit_info.pCommandBuffers = &command_buffer;
17991 submit_info.signalSemaphoreCount = 0;
17992 submit_info.pSignalSemaphores = nullptr;
17993 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
17994 }
17995 { vkSetEvent(m_device->device(), event); }
17996
17997 vkQueueWaitIdle(queue);
17998
17999 vkDestroyEvent(m_device->device(), event, nullptr);
18000 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
18001 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18002
18003 m_errorMonitor->VerifyNotFound();
18004}
18005// This is a positive test. No errors should be generated.
18006TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
18007 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
18008
18009 ASSERT_NO_FATAL_FAILURE(InitState());
18010 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18011 return;
18012
18013 m_errorMonitor->ExpectSuccess();
18014
18015 VkQueryPool query_pool;
18016 VkQueryPoolCreateInfo query_pool_create_info{};
18017 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
18018 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
18019 query_pool_create_info.queryCount = 1;
18020 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
18021
18022 VkCommandPool command_pool;
18023 VkCommandPoolCreateInfo pool_create_info{};
18024 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18025 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18026 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18027 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18028
18029 VkCommandBuffer command_buffer;
18030 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18031 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18032 command_buffer_allocate_info.commandPool = command_pool;
18033 command_buffer_allocate_info.commandBufferCount = 1;
18034 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18035 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
18036
18037 VkCommandBuffer secondary_command_buffer;
18038 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18039 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
18040
18041 VkQueue queue = VK_NULL_HANDLE;
18042 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18043
18044 uint32_t qfi = 0;
18045 VkBufferCreateInfo buff_create_info = {};
18046 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18047 buff_create_info.size = 1024;
18048 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
18049 buff_create_info.queueFamilyIndexCount = 1;
18050 buff_create_info.pQueueFamilyIndices = &qfi;
18051
18052 VkResult err;
18053 VkBuffer buffer;
18054 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
18055 ASSERT_VK_SUCCESS(err);
18056 VkMemoryAllocateInfo mem_alloc = {};
18057 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18058 mem_alloc.pNext = NULL;
18059 mem_alloc.allocationSize = 1024;
18060 mem_alloc.memoryTypeIndex = 0;
18061
18062 VkMemoryRequirements memReqs;
18063 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
18064 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
18065 if (!pass) {
18066 vkDestroyBuffer(m_device->device(), buffer, NULL);
18067 return;
18068 }
18069
18070 VkDeviceMemory mem;
18071 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
18072 ASSERT_VK_SUCCESS(err);
18073 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
18074 ASSERT_VK_SUCCESS(err);
18075
18076 VkCommandBufferInheritanceInfo hinfo = {};
18077 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18078 hinfo.renderPass = VK_NULL_HANDLE;
18079 hinfo.subpass = 0;
18080 hinfo.framebuffer = VK_NULL_HANDLE;
18081 hinfo.occlusionQueryEnable = VK_FALSE;
18082 hinfo.queryFlags = 0;
18083 hinfo.pipelineStatistics = 0;
18084
18085 {
18086 VkCommandBufferBeginInfo begin_info{};
18087 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18088 begin_info.pInheritanceInfo = &hinfo;
18089 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
18090
18091 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
18092 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
18093
18094 vkEndCommandBuffer(secondary_command_buffer);
18095
18096 begin_info.pInheritanceInfo = nullptr;
18097 vkBeginCommandBuffer(command_buffer, &begin_info);
18098
18099 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
18100 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
18101
18102 vkEndCommandBuffer(command_buffer);
18103 }
18104 {
18105 VkSubmitInfo submit_info{};
18106 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18107 submit_info.commandBufferCount = 1;
18108 submit_info.pCommandBuffers = &command_buffer;
18109 submit_info.signalSemaphoreCount = 0;
18110 submit_info.pSignalSemaphores = nullptr;
18111 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18112 }
18113
18114 vkQueueWaitIdle(queue);
18115
18116 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
18117 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
18118 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
18119 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18120 vkDestroyBuffer(m_device->device(), buffer, NULL);
18121 vkFreeMemory(m_device->device(), mem, NULL);
18122
18123 m_errorMonitor->VerifyNotFound();
18124}
18125
18126// This is a positive test. No errors should be generated.
18127TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
18128 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
18129
18130 ASSERT_NO_FATAL_FAILURE(InitState());
18131 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18132 return;
18133
18134 m_errorMonitor->ExpectSuccess();
18135
18136 VkQueryPool query_pool;
18137 VkQueryPoolCreateInfo query_pool_create_info{};
18138 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
18139 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
18140 query_pool_create_info.queryCount = 1;
18141 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
18142
18143 VkCommandPool command_pool;
18144 VkCommandPoolCreateInfo pool_create_info{};
18145 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18146 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18147 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18148 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18149
18150 VkCommandBuffer command_buffer[2];
18151 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18152 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18153 command_buffer_allocate_info.commandPool = command_pool;
18154 command_buffer_allocate_info.commandBufferCount = 2;
18155 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18156 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18157
18158 VkQueue queue = VK_NULL_HANDLE;
18159 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18160
18161 uint32_t qfi = 0;
18162 VkBufferCreateInfo buff_create_info = {};
18163 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18164 buff_create_info.size = 1024;
18165 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
18166 buff_create_info.queueFamilyIndexCount = 1;
18167 buff_create_info.pQueueFamilyIndices = &qfi;
18168
18169 VkResult err;
18170 VkBuffer buffer;
18171 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
18172 ASSERT_VK_SUCCESS(err);
18173 VkMemoryAllocateInfo mem_alloc = {};
18174 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18175 mem_alloc.pNext = NULL;
18176 mem_alloc.allocationSize = 1024;
18177 mem_alloc.memoryTypeIndex = 0;
18178
18179 VkMemoryRequirements memReqs;
18180 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
18181 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
18182 if (!pass) {
18183 vkDestroyBuffer(m_device->device(), buffer, NULL);
18184 return;
18185 }
18186
18187 VkDeviceMemory mem;
18188 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
18189 ASSERT_VK_SUCCESS(err);
18190 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
18191 ASSERT_VK_SUCCESS(err);
18192
18193 {
18194 VkCommandBufferBeginInfo begin_info{};
18195 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18196 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18197
18198 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
18199 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
18200
18201 vkEndCommandBuffer(command_buffer[0]);
18202
18203 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18204
18205 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
18206
18207 vkEndCommandBuffer(command_buffer[1]);
18208 }
18209 {
18210 VkSubmitInfo submit_info{};
18211 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18212 submit_info.commandBufferCount = 2;
18213 submit_info.pCommandBuffers = command_buffer;
18214 submit_info.signalSemaphoreCount = 0;
18215 submit_info.pSignalSemaphores = nullptr;
18216 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18217 }
18218
18219 vkQueueWaitIdle(queue);
18220
18221 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
18222 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
18223 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18224 vkDestroyBuffer(m_device->device(), buffer, NULL);
18225 vkFreeMemory(m_device->device(), mem, NULL);
18226
18227 m_errorMonitor->VerifyNotFound();
18228}
18229
Tony Barbourc46924f2016-11-04 11:49:52 -060018230TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018231 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
18232
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018233 ASSERT_NO_FATAL_FAILURE(InitState());
18234 VkEvent event;
18235 VkEventCreateInfo event_create_info{};
18236 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
18237 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
18238
18239 VkCommandPool command_pool;
18240 VkCommandPoolCreateInfo pool_create_info{};
18241 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18242 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18243 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18244 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18245
18246 VkCommandBuffer command_buffer;
18247 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18248 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18249 command_buffer_allocate_info.commandPool = command_pool;
18250 command_buffer_allocate_info.commandBufferCount = 1;
18251 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18252 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
18253
18254 VkQueue queue = VK_NULL_HANDLE;
18255 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
18256
18257 {
18258 VkCommandBufferBeginInfo begin_info{};
18259 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18260 vkBeginCommandBuffer(command_buffer, &begin_info);
18261
18262 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018263 vkEndCommandBuffer(command_buffer);
18264 }
18265 {
18266 VkSubmitInfo submit_info{};
18267 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18268 submit_info.commandBufferCount = 1;
18269 submit_info.pCommandBuffers = &command_buffer;
18270 submit_info.signalSemaphoreCount = 0;
18271 submit_info.pSignalSemaphores = nullptr;
18272 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18273 }
18274 {
18275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is already in use by a "
18276 "command buffer.");
18277 vkSetEvent(m_device->device(), event);
18278 m_errorMonitor->VerifyFound();
18279 }
18280
18281 vkQueueWaitIdle(queue);
18282
18283 vkDestroyEvent(m_device->device(), event, nullptr);
18284 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
18285 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18286}
18287
18288// This is a positive test. No errors should be generated.
18289TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
18290 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
18291 "run through a Submit & WaitForFences cycle 3 times. This "
18292 "previously revealed a bug so running this positive test "
18293 "to prevent a regression.");
18294 m_errorMonitor->ExpectSuccess();
18295
18296 ASSERT_NO_FATAL_FAILURE(InitState());
18297 VkQueue queue = VK_NULL_HANDLE;
18298 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
18299
18300 static const uint32_t NUM_OBJECTS = 2;
18301 static const uint32_t NUM_FRAMES = 3;
18302 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
18303 VkFence fences[NUM_OBJECTS] = {};
18304
18305 VkCommandPool cmd_pool;
18306 VkCommandPoolCreateInfo cmd_pool_ci = {};
18307 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18308 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
18309 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18310 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
18311 ASSERT_VK_SUCCESS(err);
18312
18313 VkCommandBufferAllocateInfo cmd_buf_info = {};
18314 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18315 cmd_buf_info.commandPool = cmd_pool;
18316 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18317 cmd_buf_info.commandBufferCount = 1;
18318
18319 VkFenceCreateInfo fence_ci = {};
18320 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18321 fence_ci.pNext = nullptr;
18322 fence_ci.flags = 0;
18323
18324 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
18325 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
18326 ASSERT_VK_SUCCESS(err);
18327 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
18328 ASSERT_VK_SUCCESS(err);
18329 }
18330
18331 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
18332 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
18333 // Create empty cmd buffer
18334 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
18335 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18336
18337 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
18338 ASSERT_VK_SUCCESS(err);
18339 err = vkEndCommandBuffer(cmd_buffers[obj]);
18340 ASSERT_VK_SUCCESS(err);
18341
18342 VkSubmitInfo submit_info = {};
18343 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18344 submit_info.commandBufferCount = 1;
18345 submit_info.pCommandBuffers = &cmd_buffers[obj];
18346 // Submit cmd buffer and wait for fence
18347 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
18348 ASSERT_VK_SUCCESS(err);
18349 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
18350 ASSERT_VK_SUCCESS(err);
18351 err = vkResetFences(m_device->device(), 1, &fences[obj]);
18352 ASSERT_VK_SUCCESS(err);
18353 }
18354 }
18355 m_errorMonitor->VerifyNotFound();
18356 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
18357 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
18358 vkDestroyFence(m_device->device(), fences[i], nullptr);
18359 }
18360}
18361// This is a positive test. No errors should be generated.
18362TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
18363
18364 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18365 "submitted on separate queues followed by a QueueWaitIdle.");
18366
18367 ASSERT_NO_FATAL_FAILURE(InitState());
18368 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18369 return;
18370
18371 m_errorMonitor->ExpectSuccess();
18372
18373 VkSemaphore semaphore;
18374 VkSemaphoreCreateInfo semaphore_create_info{};
18375 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18376 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18377
18378 VkCommandPool command_pool;
18379 VkCommandPoolCreateInfo pool_create_info{};
18380 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18381 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18382 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18383 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18384
18385 VkCommandBuffer command_buffer[2];
18386 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18387 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18388 command_buffer_allocate_info.commandPool = command_pool;
18389 command_buffer_allocate_info.commandBufferCount = 2;
18390 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18391 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18392
18393 VkQueue queue = VK_NULL_HANDLE;
18394 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18395
18396 {
18397 VkCommandBufferBeginInfo begin_info{};
18398 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18399 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18400
18401 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18402 nullptr, 0, nullptr, 0, nullptr);
18403
18404 VkViewport viewport{};
18405 viewport.maxDepth = 1.0f;
18406 viewport.minDepth = 0.0f;
18407 viewport.width = 512;
18408 viewport.height = 512;
18409 viewport.x = 0;
18410 viewport.y = 0;
18411 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18412 vkEndCommandBuffer(command_buffer[0]);
18413 }
18414 {
18415 VkCommandBufferBeginInfo begin_info{};
18416 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18417 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18418
18419 VkViewport viewport{};
18420 viewport.maxDepth = 1.0f;
18421 viewport.minDepth = 0.0f;
18422 viewport.width = 512;
18423 viewport.height = 512;
18424 viewport.x = 0;
18425 viewport.y = 0;
18426 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18427 vkEndCommandBuffer(command_buffer[1]);
18428 }
18429 {
18430 VkSubmitInfo submit_info{};
18431 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18432 submit_info.commandBufferCount = 1;
18433 submit_info.pCommandBuffers = &command_buffer[0];
18434 submit_info.signalSemaphoreCount = 1;
18435 submit_info.pSignalSemaphores = &semaphore;
18436 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18437 }
18438 {
18439 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18440 VkSubmitInfo submit_info{};
18441 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18442 submit_info.commandBufferCount = 1;
18443 submit_info.pCommandBuffers = &command_buffer[1];
18444 submit_info.waitSemaphoreCount = 1;
18445 submit_info.pWaitSemaphores = &semaphore;
18446 submit_info.pWaitDstStageMask = flags;
18447 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18448 }
18449
18450 vkQueueWaitIdle(m_device->m_queue);
18451
18452 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18453 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18454 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18455
18456 m_errorMonitor->VerifyNotFound();
18457}
18458
18459// This is a positive test. No errors should be generated.
18460TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
18461
18462 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18463 "submitted on separate queues, the second having a fence"
18464 "followed by a QueueWaitIdle.");
18465
18466 ASSERT_NO_FATAL_FAILURE(InitState());
18467 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18468 return;
18469
18470 m_errorMonitor->ExpectSuccess();
18471
18472 VkFence fence;
18473 VkFenceCreateInfo fence_create_info{};
18474 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18475 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18476
18477 VkSemaphore semaphore;
18478 VkSemaphoreCreateInfo semaphore_create_info{};
18479 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18480 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18481
18482 VkCommandPool command_pool;
18483 VkCommandPoolCreateInfo pool_create_info{};
18484 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18485 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18486 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18487 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18488
18489 VkCommandBuffer command_buffer[2];
18490 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18491 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18492 command_buffer_allocate_info.commandPool = command_pool;
18493 command_buffer_allocate_info.commandBufferCount = 2;
18494 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18495 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18496
18497 VkQueue queue = VK_NULL_HANDLE;
18498 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18499
18500 {
18501 VkCommandBufferBeginInfo begin_info{};
18502 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18503 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18504
18505 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18506 nullptr, 0, nullptr, 0, nullptr);
18507
18508 VkViewport viewport{};
18509 viewport.maxDepth = 1.0f;
18510 viewport.minDepth = 0.0f;
18511 viewport.width = 512;
18512 viewport.height = 512;
18513 viewport.x = 0;
18514 viewport.y = 0;
18515 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18516 vkEndCommandBuffer(command_buffer[0]);
18517 }
18518 {
18519 VkCommandBufferBeginInfo begin_info{};
18520 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18521 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18522
18523 VkViewport viewport{};
18524 viewport.maxDepth = 1.0f;
18525 viewport.minDepth = 0.0f;
18526 viewport.width = 512;
18527 viewport.height = 512;
18528 viewport.x = 0;
18529 viewport.y = 0;
18530 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18531 vkEndCommandBuffer(command_buffer[1]);
18532 }
18533 {
18534 VkSubmitInfo submit_info{};
18535 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18536 submit_info.commandBufferCount = 1;
18537 submit_info.pCommandBuffers = &command_buffer[0];
18538 submit_info.signalSemaphoreCount = 1;
18539 submit_info.pSignalSemaphores = &semaphore;
18540 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18541 }
18542 {
18543 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18544 VkSubmitInfo submit_info{};
18545 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18546 submit_info.commandBufferCount = 1;
18547 submit_info.pCommandBuffers = &command_buffer[1];
18548 submit_info.waitSemaphoreCount = 1;
18549 submit_info.pWaitSemaphores = &semaphore;
18550 submit_info.pWaitDstStageMask = flags;
18551 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18552 }
18553
18554 vkQueueWaitIdle(m_device->m_queue);
18555
18556 vkDestroyFence(m_device->device(), fence, nullptr);
18557 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18558 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18559 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18560
18561 m_errorMonitor->VerifyNotFound();
18562}
18563
18564// This is a positive test. No errors should be generated.
18565TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
18566
18567 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18568 "submitted on separate queues, the second having a fence"
18569 "followed by two consecutive WaitForFences calls on the same fence.");
18570
18571 ASSERT_NO_FATAL_FAILURE(InitState());
18572 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18573 return;
18574
18575 m_errorMonitor->ExpectSuccess();
18576
18577 VkFence fence;
18578 VkFenceCreateInfo fence_create_info{};
18579 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18580 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18581
18582 VkSemaphore semaphore;
18583 VkSemaphoreCreateInfo semaphore_create_info{};
18584 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18585 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18586
18587 VkCommandPool command_pool;
18588 VkCommandPoolCreateInfo pool_create_info{};
18589 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18590 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18591 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18592 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18593
18594 VkCommandBuffer command_buffer[2];
18595 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18596 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18597 command_buffer_allocate_info.commandPool = command_pool;
18598 command_buffer_allocate_info.commandBufferCount = 2;
18599 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18600 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18601
18602 VkQueue queue = VK_NULL_HANDLE;
18603 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18604
18605 {
18606 VkCommandBufferBeginInfo begin_info{};
18607 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18608 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18609
18610 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18611 nullptr, 0, nullptr, 0, nullptr);
18612
18613 VkViewport viewport{};
18614 viewport.maxDepth = 1.0f;
18615 viewport.minDepth = 0.0f;
18616 viewport.width = 512;
18617 viewport.height = 512;
18618 viewport.x = 0;
18619 viewport.y = 0;
18620 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18621 vkEndCommandBuffer(command_buffer[0]);
18622 }
18623 {
18624 VkCommandBufferBeginInfo begin_info{};
18625 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18626 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18627
18628 VkViewport viewport{};
18629 viewport.maxDepth = 1.0f;
18630 viewport.minDepth = 0.0f;
18631 viewport.width = 512;
18632 viewport.height = 512;
18633 viewport.x = 0;
18634 viewport.y = 0;
18635 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18636 vkEndCommandBuffer(command_buffer[1]);
18637 }
18638 {
18639 VkSubmitInfo submit_info{};
18640 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18641 submit_info.commandBufferCount = 1;
18642 submit_info.pCommandBuffers = &command_buffer[0];
18643 submit_info.signalSemaphoreCount = 1;
18644 submit_info.pSignalSemaphores = &semaphore;
18645 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18646 }
18647 {
18648 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18649 VkSubmitInfo submit_info{};
18650 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18651 submit_info.commandBufferCount = 1;
18652 submit_info.pCommandBuffers = &command_buffer[1];
18653 submit_info.waitSemaphoreCount = 1;
18654 submit_info.pWaitSemaphores = &semaphore;
18655 submit_info.pWaitDstStageMask = flags;
18656 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18657 }
18658
18659 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18660 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18661
18662 vkDestroyFence(m_device->device(), fence, nullptr);
18663 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18664 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18665 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18666
18667 m_errorMonitor->VerifyNotFound();
18668}
18669
18670TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
18671
18672 ASSERT_NO_FATAL_FAILURE(InitState());
18673 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
18674 printf("Test requires two queues, skipping\n");
18675 return;
18676 }
18677
18678 VkResult err;
18679
18680 m_errorMonitor->ExpectSuccess();
18681
18682 VkQueue q0 = m_device->m_queue;
18683 VkQueue q1 = nullptr;
18684 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
18685 ASSERT_NE(q1, nullptr);
18686
18687 // An (empty) command buffer. We must have work in the first submission --
18688 // the layer treats unfenced work differently from fenced work.
18689 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
18690 VkCommandPool pool;
18691 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
18692 ASSERT_VK_SUCCESS(err);
18693 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
18694 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1 };
18695 VkCommandBuffer cb;
18696 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
18697 ASSERT_VK_SUCCESS(err);
18698 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr };
18699 err = vkBeginCommandBuffer(cb, &cbbi);
18700 ASSERT_VK_SUCCESS(err);
18701 err = vkEndCommandBuffer(cb);
18702 ASSERT_VK_SUCCESS(err);
18703
18704 // A semaphore
18705 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
18706 VkSemaphore s;
18707 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
18708 ASSERT_VK_SUCCESS(err);
18709
18710 // First submission, to q0
18711 VkSubmitInfo s0 = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s };
18712
18713 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
18714 ASSERT_VK_SUCCESS(err);
18715
18716 // Second submission, to q1, waiting on s
18717 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
18718 VkSubmitInfo s1 = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr };
18719
18720 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
18721 ASSERT_VK_SUCCESS(err);
18722
18723 // Wait for q0 idle
18724 err = vkQueueWaitIdle(q0);
18725 ASSERT_VK_SUCCESS(err);
18726
18727 // Command buffer should have been completed (it was on q0); reset the pool.
18728 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
18729
18730 m_errorMonitor->VerifyNotFound();
18731
18732 // Force device completely idle and clean up resources
18733 vkDeviceWaitIdle(m_device->device());
18734 vkDestroyCommandPool(m_device->device(), pool, nullptr);
18735 vkDestroySemaphore(m_device->device(), s, nullptr);
18736}
18737
18738// This is a positive test. No errors should be generated.
18739TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
18740
18741 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18742 "submitted on separate queues, the second having a fence, "
18743 "followed by a WaitForFences call.");
18744
18745 ASSERT_NO_FATAL_FAILURE(InitState());
18746 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18747 return;
18748
18749 m_errorMonitor->ExpectSuccess();
18750
18751 ASSERT_NO_FATAL_FAILURE(InitState());
18752 VkFence fence;
18753 VkFenceCreateInfo fence_create_info{};
18754 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18755 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18756
18757 VkSemaphore semaphore;
18758 VkSemaphoreCreateInfo semaphore_create_info{};
18759 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18760 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18761
18762 VkCommandPool command_pool;
18763 VkCommandPoolCreateInfo pool_create_info{};
18764 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18765 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18766 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18767 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18768
18769 VkCommandBuffer command_buffer[2];
18770 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18771 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18772 command_buffer_allocate_info.commandPool = command_pool;
18773 command_buffer_allocate_info.commandBufferCount = 2;
18774 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18775 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18776
18777 VkQueue queue = VK_NULL_HANDLE;
18778 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18779
18780 {
18781 VkCommandBufferBeginInfo begin_info{};
18782 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18783 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18784
18785 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18786 nullptr, 0, nullptr, 0, nullptr);
18787
18788 VkViewport viewport{};
18789 viewport.maxDepth = 1.0f;
18790 viewport.minDepth = 0.0f;
18791 viewport.width = 512;
18792 viewport.height = 512;
18793 viewport.x = 0;
18794 viewport.y = 0;
18795 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18796 vkEndCommandBuffer(command_buffer[0]);
18797 }
18798 {
18799 VkCommandBufferBeginInfo begin_info{};
18800 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18801 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18802
18803 VkViewport viewport{};
18804 viewport.maxDepth = 1.0f;
18805 viewport.minDepth = 0.0f;
18806 viewport.width = 512;
18807 viewport.height = 512;
18808 viewport.x = 0;
18809 viewport.y = 0;
18810 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18811 vkEndCommandBuffer(command_buffer[1]);
18812 }
18813 {
18814 VkSubmitInfo submit_info{};
18815 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18816 submit_info.commandBufferCount = 1;
18817 submit_info.pCommandBuffers = &command_buffer[0];
18818 submit_info.signalSemaphoreCount = 1;
18819 submit_info.pSignalSemaphores = &semaphore;
18820 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18821 }
18822 {
18823 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18824 VkSubmitInfo submit_info{};
18825 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18826 submit_info.commandBufferCount = 1;
18827 submit_info.pCommandBuffers = &command_buffer[1];
18828 submit_info.waitSemaphoreCount = 1;
18829 submit_info.pWaitSemaphores = &semaphore;
18830 submit_info.pWaitDstStageMask = flags;
18831 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18832 }
18833
18834 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18835
18836 vkDestroyFence(m_device->device(), fence, nullptr);
18837 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18838 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18839 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18840
18841 m_errorMonitor->VerifyNotFound();
18842}
18843
18844// This is a positive test. No errors should be generated.
18845TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
18846
18847 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18848 "on the same queue, sharing a signal/wait semaphore, the "
18849 "second having a fence, "
18850 "followed by a WaitForFences call.");
18851
18852 m_errorMonitor->ExpectSuccess();
18853
18854 ASSERT_NO_FATAL_FAILURE(InitState());
18855 VkFence fence;
18856 VkFenceCreateInfo fence_create_info{};
18857 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18858 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18859
18860 VkSemaphore semaphore;
18861 VkSemaphoreCreateInfo semaphore_create_info{};
18862 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18863 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18864
18865 VkCommandPool command_pool;
18866 VkCommandPoolCreateInfo pool_create_info{};
18867 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18868 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18869 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18870 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18871
18872 VkCommandBuffer command_buffer[2];
18873 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18874 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18875 command_buffer_allocate_info.commandPool = command_pool;
18876 command_buffer_allocate_info.commandBufferCount = 2;
18877 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18878 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18879
18880 {
18881 VkCommandBufferBeginInfo begin_info{};
18882 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18883 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18884
18885 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18886 nullptr, 0, nullptr, 0, nullptr);
18887
18888 VkViewport viewport{};
18889 viewport.maxDepth = 1.0f;
18890 viewport.minDepth = 0.0f;
18891 viewport.width = 512;
18892 viewport.height = 512;
18893 viewport.x = 0;
18894 viewport.y = 0;
18895 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18896 vkEndCommandBuffer(command_buffer[0]);
18897 }
18898 {
18899 VkCommandBufferBeginInfo begin_info{};
18900 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18901 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18902
18903 VkViewport viewport{};
18904 viewport.maxDepth = 1.0f;
18905 viewport.minDepth = 0.0f;
18906 viewport.width = 512;
18907 viewport.height = 512;
18908 viewport.x = 0;
18909 viewport.y = 0;
18910 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18911 vkEndCommandBuffer(command_buffer[1]);
18912 }
18913 {
18914 VkSubmitInfo submit_info{};
18915 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18916 submit_info.commandBufferCount = 1;
18917 submit_info.pCommandBuffers = &command_buffer[0];
18918 submit_info.signalSemaphoreCount = 1;
18919 submit_info.pSignalSemaphores = &semaphore;
18920 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18921 }
18922 {
18923 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18924 VkSubmitInfo submit_info{};
18925 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18926 submit_info.commandBufferCount = 1;
18927 submit_info.pCommandBuffers = &command_buffer[1];
18928 submit_info.waitSemaphoreCount = 1;
18929 submit_info.pWaitSemaphores = &semaphore;
18930 submit_info.pWaitDstStageMask = flags;
18931 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18932 }
18933
18934 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18935
18936 vkDestroyFence(m_device->device(), fence, nullptr);
18937 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18938 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18939 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18940
18941 m_errorMonitor->VerifyNotFound();
18942}
18943
18944// This is a positive test. No errors should be generated.
18945TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
18946
18947 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18948 "on the same queue, no fences, followed by a third QueueSubmit with NO "
18949 "SubmitInfos but with a fence, followed by a WaitForFences call.");
18950
18951 m_errorMonitor->ExpectSuccess();
18952
18953 ASSERT_NO_FATAL_FAILURE(InitState());
18954 VkFence fence;
18955 VkFenceCreateInfo fence_create_info{};
18956 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18957 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18958
18959 VkCommandPool command_pool;
18960 VkCommandPoolCreateInfo pool_create_info{};
18961 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18962 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18963 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18964 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18965
18966 VkCommandBuffer command_buffer[2];
18967 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18968 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18969 command_buffer_allocate_info.commandPool = command_pool;
18970 command_buffer_allocate_info.commandBufferCount = 2;
18971 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18972 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18973
18974 {
18975 VkCommandBufferBeginInfo begin_info{};
18976 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18977 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18978
18979 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18980 nullptr, 0, nullptr, 0, nullptr);
18981
18982 VkViewport viewport{};
18983 viewport.maxDepth = 1.0f;
18984 viewport.minDepth = 0.0f;
18985 viewport.width = 512;
18986 viewport.height = 512;
18987 viewport.x = 0;
18988 viewport.y = 0;
18989 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18990 vkEndCommandBuffer(command_buffer[0]);
18991 }
18992 {
18993 VkCommandBufferBeginInfo begin_info{};
18994 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18995 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18996
18997 VkViewport viewport{};
18998 viewport.maxDepth = 1.0f;
18999 viewport.minDepth = 0.0f;
19000 viewport.width = 512;
19001 viewport.height = 512;
19002 viewport.x = 0;
19003 viewport.y = 0;
19004 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19005 vkEndCommandBuffer(command_buffer[1]);
19006 }
19007 {
19008 VkSubmitInfo submit_info{};
19009 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19010 submit_info.commandBufferCount = 1;
19011 submit_info.pCommandBuffers = &command_buffer[0];
19012 submit_info.signalSemaphoreCount = 0;
19013 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
19014 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19015 }
19016 {
19017 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
19018 VkSubmitInfo submit_info{};
19019 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19020 submit_info.commandBufferCount = 1;
19021 submit_info.pCommandBuffers = &command_buffer[1];
19022 submit_info.waitSemaphoreCount = 0;
19023 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
19024 submit_info.pWaitDstStageMask = flags;
19025 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19026 }
19027
19028 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
19029
19030 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19031 ASSERT_VK_SUCCESS(err);
19032
19033 vkDestroyFence(m_device->device(), fence, nullptr);
19034 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19035 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19036
19037 m_errorMonitor->VerifyNotFound();
19038}
19039
19040// This is a positive test. No errors should be generated.
19041TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
19042
19043 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
19044 "on the same queue, the second having a fence, followed "
19045 "by a WaitForFences call.");
19046
19047 m_errorMonitor->ExpectSuccess();
19048
19049 ASSERT_NO_FATAL_FAILURE(InitState());
19050 VkFence fence;
19051 VkFenceCreateInfo fence_create_info{};
19052 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19053 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19054
19055 VkCommandPool command_pool;
19056 VkCommandPoolCreateInfo pool_create_info{};
19057 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19058 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19059 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19060 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19061
19062 VkCommandBuffer command_buffer[2];
19063 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19064 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19065 command_buffer_allocate_info.commandPool = command_pool;
19066 command_buffer_allocate_info.commandBufferCount = 2;
19067 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19068 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19069
19070 {
19071 VkCommandBufferBeginInfo begin_info{};
19072 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19073 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19074
19075 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
19076 nullptr, 0, nullptr, 0, nullptr);
19077
19078 VkViewport viewport{};
19079 viewport.maxDepth = 1.0f;
19080 viewport.minDepth = 0.0f;
19081 viewport.width = 512;
19082 viewport.height = 512;
19083 viewport.x = 0;
19084 viewport.y = 0;
19085 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19086 vkEndCommandBuffer(command_buffer[0]);
19087 }
19088 {
19089 VkCommandBufferBeginInfo begin_info{};
19090 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19091 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19092
19093 VkViewport viewport{};
19094 viewport.maxDepth = 1.0f;
19095 viewport.minDepth = 0.0f;
19096 viewport.width = 512;
19097 viewport.height = 512;
19098 viewport.x = 0;
19099 viewport.y = 0;
19100 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19101 vkEndCommandBuffer(command_buffer[1]);
19102 }
19103 {
19104 VkSubmitInfo submit_info{};
19105 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19106 submit_info.commandBufferCount = 1;
19107 submit_info.pCommandBuffers = &command_buffer[0];
19108 submit_info.signalSemaphoreCount = 0;
19109 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
19110 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19111 }
19112 {
19113 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
19114 VkSubmitInfo submit_info{};
19115 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19116 submit_info.commandBufferCount = 1;
19117 submit_info.pCommandBuffers = &command_buffer[1];
19118 submit_info.waitSemaphoreCount = 0;
19119 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
19120 submit_info.pWaitDstStageMask = flags;
19121 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19122 }
19123
19124 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19125
19126 vkDestroyFence(m_device->device(), fence, nullptr);
19127 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19128 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19129
19130 m_errorMonitor->VerifyNotFound();
19131}
19132
19133// This is a positive test. No errors should be generated.
19134TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
19135
19136 TEST_DESCRIPTION("Two command buffers each in a separate SubmitInfo sent in a single "
19137 "QueueSubmit call followed by a WaitForFences call.");
19138 ASSERT_NO_FATAL_FAILURE(InitState());
19139
19140 m_errorMonitor->ExpectSuccess();
19141
19142 VkFence fence;
19143 VkFenceCreateInfo fence_create_info{};
19144 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19145 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19146
19147 VkSemaphore semaphore;
19148 VkSemaphoreCreateInfo semaphore_create_info{};
19149 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19150 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19151
19152 VkCommandPool command_pool;
19153 VkCommandPoolCreateInfo pool_create_info{};
19154 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19155 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19156 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19157 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19158
19159 VkCommandBuffer command_buffer[2];
19160 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19161 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19162 command_buffer_allocate_info.commandPool = command_pool;
19163 command_buffer_allocate_info.commandBufferCount = 2;
19164 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19165 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19166
19167 {
19168 VkCommandBufferBeginInfo begin_info{};
19169 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19170 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19171
19172 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
19173 nullptr, 0, nullptr, 0, nullptr);
19174
19175 VkViewport viewport{};
19176 viewport.maxDepth = 1.0f;
19177 viewport.minDepth = 0.0f;
19178 viewport.width = 512;
19179 viewport.height = 512;
19180 viewport.x = 0;
19181 viewport.y = 0;
19182 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19183 vkEndCommandBuffer(command_buffer[0]);
19184 }
19185 {
19186 VkCommandBufferBeginInfo begin_info{};
19187 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19188 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19189
19190 VkViewport viewport{};
19191 viewport.maxDepth = 1.0f;
19192 viewport.minDepth = 0.0f;
19193 viewport.width = 512;
19194 viewport.height = 512;
19195 viewport.x = 0;
19196 viewport.y = 0;
19197 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19198 vkEndCommandBuffer(command_buffer[1]);
19199 }
19200 {
19201 VkSubmitInfo submit_info[2];
19202 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
19203
19204 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19205 submit_info[0].pNext = NULL;
19206 submit_info[0].commandBufferCount = 1;
19207 submit_info[0].pCommandBuffers = &command_buffer[0];
19208 submit_info[0].signalSemaphoreCount = 1;
19209 submit_info[0].pSignalSemaphores = &semaphore;
19210 submit_info[0].waitSemaphoreCount = 0;
19211 submit_info[0].pWaitSemaphores = NULL;
19212 submit_info[0].pWaitDstStageMask = 0;
19213
19214 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19215 submit_info[1].pNext = NULL;
19216 submit_info[1].commandBufferCount = 1;
19217 submit_info[1].pCommandBuffers = &command_buffer[1];
19218 submit_info[1].waitSemaphoreCount = 1;
19219 submit_info[1].pWaitSemaphores = &semaphore;
19220 submit_info[1].pWaitDstStageMask = flags;
19221 submit_info[1].signalSemaphoreCount = 0;
19222 submit_info[1].pSignalSemaphores = NULL;
19223 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
19224 }
19225
19226 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19227
19228 vkDestroyFence(m_device->device(), fence, nullptr);
19229 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19230 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19231 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19232
19233 m_errorMonitor->VerifyNotFound();
19234}
19235
19236TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
19237 m_errorMonitor->ExpectSuccess();
19238
19239 ASSERT_NO_FATAL_FAILURE(InitState());
19240 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19241
19242 BeginCommandBuffer(); // Framework implicitly begins the renderpass.
19243 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // End implicit.
19244
19245 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
19246 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
19247 m_errorMonitor->VerifyNotFound();
19248 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
19249 m_errorMonitor->VerifyNotFound();
19250 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
19251 m_errorMonitor->VerifyNotFound();
19252
19253 m_commandBuffer->EndCommandBuffer();
19254 m_errorMonitor->VerifyNotFound();
19255}
19256
19257TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
19258 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
19259 "attachment that uses LOAD_OP_CLEAR, the first subpass "
19260 "has a valid layout, and a second subpass then uses a "
19261 "valid *READ_ONLY* layout.");
19262 m_errorMonitor->ExpectSuccess();
19263 ASSERT_NO_FATAL_FAILURE(InitState());
19264
19265 VkAttachmentReference attach[2] = {};
19266 attach[0].attachment = 0;
19267 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19268 attach[1].attachment = 0;
19269 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
19270 VkSubpassDescription subpasses[2] = {};
19271 // First subpass clears DS attach on load
19272 subpasses[0].pDepthStencilAttachment = &attach[0];
19273 // 2nd subpass reads in DS as input attachment
19274 subpasses[1].inputAttachmentCount = 1;
19275 subpasses[1].pInputAttachments = &attach[1];
19276 VkAttachmentDescription attach_desc = {};
19277 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
19278 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
19279 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
19280 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
19281 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
19282 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
19283 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19284 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
19285 VkRenderPassCreateInfo rpci = {};
19286 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
19287 rpci.attachmentCount = 1;
19288 rpci.pAttachments = &attach_desc;
19289 rpci.subpassCount = 2;
19290 rpci.pSubpasses = subpasses;
19291
19292 // Now create RenderPass and verify no errors
19293 VkRenderPass rp;
19294 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
19295 m_errorMonitor->VerifyNotFound();
19296
19297 vkDestroyRenderPass(m_device->device(), rp, NULL);
19298}
19299
19300TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
19301 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
19302 "as vertex attributes");
19303 m_errorMonitor->ExpectSuccess();
19304
19305 ASSERT_NO_FATAL_FAILURE(InitState());
19306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19307
19308 VkVertexInputBindingDescription input_binding;
19309 memset(&input_binding, 0, sizeof(input_binding));
19310
19311 VkVertexInputAttributeDescription input_attribs[2];
19312 memset(input_attribs, 0, sizeof(input_attribs));
19313
19314 for (int i = 0; i < 2; i++) {
19315 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19316 input_attribs[i].location = i;
19317 }
19318
19319 char const *vsSource = "#version 450\n"
19320 "\n"
19321 "layout(location=0) in mat2x4 x;\n"
19322 "out gl_PerVertex {\n"
19323 " vec4 gl_Position;\n"
19324 "};\n"
19325 "void main(){\n"
19326 " gl_Position = x[0] + x[1];\n"
19327 "}\n";
19328 char const *fsSource = "#version 450\n"
19329 "\n"
19330 "layout(location=0) out vec4 color;\n"
19331 "void main(){\n"
19332 " color = vec4(1);\n"
19333 "}\n";
19334
19335 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19336 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19337
19338 VkPipelineObj pipe(m_device);
19339 pipe.AddColorAttachment();
19340 pipe.AddShader(&vs);
19341 pipe.AddShader(&fs);
19342
19343 pipe.AddVertexInputBindings(&input_binding, 1);
19344 pipe.AddVertexInputAttribs(input_attribs, 2);
19345
19346 VkDescriptorSetObj descriptorSet(m_device);
19347 descriptorSet.AppendDummy();
19348 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19349
19350 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19351
19352 /* expect success */
19353 m_errorMonitor->VerifyNotFound();
19354}
19355
19356TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
19357 m_errorMonitor->ExpectSuccess();
19358
19359 ASSERT_NO_FATAL_FAILURE(InitState());
19360 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19361
19362 VkVertexInputBindingDescription input_binding;
19363 memset(&input_binding, 0, sizeof(input_binding));
19364
19365 VkVertexInputAttributeDescription input_attribs[2];
19366 memset(input_attribs, 0, sizeof(input_attribs));
19367
19368 for (int i = 0; i < 2; i++) {
19369 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19370 input_attribs[i].location = i;
19371 }
19372
19373 char const *vsSource = "#version 450\n"
19374 "\n"
19375 "layout(location=0) in vec4 x[2];\n"
19376 "out gl_PerVertex {\n"
19377 " vec4 gl_Position;\n"
19378 "};\n"
19379 "void main(){\n"
19380 " gl_Position = x[0] + x[1];\n"
19381 "}\n";
19382 char const *fsSource = "#version 450\n"
19383 "\n"
19384 "layout(location=0) out vec4 color;\n"
19385 "void main(){\n"
19386 " color = vec4(1);\n"
19387 "}\n";
19388
19389 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19390 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19391
19392 VkPipelineObj pipe(m_device);
19393 pipe.AddColorAttachment();
19394 pipe.AddShader(&vs);
19395 pipe.AddShader(&fs);
19396
19397 pipe.AddVertexInputBindings(&input_binding, 1);
19398 pipe.AddVertexInputAttribs(input_attribs, 2);
19399
19400 VkDescriptorSetObj descriptorSet(m_device);
19401 descriptorSet.AppendDummy();
19402 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19403
19404 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19405
19406 m_errorMonitor->VerifyNotFound();
19407}
19408
19409TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
19410 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
19411 "through multiple vertex shader inputs, each consuming a different "
19412 "subset of the components.");
19413 m_errorMonitor->ExpectSuccess();
19414
19415 ASSERT_NO_FATAL_FAILURE(InitState());
19416 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19417
19418 VkVertexInputBindingDescription input_binding;
19419 memset(&input_binding, 0, sizeof(input_binding));
19420
19421 VkVertexInputAttributeDescription input_attribs[3];
19422 memset(input_attribs, 0, sizeof(input_attribs));
19423
19424 for (int i = 0; i < 3; i++) {
19425 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19426 input_attribs[i].location = i;
19427 }
19428
19429 char const *vsSource = "#version 450\n"
19430 "\n"
19431 "layout(location=0) in vec4 x;\n"
19432 "layout(location=1) in vec3 y1;\n"
19433 "layout(location=1, component=3) in float y2;\n"
19434 "layout(location=2) in vec4 z;\n"
19435 "out gl_PerVertex {\n"
19436 " vec4 gl_Position;\n"
19437 "};\n"
19438 "void main(){\n"
19439 " gl_Position = x + vec4(y1, y2) + z;\n"
19440 "}\n";
19441 char const *fsSource = "#version 450\n"
19442 "\n"
19443 "layout(location=0) out vec4 color;\n"
19444 "void main(){\n"
19445 " color = vec4(1);\n"
19446 "}\n";
19447
19448 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19449 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19450
19451 VkPipelineObj pipe(m_device);
19452 pipe.AddColorAttachment();
19453 pipe.AddShader(&vs);
19454 pipe.AddShader(&fs);
19455
19456 pipe.AddVertexInputBindings(&input_binding, 1);
19457 pipe.AddVertexInputAttribs(input_attribs, 3);
19458
19459 VkDescriptorSetObj descriptorSet(m_device);
19460 descriptorSet.AppendDummy();
19461 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19462
19463 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19464
19465 m_errorMonitor->VerifyNotFound();
19466}
19467
19468TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
19469 m_errorMonitor->ExpectSuccess();
19470
19471 ASSERT_NO_FATAL_FAILURE(InitState());
19472 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19473
19474 char const *vsSource = "#version 450\n"
19475 "out gl_PerVertex {\n"
19476 " vec4 gl_Position;\n"
19477 "};\n"
19478 "void main(){\n"
19479 " gl_Position = vec4(0);\n"
19480 "}\n";
19481 char const *fsSource = "#version 450\n"
19482 "\n"
19483 "layout(location=0) out vec4 color;\n"
19484 "void main(){\n"
19485 " color = vec4(1);\n"
19486 "}\n";
19487
19488 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19489 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19490
19491 VkPipelineObj pipe(m_device);
19492 pipe.AddColorAttachment();
19493 pipe.AddShader(&vs);
19494 pipe.AddShader(&fs);
19495
19496 VkDescriptorSetObj descriptorSet(m_device);
19497 descriptorSet.AppendDummy();
19498 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19499
19500 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19501
19502 m_errorMonitor->VerifyNotFound();
19503}
19504
19505TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
19506 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
19507 "set out in 14.1.3: fundamental type must match, and producer side must "
19508 "have at least as many components");
19509 m_errorMonitor->ExpectSuccess();
19510
19511 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
19512
19513 ASSERT_NO_FATAL_FAILURE(InitState());
19514 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19515
19516 char const *vsSource = "#version 450\n"
19517 "out gl_PerVertex {\n"
19518 " vec4 gl_Position;\n"
19519 "};\n"
19520 "layout(location=0) out vec3 x;\n"
19521 "layout(location=1) out ivec3 y;\n"
19522 "layout(location=2) out vec3 z;\n"
19523 "void main(){\n"
19524 " gl_Position = vec4(0);\n"
19525 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
19526 "}\n";
19527 char const *fsSource = "#version 450\n"
19528 "\n"
19529 "layout(location=0) out vec4 color;\n"
19530 "layout(location=0) in float x;\n"
19531 "layout(location=1) flat in int y;\n"
19532 "layout(location=2) in vec2 z;\n"
19533 "void main(){\n"
19534 " color = vec4(1 + x + y + z.x);\n"
19535 "}\n";
19536
19537 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19538 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19539
19540 VkPipelineObj pipe(m_device);
19541 pipe.AddColorAttachment();
19542 pipe.AddShader(&vs);
19543 pipe.AddShader(&fs);
19544
19545 VkDescriptorSetObj descriptorSet(m_device);
19546 descriptorSet.AppendDummy();
19547 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19548
19549 VkResult err = VK_SUCCESS;
19550 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19551 ASSERT_VK_SUCCESS(err);
19552
19553 m_errorMonitor->VerifyNotFound();
19554}
19555
19556TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
19557 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
19558 "passed between the TCS and TES stages");
19559 m_errorMonitor->ExpectSuccess();
19560
19561 ASSERT_NO_FATAL_FAILURE(InitState());
19562 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19563
19564 if (!m_device->phy().features().tessellationShader) {
19565 printf("Device does not support tessellation shaders; skipped.\n");
19566 return;
19567 }
19568
19569 char const *vsSource = "#version 450\n"
19570 "void main(){}\n";
19571 char const *tcsSource = "#version 450\n"
19572 "layout(location=0) out int x[];\n"
19573 "layout(vertices=3) out;\n"
19574 "void main(){\n"
19575 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
19576 " gl_TessLevelInner[0] = 1;\n"
19577 " x[gl_InvocationID] = gl_InvocationID;\n"
19578 "}\n";
19579 char const *tesSource = "#version 450\n"
19580 "layout(triangles, equal_spacing, cw) in;\n"
19581 "layout(location=0) in int x[];\n"
19582 "out gl_PerVertex { vec4 gl_Position; };\n"
19583 "void main(){\n"
19584 " gl_Position.xyz = gl_TessCoord;\n"
19585 " gl_Position.w = x[0] + x[1] + x[2];\n"
19586 "}\n";
19587 char const *fsSource = "#version 450\n"
19588 "layout(location=0) out vec4 color;\n"
19589 "void main(){\n"
19590 " color = vec4(1);\n"
19591 "}\n";
19592
19593 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19594 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
19595 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
19596 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19597
19598 VkPipelineInputAssemblyStateCreateInfo iasci{ VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
19599 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE };
19600
19601 VkPipelineTessellationStateCreateInfo tsci{ VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3 };
19602
19603 VkPipelineObj pipe(m_device);
19604 pipe.SetInputAssembly(&iasci);
19605 pipe.SetTessellation(&tsci);
19606 pipe.AddColorAttachment();
19607 pipe.AddShader(&vs);
19608 pipe.AddShader(&tcs);
19609 pipe.AddShader(&tes);
19610 pipe.AddShader(&fs);
19611
19612 VkDescriptorSetObj descriptorSet(m_device);
19613 descriptorSet.AppendDummy();
19614 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19615
19616 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19617
19618 m_errorMonitor->VerifyNotFound();
19619}
19620
19621TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
19622 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
19623 "interface block passed into the geometry shader. This "
19624 "is interesting because the 'extra' array level is not "
19625 "present on the member type, but on the block instance.");
19626 m_errorMonitor->ExpectSuccess();
19627
19628 ASSERT_NO_FATAL_FAILURE(InitState());
19629 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19630
19631 if (!m_device->phy().features().geometryShader) {
19632 printf("Device does not support geometry shaders; skipped.\n");
19633 return;
19634 }
19635
19636 char const *vsSource = "#version 450\n"
19637 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
19638 "void main(){\n"
19639 " vs_out.x = vec4(1);\n"
19640 "}\n";
19641 char const *gsSource = "#version 450\n"
19642 "layout(triangles) in;\n"
19643 "layout(triangle_strip, max_vertices=3) out;\n"
19644 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
19645 "out gl_PerVertex { vec4 gl_Position; };\n"
19646 "void main() {\n"
19647 " gl_Position = gs_in[0].x;\n"
19648 " EmitVertex();\n"
19649 "}\n";
19650 char const *fsSource = "#version 450\n"
19651 "layout(location=0) out vec4 color;\n"
19652 "void main(){\n"
19653 " color = vec4(1);\n"
19654 "}\n";
19655
19656 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19657 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
19658 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19659
19660 VkPipelineObj pipe(m_device);
19661 pipe.AddColorAttachment();
19662 pipe.AddShader(&vs);
19663 pipe.AddShader(&gs);
19664 pipe.AddShader(&fs);
19665
19666 VkDescriptorSetObj descriptorSet(m_device);
19667 descriptorSet.AppendDummy();
19668 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19669
19670 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19671
19672 m_errorMonitor->VerifyNotFound();
19673}
19674
19675TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
19676 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
19677 "attributes. This is interesting because they consume multiple "
19678 "locations.");
19679 m_errorMonitor->ExpectSuccess();
19680
19681 ASSERT_NO_FATAL_FAILURE(InitState());
19682 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19683
19684 if (!m_device->phy().features().shaderFloat64) {
19685 printf("Device does not support 64bit vertex attributes; skipped.\n");
19686 return;
19687 }
19688
19689 VkVertexInputBindingDescription input_bindings[1];
19690 memset(input_bindings, 0, sizeof(input_bindings));
19691
19692 VkVertexInputAttributeDescription input_attribs[4];
19693 memset(input_attribs, 0, sizeof(input_attribs));
19694 input_attribs[0].location = 0;
19695 input_attribs[0].offset = 0;
19696 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19697 input_attribs[1].location = 2;
19698 input_attribs[1].offset = 32;
19699 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19700 input_attribs[2].location = 4;
19701 input_attribs[2].offset = 64;
19702 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19703 input_attribs[3].location = 6;
19704 input_attribs[3].offset = 96;
19705 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19706
19707 char const *vsSource = "#version 450\n"
19708 "\n"
19709 "layout(location=0) in dmat4 x;\n"
19710 "out gl_PerVertex {\n"
19711 " vec4 gl_Position;\n"
19712 "};\n"
19713 "void main(){\n"
19714 " gl_Position = vec4(x[0][0]);\n"
19715 "}\n";
19716 char const *fsSource = "#version 450\n"
19717 "\n"
19718 "layout(location=0) out vec4 color;\n"
19719 "void main(){\n"
19720 " color = vec4(1);\n"
19721 "}\n";
19722
19723 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19724 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19725
19726 VkPipelineObj pipe(m_device);
19727 pipe.AddColorAttachment();
19728 pipe.AddShader(&vs);
19729 pipe.AddShader(&fs);
19730
19731 pipe.AddVertexInputBindings(input_bindings, 1);
19732 pipe.AddVertexInputAttribs(input_attribs, 4);
19733
19734 VkDescriptorSetObj descriptorSet(m_device);
19735 descriptorSet.AppendDummy();
19736 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19737
19738 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19739
19740 m_errorMonitor->VerifyNotFound();
19741}
19742
19743TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
19744 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
19745 m_errorMonitor->ExpectSuccess();
19746
19747 ASSERT_NO_FATAL_FAILURE(InitState());
19748
19749 char const *vsSource = "#version 450\n"
19750 "\n"
19751 "out gl_PerVertex {\n"
19752 " vec4 gl_Position;\n"
19753 "};\n"
19754 "void main(){\n"
19755 " gl_Position = vec4(1);\n"
19756 "}\n";
19757 char const *fsSource = "#version 450\n"
19758 "\n"
19759 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
19760 "layout(location=0) out vec4 color;\n"
19761 "void main() {\n"
19762 " color = subpassLoad(x);\n"
19763 "}\n";
19764
19765 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19766 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19767
19768 VkPipelineObj pipe(m_device);
19769 pipe.AddShader(&vs);
19770 pipe.AddShader(&fs);
19771 pipe.AddColorAttachment();
19772 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19773
19774 VkDescriptorSetLayoutBinding dslb = { 0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr };
19775 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb };
19776 VkDescriptorSetLayout dsl;
19777 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19778 ASSERT_VK_SUCCESS(err);
19779
19780 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19781 VkPipelineLayout pl;
19782 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19783 ASSERT_VK_SUCCESS(err);
19784
19785 VkAttachmentDescription descs[2] = {
19786 { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
19787 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
19788 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL },
19789 { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
19790 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL },
19791 };
19792 VkAttachmentReference color = {
19793 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
19794 };
19795 VkAttachmentReference input = {
19796 1, VK_IMAGE_LAYOUT_GENERAL,
19797 };
19798
19799 VkSubpassDescription sd = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr };
19800
19801 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr };
19802 VkRenderPass rp;
19803 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19804 ASSERT_VK_SUCCESS(err);
19805
19806 // should be OK. would go wrong here if it's going to...
19807 pipe.CreateVKPipeline(pl, rp);
19808
19809 m_errorMonitor->VerifyNotFound();
19810
19811 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19812 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19813 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19814}
19815
19816TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
19817 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
19818 "descriptor-backed resource which is not provided, but the shader does not "
19819 "statically use it. This is interesting because it requires compute pipelines "
19820 "to have a proper descriptor use walk, which they didn't for some time.");
19821 m_errorMonitor->ExpectSuccess();
19822
19823 ASSERT_NO_FATAL_FAILURE(InitState());
19824
19825 char const *csSource = "#version 450\n"
19826 "\n"
19827 "layout(local_size_x=1) in;\n"
19828 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
19829 "void main(){\n"
19830 " // x is not used.\n"
19831 "}\n";
19832
19833 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19834
19835 VkDescriptorSetObj descriptorSet(m_device);
19836 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19837
19838 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19839 nullptr,
19840 0,
19841 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19842 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19843 descriptorSet.GetPipelineLayout(),
19844 VK_NULL_HANDLE,
19845 -1 };
19846
19847 VkPipeline pipe;
19848 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19849
19850 m_errorMonitor->VerifyNotFound();
19851
19852 if (err == VK_SUCCESS) {
19853 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19854 }
19855}
19856
19857TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
19858 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
19859 "sampler portion of a combined image + sampler");
19860 m_errorMonitor->ExpectSuccess();
19861
19862 ASSERT_NO_FATAL_FAILURE(InitState());
19863
19864 VkDescriptorSetLayoutBinding bindings[] = {
19865 { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19866 { 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19867 { 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19868 };
19869 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings };
19870 VkDescriptorSetLayout dsl;
19871 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19872 ASSERT_VK_SUCCESS(err);
19873
19874 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19875 VkPipelineLayout pl;
19876 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19877 ASSERT_VK_SUCCESS(err);
19878
19879 char const *csSource = "#version 450\n"
19880 "\n"
19881 "layout(local_size_x=1) in;\n"
19882 "layout(set=0, binding=0) uniform sampler s;\n"
19883 "layout(set=0, binding=1) uniform texture2D t;\n"
19884 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
19885 "void main() {\n"
19886 " x = texture(sampler2D(t, s), vec2(0));\n"
19887 "}\n";
19888 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19889
19890 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19891 nullptr,
19892 0,
19893 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19894 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19895 pl,
19896 VK_NULL_HANDLE,
19897 -1 };
19898
19899 VkPipeline pipe;
19900 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19901
19902 m_errorMonitor->VerifyNotFound();
19903
19904 if (err == VK_SUCCESS) {
19905 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19906 }
19907
19908 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19909 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19910}
19911
19912TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
19913 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
19914 "image portion of a combined image + sampler");
19915 m_errorMonitor->ExpectSuccess();
19916
19917 ASSERT_NO_FATAL_FAILURE(InitState());
19918
19919 VkDescriptorSetLayoutBinding bindings[] = {
19920 { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19921 { 1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19922 { 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19923 };
19924 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings };
19925 VkDescriptorSetLayout dsl;
19926 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19927 ASSERT_VK_SUCCESS(err);
19928
19929 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19930 VkPipelineLayout pl;
19931 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19932 ASSERT_VK_SUCCESS(err);
19933
19934 char const *csSource = "#version 450\n"
19935 "\n"
19936 "layout(local_size_x=1) in;\n"
19937 "layout(set=0, binding=0) uniform texture2D t;\n"
19938 "layout(set=0, binding=1) uniform sampler s;\n"
19939 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
19940 "void main() {\n"
19941 " x = texture(sampler2D(t, s), vec2(0));\n"
19942 "}\n";
19943 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19944
19945 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19946 nullptr,
19947 0,
19948 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19949 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19950 pl,
19951 VK_NULL_HANDLE,
19952 -1 };
19953
19954 VkPipeline pipe;
19955 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19956
19957 m_errorMonitor->VerifyNotFound();
19958
19959 if (err == VK_SUCCESS) {
19960 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19961 }
19962
19963 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19964 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19965}
19966
19967TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
19968 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
19969 "both the sampler and the image of a combined image+sampler "
19970 "but via separate variables");
19971 m_errorMonitor->ExpectSuccess();
19972
19973 ASSERT_NO_FATAL_FAILURE(InitState());
19974
19975 VkDescriptorSetLayoutBinding bindings[] = {
19976 { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19977 { 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19978 };
19979 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings };
19980 VkDescriptorSetLayout dsl;
19981 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19982 ASSERT_VK_SUCCESS(err);
19983
19984 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19985 VkPipelineLayout pl;
19986 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19987 ASSERT_VK_SUCCESS(err);
19988
19989 char const *csSource = "#version 450\n"
19990 "\n"
19991 "layout(local_size_x=1) in;\n"
19992 "layout(set=0, binding=0) uniform texture2D t;\n"
19993 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
19994 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
19995 "void main() {\n"
19996 " x = texture(sampler2D(t, s), vec2(0));\n"
19997 "}\n";
19998 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19999
20000 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
20001 nullptr,
20002 0,
20003 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
20004 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
20005 pl,
20006 VK_NULL_HANDLE,
20007 -1 };
20008
20009 VkPipeline pipe;
20010 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
20011
20012 m_errorMonitor->VerifyNotFound();
20013
20014 if (err == VK_SUCCESS) {
20015 vkDestroyPipeline(m_device->device(), pipe, nullptr);
20016 }
20017
20018 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
20019 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
20020}
20021
20022TEST_F(VkPositiveLayerTest, ValidStructPNext) {
20023 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
20024
20025 ASSERT_NO_FATAL_FAILURE(InitState());
20026
20027 // Positive test to check parameter_validation and unique_objects support
20028 // for NV_dedicated_allocation
20029 uint32_t extension_count = 0;
20030 bool supports_nv_dedicated_allocation = false;
20031 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
20032 ASSERT_VK_SUCCESS(err);
20033
20034 if (extension_count > 0) {
20035 std::vector<VkExtensionProperties> available_extensions(extension_count);
20036
20037 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
20038 ASSERT_VK_SUCCESS(err);
20039
20040 for (const auto &extension_props : available_extensions) {
20041 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
20042 supports_nv_dedicated_allocation = true;
20043 }
20044 }
20045 }
20046
20047 if (supports_nv_dedicated_allocation) {
20048 m_errorMonitor->ExpectSuccess();
20049
20050 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
20051 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
20052 dedicated_buffer_create_info.pNext = nullptr;
20053 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
20054
20055 uint32_t queue_family_index = 0;
20056 VkBufferCreateInfo buffer_create_info = {};
20057 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20058 buffer_create_info.pNext = &dedicated_buffer_create_info;
20059 buffer_create_info.size = 1024;
20060 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20061 buffer_create_info.queueFamilyIndexCount = 1;
20062 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
20063
20064 VkBuffer buffer;
20065 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
20066 ASSERT_VK_SUCCESS(err);
20067
20068 VkMemoryRequirements memory_reqs;
20069 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
20070
20071 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
20072 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
20073 dedicated_memory_info.pNext = nullptr;
20074 dedicated_memory_info.buffer = buffer;
20075 dedicated_memory_info.image = VK_NULL_HANDLE;
20076
20077 VkMemoryAllocateInfo memory_info = {};
20078 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20079 memory_info.pNext = &dedicated_memory_info;
20080 memory_info.allocationSize = memory_reqs.size;
20081
20082 bool pass;
20083 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20084 ASSERT_TRUE(pass);
20085
20086 VkDeviceMemory buffer_memory;
20087 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
20088 ASSERT_VK_SUCCESS(err);
20089
20090 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
20091 ASSERT_VK_SUCCESS(err);
20092
20093 vkDestroyBuffer(m_device->device(), buffer, NULL);
20094 vkFreeMemory(m_device->device(), buffer_memory, NULL);
20095
20096 m_errorMonitor->VerifyNotFound();
20097 }
20098}
20099
20100TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
20101 VkResult err;
20102
20103 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
20104
20105 ASSERT_NO_FATAL_FAILURE(InitState());
20106 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20107
20108 std::vector<const char *> device_extension_names;
20109 auto features = m_device->phy().features();
20110 // Artificially disable support for non-solid fill modes
20111 features.fillModeNonSolid = false;
20112 // The sacrificial device object
20113 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
20114
20115 VkRenderpassObj render_pass(&test_device);
20116
20117 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20118 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20119 pipeline_layout_ci.setLayoutCount = 0;
20120 pipeline_layout_ci.pSetLayouts = NULL;
20121
20122 VkPipelineLayout pipeline_layout;
20123 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20124 ASSERT_VK_SUCCESS(err);
20125
20126 VkPipelineRasterizationStateCreateInfo rs_ci = {};
20127 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
20128 rs_ci.pNext = nullptr;
20129 rs_ci.lineWidth = 1.0f;
20130 rs_ci.rasterizerDiscardEnable = true;
20131
20132 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
20133 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20134
20135 // Set polygonMode=FILL. No error is expected
20136 m_errorMonitor->ExpectSuccess();
20137 {
20138 VkPipelineObj pipe(&test_device);
20139 pipe.AddShader(&vs);
20140 pipe.AddShader(&fs);
20141 pipe.AddColorAttachment();
20142 // Set polygonMode to a good value
20143 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
20144 pipe.SetRasterization(&rs_ci);
20145 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
20146 }
20147 m_errorMonitor->VerifyNotFound();
20148
20149 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
20150}
20151
20152TEST_F(VkPositiveLayerTest, ValidPushConstants) {
20153 VkResult err;
20154 ASSERT_NO_FATAL_FAILURE(InitState());
20155 ASSERT_NO_FATAL_FAILURE(InitViewport());
20156 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20157
20158 VkPipelineLayout pipeline_layout;
20159 VkPushConstantRange pc_range = {};
20160 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20161 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20162 pipeline_layout_ci.pushConstantRangeCount = 1;
20163 pipeline_layout_ci.pPushConstantRanges = &pc_range;
20164
20165 //
20166 // Check for invalid push constant ranges in pipeline layouts.
20167 //
20168 struct PipelineLayoutTestCase {
20169 VkPushConstantRange const range;
20170 char const *msg;
20171 };
20172
20173 // Check for overlapping ranges
20174 const uint32_t ranges_per_test = 5;
20175 struct OverlappingRangeTestCase {
20176 VkPushConstantRange const ranges[ranges_per_test];
20177 char const *msg;
20178 };
20179
20180 // Run some positive tests to make sure overlap checking in the layer is OK
20181 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos = { { { { { VK_SHADER_STAGE_VERTEX_BIT, 0, 4 },
20182 { VK_SHADER_STAGE_VERTEX_BIT, 4, 4 },
20183 { VK_SHADER_STAGE_VERTEX_BIT, 8, 4 },
20184 { VK_SHADER_STAGE_VERTEX_BIT, 12, 4 },
20185 { VK_SHADER_STAGE_VERTEX_BIT, 16, 4 } },
20186 "" },
20187 { { { VK_SHADER_STAGE_VERTEX_BIT, 92, 24 },
20188 { VK_SHADER_STAGE_VERTEX_BIT, 80, 4 },
20189 { VK_SHADER_STAGE_VERTEX_BIT, 64, 8 },
20190 { VK_SHADER_STAGE_VERTEX_BIT, 4, 16 },
20191 { VK_SHADER_STAGE_VERTEX_BIT, 0, 4 } },
20192 "" } } };
20193 for (const auto &iter : overlapping_range_tests_pos) {
20194 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
20195 m_errorMonitor->ExpectSuccess();
20196 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20197 m_errorMonitor->VerifyNotFound();
20198 if (VK_SUCCESS == err) {
20199 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20200 }
20201 }
20202
20203 //
20204 // CmdPushConstants tests
20205 //
20206 const uint8_t dummy_values[100] = {};
20207
20208 BeginCommandBuffer();
20209
20210 // positive overlapping range tests with cmd
20211 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = { {
20212 { { VK_SHADER_STAGE_VERTEX_BIT, 0, 16 }, "" },
20213 { { VK_SHADER_STAGE_VERTEX_BIT, 0, 4 }, "" },
20214 { { VK_SHADER_STAGE_VERTEX_BIT, 20, 12 }, "" },
20215 { { VK_SHADER_STAGE_VERTEX_BIT, 56, 36 }, "" },
20216 } };
20217
20218 // Setup ranges: [0,16) [20,36) [36,44) [44,52) [56,80) [80,92)
20219 const VkPushConstantRange pc_range4[] = {
20220 { VK_SHADER_STAGE_VERTEX_BIT, 20, 16 },{ VK_SHADER_STAGE_VERTEX_BIT, 0, 16 },{ VK_SHADER_STAGE_VERTEX_BIT, 44, 8 },
20221 { VK_SHADER_STAGE_VERTEX_BIT, 80, 12 },{ VK_SHADER_STAGE_VERTEX_BIT, 36, 8 },{ VK_SHADER_STAGE_VERTEX_BIT, 56, 24 },
20222 };
20223
20224 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range4) / sizeof(VkPushConstantRange);
20225 pipeline_layout_ci.pPushConstantRanges = pc_range4;
20226 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20227 ASSERT_VK_SUCCESS(err);
20228 for (const auto &iter : cmd_overlap_tests_pos) {
20229 m_errorMonitor->ExpectSuccess();
20230 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
20231 iter.range.size, dummy_values);
20232 m_errorMonitor->VerifyNotFound();
20233 }
20234 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20235
20236 EndCommandBuffer();
20237}
20238
20239
20240
20241
20242
20243
20244
20245#if 0 // A few devices have issues with this test so disabling for now
20246TEST_F(VkPositiveLayerTest, LongFenceChain)
20247{
20248 m_errorMonitor->ExpectSuccess();
20249
20250 ASSERT_NO_FATAL_FAILURE(InitState());
20251 VkResult err;
20252
20253 std::vector<VkFence> fences;
20254
20255 const int chainLength = 32768;
20256
20257 for (int i = 0; i < chainLength; i++) {
20258 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
20259 VkFence fence;
20260 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
20261 ASSERT_VK_SUCCESS(err);
20262
20263 fences.push_back(fence);
20264
20265 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
20266 0, nullptr, 0, nullptr };
20267 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
20268 ASSERT_VK_SUCCESS(err);
20269
20270 }
20271
20272 // BOOM, stack overflow.
20273 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
20274
20275 for (auto fence : fences)
20276 vkDestroyFence(m_device->device(), fence, nullptr);
20277
20278 m_errorMonitor->VerifyNotFound();
20279}
20280#endif
20281
20282
Cody Northrop1242dfd2016-07-13 17:24:59 -060020283#if defined(ANDROID) && defined(VALIDATION_APK)
20284static bool initialized = false;
20285static bool active = false;
20286
20287// Convert Intents to argv
20288// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020289std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020290 std::vector<std::string> args;
20291 JavaVM &vm = *app.activity->vm;
20292 JNIEnv *p_env;
20293 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK)
20294 return args;
20295
20296 JNIEnv &env = *p_env;
20297 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020298 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060020299 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020300 jmethodID get_string_extra_method =
20301 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060020302 jvalue get_string_extra_args;
20303 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020304 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060020305
20306 std::string args_str;
20307 if (extra_str) {
20308 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
20309 args_str = extra_utf;
20310 env.ReleaseStringUTFChars(extra_str, extra_utf);
20311 env.DeleteLocalRef(extra_str);
20312 }
20313
20314 env.DeleteLocalRef(get_string_extra_args.l);
20315 env.DeleteLocalRef(intent);
20316 vm.DetachCurrentThread();
20317
20318 // split args_str
20319 std::stringstream ss(args_str);
20320 std::string arg;
20321 while (std::getline(ss, arg, ' ')) {
20322 if (!arg.empty())
20323 args.push_back(arg);
20324 }
20325
20326 return args;
20327}
20328
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020329static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020330
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020331static void processCommand(struct android_app *app, int32_t cmd) {
20332 switch (cmd) {
20333 case APP_CMD_INIT_WINDOW: {
20334 if (app->window) {
20335 initialized = true;
Cody Northrop1242dfd2016-07-13 17:24:59 -060020336 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020337 break;
20338 }
20339 case APP_CMD_GAINED_FOCUS: {
20340 active = true;
20341 break;
20342 }
20343 case APP_CMD_LOST_FOCUS: {
20344 active = false;
20345 break;
20346 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020347 }
20348}
20349
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020350void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020351 app_dummy();
20352
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020353 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060020354
20355 int vulkanSupport = InitVulkan();
20356 if (vulkanSupport == 0) {
20357 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
20358 return;
20359 }
20360
20361 app->onAppCmd = processCommand;
20362 app->onInputEvent = processInput;
20363
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020364 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020365 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020366 struct android_poll_source *source;
20367 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020368 if (source) {
20369 source->process(app, source);
20370 }
20371
20372 if (app->destroyRequested != 0) {
20373 VkTestFramework::Finish();
20374 return;
20375 }
20376 }
20377
20378 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020379 // Use the following key to send arguments to gtest, i.e.
20380 // --es args "--gtest_filter=-VkLayerTest.foo"
20381 const char key[] = "args";
20382 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020383
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020384 std::string filter = "";
20385 if (args.size() > 0) {
20386 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
20387 filter += args[0];
20388 } else {
20389 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
20390 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020391
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020392 int argc = 2;
20393 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
20394 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020395
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020396 // Route output to files until we can override the gtest output
20397 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
20398 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020399
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020400 ::testing::InitGoogleTest(&argc, argv);
20401 VkTestFramework::InitArgs(&argc, argv);
20402 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020403
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020404 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060020405
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020406 if (result != 0) {
20407 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
20408 } else {
20409 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
20410 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020411
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020412 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060020413
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020414 fclose(stdout);
20415 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020416
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020417 ANativeActivity_finish(app->activity);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020418
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020419 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060020420 }
20421 }
20422}
20423#endif
20424
Tony Barbour300a6082015-04-07 13:44:53 -060020425int main(int argc, char **argv) {
20426 int result;
20427
Cody Northrop8e54a402016-03-08 22:25:52 -070020428#ifdef ANDROID
20429 int vulkanSupport = InitVulkan();
20430 if (vulkanSupport == 0)
20431 return 1;
20432#endif
20433
Tony Barbour300a6082015-04-07 13:44:53 -060020434 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060020435 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060020436
20437 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
20438
20439 result = RUN_ALL_TESTS();
20440
Tony Barbour6918cd52015-04-09 12:58:51 -060020441 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060020442 return result;
20443}