blob: 9f562102c609339e42df85ce6bd59ed75025341a [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Karl Schultz6addd812016-02-02 17:17:23 -070021 */
Tony Barbour65c48b32015-11-17 10:02:56 -070022
Cody Northrop8e54a402016-03-08 22:25:52 -070023#ifdef ANDROID
24#include "vulkan_wrapper.h"
25#else
David Pinedo9316d3b2015-11-06 12:54:48 -070026#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070027#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060028
29#if defined(ANDROID) && defined(VALIDATION_APK)
30#include <android/log.h>
31#include <android_native_app_glue.h>
32#endif
33
Jon Ashburn7fa7e222016-02-02 12:08:10 -070034#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060035#include "test_common.h"
36#include "vk_layer_config.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060037#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060038#include "vkrenderframework.h"
39#include <limits.h>
40#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060041
Mark Lobodzinski3780e142015-05-14 15:08:13 -050042#define GLM_FORCE_RADIANS
43#include "glm/glm.hpp"
44#include <glm/gtc/matrix_transform.hpp>
45
Dustin Gravesffa90fa2016-05-06 11:20:38 -060046#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060047#define MEM_TRACKER_TESTS 1
48#define OBJ_TRACKER_TESTS 1
49#define DRAW_STATE_TESTS 1
50#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120051#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060052#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060053#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060054
Mark Lobodzinski3780e142015-05-14 15:08:13 -050055//--------------------------------------------------------------------------------------
56// Mesh and VertexFormat Data
57//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070058struct Vertex {
59 float posX, posY, posZ, posW; // Position data
60 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050061};
62
Karl Schultz6addd812016-02-02 17:17:23 -070063#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050064
65typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070066 BsoFailNone = 0x00000000,
67 BsoFailLineWidth = 0x00000001,
68 BsoFailDepthBias = 0x00000002,
69 BsoFailViewport = 0x00000004,
70 BsoFailScissor = 0x00000008,
71 BsoFailBlend = 0x00000010,
72 BsoFailDepthBounds = 0x00000020,
73 BsoFailStencilReadMask = 0x00000040,
74 BsoFailStencilWriteMask = 0x00000080,
75 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060076 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060077 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050078} BsoFailSelect;
79
80struct vktriangle_vs_uniform {
81 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070082 float mvp[4][4];
83 float position[3][4];
84 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050085};
86
Mark Lobodzinskice751c62016-09-08 10:45:35 -060087static const char bindStateVertShaderText[] = "#version 450\n"
88 "vec2 vertices[3];\n"
89 "out gl_PerVertex {\n"
90 " vec4 gl_Position;\n"
91 "};\n"
92 "void main() {\n"
93 " vertices[0] = vec2(-1.0, -1.0);\n"
94 " vertices[1] = vec2( 1.0, -1.0);\n"
95 " vertices[2] = vec2( 0.0, 1.0);\n"
96 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
97 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050098
Mark Lobodzinskice751c62016-09-08 10:45:35 -060099static const char bindStateFragShaderText[] = "#version 450\n"
100 "\n"
101 "layout(location = 0) out vec4 uFragColor;\n"
102 "void main(){\n"
103 " uFragColor = vec4(0,1,0,1);\n"
104 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500105
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600106static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
107 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
108 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600109
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600110// ErrorMonitor Usage:
111//
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600112// Call SetDesiredFailureMsg with: a string to be compared against all
113// encountered log messages, or a validation error enum identifying
114// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
115// will match all log messages. logMsg will return true for skipCall
116// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600117//
118// Call DesiredMsgFound to determine if the desired failure message
119// was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600120class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700121 public:
122 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600123 test_platform_thread_create_mutex(&m_mutex);
124 test_platform_thread_lock_mutex(&m_mutex);
Chris Forbes17756132016-09-16 14:36:39 +1200125 m_msgFlags = VK_DEBUG_REPORT_ERROR_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700126 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600127 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600128 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129
Dustin Graves48458142016-04-29 16:11:55 -0600130 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
131
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600132 // ErrorMonitor will look for an error message containing the specified string
Karl Schultz6addd812016-02-02 17:17:23 -0700133 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600134 // Also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600135 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600136 m_failure_message_strings.clear();
137 // If we are looking for a matching string, ignore any IDs
138 m_desired_message_ids.clear();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600139 m_otherMsgs.clear();
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600140 m_desired_message_strings.insert(msgString);
Karl Schultz6addd812016-02-02 17:17:23 -0700141 m_msgFound = VK_FALSE;
142 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600143 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600144 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600146 // ErrorMonitor will look for a message ID matching the specified one
147 void SetDesiredFailureMsg(VkFlags msgFlags, UNIQUE_VALIDATION_ERROR_CODE msg_id) {
148 // Also discard all collected messages to this point
149 test_platform_thread_lock_mutex(&m_mutex);
150 m_failure_message_strings.clear();
151 // If we are looking for IDs don't look for strings
152 m_desired_message_strings.clear();
153 m_otherMsgs.clear();
154 m_desired_message_ids.insert(msg_id);
155 m_msgFound = VK_FALSE;
156 m_msgFlags = msgFlags;
157 test_platform_thread_unlock_mutex(&m_mutex);
158 }
159
160 VkBool32 CheckForDesiredMsg(uint32_t message_code, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600162 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600163 if (m_bailout != NULL) {
164 *m_bailout = true;
165 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600166 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600167 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600168
169 for (auto desired_msg : m_desired_message_strings) {
Karl Schultz05cc4e32016-10-12 13:25:23 -0600170 if (desired_msg.length() == 0) {
171 // An empty desired_msg string "" indicates a positive test - not expecting an error.
172 // Return true to avoid calling layers/driver with this error.
173 // And don't erase the "" string, so it remains if another error is found.
174 result = VK_TRUE;
Tony Barbourae58dba2016-12-13 16:30:36 -0700175 found_expected = true;
176 m_msgFound = VK_TRUE;
177 m_failure_message_strings.insert(errorString);
Karl Schultz05cc4e32016-10-12 13:25:23 -0600178 } else if (errorString.find(desired_msg) != string::npos) {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600179 found_expected = true;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600180 m_failure_message_strings.insert(errorString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600181 m_msgFound = VK_TRUE;
182 result = VK_TRUE;
183 // We only want one match for each expected error so remove from set here
184 // Since we're about the break the loop it's ok to remove from set we're iterating over
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600185 m_desired_message_strings.erase(desired_msg);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600186 break;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600187 }
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600188 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600189 for (auto desired_id : m_desired_message_ids) {
190 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
191 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
192 // Return true to avoid calling layers/driver with this error.
193 result = VK_TRUE;
194 } else if (desired_id == message_code) {
195 // Double-check that the string matches the error enum
196 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
197 found_expected = true;
198 result = VK_TRUE;
199 m_msgFound = VK_TRUE;
200 m_desired_message_ids.erase(desired_id);
201 break;
202 } else {
203 // Treat this message as a regular unexpected error, but print a warning jic
204 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
205 errorString.c_str(), desired_id, validation_error_map[desired_id]);
206 }
207 }
208 }
209
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600210 if (!found_expected) {
Chris Forbes5b9442b2016-09-13 16:49:57 +1200211 printf("Unexpected: %s\n", msgString);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600212 m_otherMsgs.push_back(errorString);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600213 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600214 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600215 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600216 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600217
Karl Schultz6addd812016-02-02 17:17:23 -0700218 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600219
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600220 VkDebugReportFlagsEXT GetMessageFlags(void) { return m_msgFlags; }
221
Karl Schultz6addd812016-02-02 17:17:23 -0700222 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600223
Karl Schultz6addd812016-02-02 17:17:23 -0700224 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600225
Karl Schultz6addd812016-02-02 17:17:23 -0700226 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600227 vector<string> otherMsgs = GetOtherFailureMsgs();
Tony Barbour59b42282016-11-03 13:31:28 -0600228 if (otherMsgs.size()) {
229 cout << "Other error messages logged for this test were:" << endl;
230 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
231 cout << " " << *iter << endl;
232 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600233 }
234 }
235
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600236 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200237
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600238 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
239 void ExpectSuccess(VkDebugReportFlagsEXT message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
240 m_msgFlags = message_flag_mask;
241 // Match ANY message matching specified type
242 SetDesiredFailureMsg(message_flag_mask, "");
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200243 }
244
245 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600246 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200247 if (!DesiredMsgFound()) {
248 DumpFailureMsgs();
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600249 for (auto desired_msg : m_desired_message_strings) {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600250 FAIL() << "Did not receive expected error '" << desired_msg << "'";
251 }
Tony Barbour59b42282016-11-03 13:31:28 -0600252 for (auto desired_id : m_desired_message_ids) {
253 FAIL() << "Did not receive expected error '" << desired_id << "'";
254 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200255 }
256 }
257
258 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600259 // ExpectSuccess() configured us to match anything. Any error is a failure.
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200260 if (DesiredMsgFound()) {
261 DumpFailureMsgs();
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600262 for (auto msg : m_failure_message_strings) {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600263 FAIL() << "Expected to succeed but got error: " << msg;
264 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200265 }
266 }
267
Karl Schultz6addd812016-02-02 17:17:23 -0700268 private:
269 VkFlags m_msgFlags;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600270 std::unordered_set<uint32_t>m_desired_message_ids;
271 std::unordered_set<string> m_desired_message_strings;
272 std::unordered_set<string> m_failure_message_strings;
Karl Schultz6addd812016-02-02 17:17:23 -0700273 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600274 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700275 bool *m_bailout;
276 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600277};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500278
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600279static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
280 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
281 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600282 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
283 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600284 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600285 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600286 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600287}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500288
Karl Schultz6addd812016-02-02 17:17:23 -0700289class VkLayerTest : public VkRenderFramework {
290 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800291 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
292 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600293 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
294 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700295 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600296 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
297 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700298 }
Tony Barbour300a6082015-04-07 13:44:53 -0600299
Tony Barbourfe3351b2015-07-28 10:17:20 -0600300 /* Convenience functions that use built-in command buffer */
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600301 VkResult BeginCommandBuffer() { return BeginCommandBuffer(*m_commandBuffer); }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800302 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600303 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
304 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700305 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600306 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700307 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600308 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700309 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600310 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
311 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
312 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700313 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
314 }
315 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
316 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
317 }
318
319 protected:
320 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600321 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600322
323 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600324 std::vector<const char *> instance_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600325 std::vector<const char *> instance_extension_names;
326 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600327
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700328 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600329 /*
330 * Since CreateDbgMsgCallback is an instance level extension call
331 * any extension / layer that utilizes that feature also needs
332 * to be enabled at create instance time.
333 */
Karl Schultz6addd812016-02-02 17:17:23 -0700334 // Use Threading layer first to protect others from
335 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700336 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600337 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800338 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700339 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800340 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600341 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700342 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600343
Ian Elliott2c1daf52016-05-12 09:41:46 -0600344 if (m_enableWSI) {
345 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
346 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
347#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
348#if defined(VK_USE_PLATFORM_ANDROID_KHR)
349 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
350#endif // VK_USE_PLATFORM_ANDROID_KHR
351#if defined(VK_USE_PLATFORM_MIR_KHR)
352 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
353#endif // VK_USE_PLATFORM_MIR_KHR
354#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
355 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
356#endif // VK_USE_PLATFORM_WAYLAND_KHR
357#if defined(VK_USE_PLATFORM_WIN32_KHR)
358 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
359#endif // VK_USE_PLATFORM_WIN32_KHR
360#endif // NEED_TO_TEST_THIS_ON_PLATFORM
361#if defined(VK_USE_PLATFORM_XCB_KHR)
362 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
363#elif defined(VK_USE_PLATFORM_XLIB_KHR)
364 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
365#endif // VK_USE_PLATFORM_XLIB_KHR
366 }
367
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600368 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600369 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800370 this->app_info.pApplicationName = "layer_tests";
371 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600372 this->app_info.pEngineName = "unittest";
373 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600374 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600375
Tony Barbour15524c32015-04-29 17:34:29 -0600376 m_errorMonitor = new ErrorMonitor;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600377 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600378 }
379
380 virtual void TearDown() {
381 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600382 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600383 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600384 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600385
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600386 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600387};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500388
Karl Schultz6addd812016-02-02 17:17:23 -0700389VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600390 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600391
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800392 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600393
394 /*
395 * For render test all drawing happens in a single render pass
396 * on a single command buffer.
397 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200398 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800399 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600400 }
401
402 return result;
403}
404
Karl Schultz6addd812016-02-02 17:17:23 -0700405VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600406 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600407
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200408 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800409 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200410 }
Tony Barbour300a6082015-04-07 13:44:53 -0600411
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800412 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600413
414 return result;
415}
416
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600417void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500418 // Create identity matrix
419 int i;
420 struct vktriangle_vs_uniform data;
421
422 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700423 glm::mat4 View = glm::mat4(1.0f);
424 glm::mat4 Model = glm::mat4(1.0f);
425 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500426 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700427 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500428
429 memcpy(&data.mvp, &MVP[0][0], matrixSize);
430
Karl Schultz6addd812016-02-02 17:17:23 -0700431 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600432 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500433 };
434
Karl Schultz6addd812016-02-02 17:17:23 -0700435 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500436 data.position[i][0] = tri_data[i].posX;
437 data.position[i][1] = tri_data[i].posY;
438 data.position[i][2] = tri_data[i].posZ;
439 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700440 data.color[i][0] = tri_data[i].r;
441 data.color[i][1] = tri_data[i].g;
442 data.color[i][2] = tri_data[i].b;
443 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500444 }
445
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500446 ASSERT_NO_FATAL_FAILURE(InitViewport());
447
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200448 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
449 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500450
Karl Schultz6addd812016-02-02 17:17:23 -0700451 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600452 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453
454 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800455 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456 pipelineobj.AddShader(&vs);
457 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600458 if (failMask & BsoFailLineWidth) {
459 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600460 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600461 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600462 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
463 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600464 }
465 if (failMask & BsoFailDepthBias) {
466 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600467 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600468 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600469 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600470 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600471 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600472 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700473 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700474 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600475 if (failMask & BsoFailViewport) {
476 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
477 }
478 if (failMask & BsoFailScissor) {
479 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
480 }
481 if (failMask & BsoFailBlend) {
482 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600483 VkPipelineColorBlendAttachmentState att_state = {};
484 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
485 att_state.blendEnable = VK_TRUE;
486 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600487 }
488 if (failMask & BsoFailDepthBounds) {
489 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
490 }
491 if (failMask & BsoFailStencilReadMask) {
492 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
493 }
494 if (failMask & BsoFailStencilWriteMask) {
495 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
496 }
497 if (failMask & BsoFailStencilReference) {
498 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
499 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500500
501 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600502 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500503
504 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600505 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500506
Tony Barbourfe3351b2015-07-28 10:17:20 -0600507 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500508
509 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600510 if (failMask & BsoFailIndexBuffer) {
511 // Use DrawIndexed w/o an index buffer bound
512 DrawIndexed(3, 1, 0, 0, 0);
513 } else {
514 Draw(3, 1, 0, 0);
515 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500516
Mark Muellerd4914412016-06-13 17:52:06 -0600517 if (failMask & BsoFailCmdClearAttachments) {
518 VkClearAttachment color_attachment = {};
519 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
520 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
521 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
522
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600523 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600524 }
525
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500526 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600527 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500528
Tony Barbourfe3351b2015-07-28 10:17:20 -0600529 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500530}
531
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600532void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
533 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600535 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500536 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600537 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500538 }
539
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800540 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700541 // Make sure depthWriteEnable is set so that Depth fail test will work
542 // correctly
543 // Make sure stencilTestEnable is set so that Stencil fail test will work
544 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600545 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800546 stencil.failOp = VK_STENCIL_OP_KEEP;
547 stencil.passOp = VK_STENCIL_OP_KEEP;
548 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
549 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600550
551 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
552 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600553 ds_ci.pNext = NULL;
554 ds_ci.depthTestEnable = VK_FALSE;
555 ds_ci.depthWriteEnable = VK_TRUE;
556 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
557 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600558 if (failMask & BsoFailDepthBounds) {
559 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600560 ds_ci.maxDepthBounds = 0.0f;
561 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600562 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600563 ds_ci.stencilTestEnable = VK_TRUE;
564 ds_ci.front = stencil;
565 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600566
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600567 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600568 pipelineobj.SetViewport(m_viewports);
569 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800570 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600571 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600572 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800573 commandBuffer->BindPipeline(pipelineobj);
574 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500575}
576
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600577class VkPositiveLayerTest : public VkLayerTest {
578 public:
579 protected:
580};
581
Ian Elliott2c1daf52016-05-12 09:41:46 -0600582class VkWsiEnabledLayerTest : public VkLayerTest {
583 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600584 protected:
585 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600586};
587
Mark Muellerdfe37552016-07-07 14:47:42 -0600588class VkBufferTest {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600589 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600590 enum eTestEnFlags {
591 eDoubleDelete,
592 eInvalidDeviceOffset,
593 eInvalidMemoryOffset,
594 eBindNullBuffer,
595 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600596 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600597 };
598
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600599 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600600
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600601 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
602 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600603 return true;
604 }
605 VkDeviceSize offset_limit = 0;
606 if (eInvalidMemoryOffset == aTestFlag) {
607 VkBuffer vulkanBuffer;
608 VkBufferCreateInfo buffer_create_info = {};
609 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
610 buffer_create_info.size = 32;
611 buffer_create_info.usage = aBufferUsage;
612
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600613 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600614 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600615
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600616 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600617 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
618 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600619 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
620 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600621 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600622 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600623 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600624 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600625 }
626 if (eOffsetAlignment < offset_limit) {
627 return true;
628 }
629 return false;
630 }
631
632 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
634 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600635
636 if (eBindNullBuffer == aTestFlag) {
637 VulkanMemory = 0;
638 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
639 } else {
640 VkBufferCreateInfo buffer_create_info = {};
641 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
642 buffer_create_info.size = 32;
643 buffer_create_info.usage = aBufferUsage;
644
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600646
647 CreateCurrent = true;
648
649 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600650 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600651
652 VkMemoryAllocateInfo memory_allocate_info = {};
653 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
654 memory_allocate_info.allocationSize = memory_requirements.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600655 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
656 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600657 if (!pass) {
658 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
659 return;
660 }
661
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600662 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600663 AllocateCurrent = true;
664 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
666 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 BoundCurrent = true;
668
669 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
670 }
671 }
672
673 ~VkBufferTest() {
674 if (CreateCurrent) {
675 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
676 }
677 if (AllocateCurrent) {
678 if (InvalidDeleteEn) {
679 union {
680 VkDeviceMemory device_memory;
681 unsigned long long index_access;
682 } bad_index;
683
684 bad_index.device_memory = VulkanMemory;
685 bad_index.index_access++;
686
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600687 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 }
689 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
690 }
691 }
692
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600693 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600694
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600695 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600696
697 void TestDoubleDestroy() {
698 // Destroy the buffer but leave the flag set, which will cause
699 // the buffer to be destroyed again in the destructor.
700 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
701 }
702
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600703 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600704 bool AllocateCurrent;
705 bool BoundCurrent;
706 bool CreateCurrent;
707 bool InvalidDeleteEn;
708
709 VkBuffer VulkanBuffer;
710 VkDevice VulkanDevice;
711 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600712};
713
714class VkVerticesObj {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600715 public:
716 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600717 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 : BoundCurrent(false), AttributeCount(aAttributeCount), BindingCount(aBindingCount), BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600719 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600720 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
721 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600722 BindIdGenerator++; // NB: This can wrap w/misuse
723
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600724 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
725 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600726
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600727 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
728 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
729 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
730 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
731 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600732
733 unsigned i = 0;
734 do {
735 VertexInputAttributeDescription[i].binding = BindId;
736 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600737 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
738 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600739 i++;
740 } while (AttributeCount < i);
741
742 i = 0;
743 do {
744 VertexInputBindingDescription[i].binding = BindId;
745 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600746 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600747 i++;
748 } while (BindingCount < i);
749 }
750
751 ~VkVerticesObj() {
752 if (VertexInputAttributeDescription) {
753 delete[] VertexInputAttributeDescription;
754 }
755 if (VertexInputBindingDescription) {
756 delete[] VertexInputBindingDescription;
757 }
758 }
759
760 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600761 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
762 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600763 return true;
764 }
765
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600766 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600767 VkDeviceSize *offsetList;
768 unsigned offsetCount;
769
770 if (aOffsetCount) {
771 offsetList = aOffsetList;
772 offsetCount = aOffsetCount;
773 } else {
774 offsetList = new VkDeviceSize[1]();
775 offsetCount = 1;
776 }
777
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600778 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600779 BoundCurrent = true;
780
781 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600782 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600783 }
784 }
785
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600786 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600787 static uint32_t BindIdGenerator;
788
789 bool BoundCurrent;
790 unsigned AttributeCount;
791 unsigned BindingCount;
792 uint32_t BindId;
793
794 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
795 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
796 VkVertexInputBindingDescription *VertexInputBindingDescription;
797 VkConstantBufferObj VulkanMemoryBuffer;
798};
799
800uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500801// ********************************************************************************************************************
802// ********************************************************************************************************************
803// ********************************************************************************************************************
804// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600805#if PARAMETER_VALIDATION_TESTS
806TEST_F(VkLayerTest, RequiredParameter) {
807 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
808 "pointer, array, and array count parameters");
809
810 ASSERT_NO_FATAL_FAILURE(InitState());
811
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600813 // Specify NULL for a pointer to a handle
814 // Expected to trigger an error with
815 // parameter_validation::validate_required_pointer
816 vkGetPhysicalDeviceFeatures(gpu(), NULL);
817 m_errorMonitor->VerifyFound();
818
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
820 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600821 // Specify NULL for pointer to array count
822 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600823 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600824 m_errorMonitor->VerifyFound();
825
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600827 // Specify 0 for a required array count
828 // Expected to trigger an error with parameter_validation::validate_array
829 VkViewport view_port = {};
830 m_commandBuffer->SetViewport(0, 0, &view_port);
831 m_errorMonitor->VerifyFound();
832
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600834 // Specify NULL for a required array
835 // Expected to trigger an error with parameter_validation::validate_array
836 m_commandBuffer->SetViewport(0, 1, NULL);
837 m_errorMonitor->VerifyFound();
838
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600840 // Specify VK_NULL_HANDLE for a required handle
841 // Expected to trigger an error with
842 // parameter_validation::validate_required_handle
843 vkUnmapMemory(device(), VK_NULL_HANDLE);
844 m_errorMonitor->VerifyFound();
845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
847 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600848 // Specify VK_NULL_HANDLE for a required handle array entry
849 // Expected to trigger an error with
850 // parameter_validation::validate_required_handle_array
851 VkFence fence = VK_NULL_HANDLE;
852 vkResetFences(device(), 1, &fence);
853 m_errorMonitor->VerifyFound();
854
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600856 // Specify NULL for a required struct pointer
857 // Expected to trigger an error with
858 // parameter_validation::validate_struct_type
859 VkDeviceMemory memory = VK_NULL_HANDLE;
860 vkAllocateMemory(device(), NULL, NULL, &memory);
861 m_errorMonitor->VerifyFound();
862
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600864 // Specify 0 for a required VkFlags parameter
865 // Expected to trigger an error with parameter_validation::validate_flags
866 m_commandBuffer->SetStencilReference(0, 0);
867 m_errorMonitor->VerifyFound();
868
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600870 // Specify 0 for a required VkFlags array entry
871 // Expected to trigger an error with
872 // parameter_validation::validate_flags_array
873 VkSemaphore semaphore = VK_NULL_HANDLE;
874 VkPipelineStageFlags stageFlags = 0;
875 VkSubmitInfo submitInfo = {};
876 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
877 submitInfo.waitSemaphoreCount = 1;
878 submitInfo.pWaitSemaphores = &semaphore;
879 submitInfo.pWaitDstStageMask = &stageFlags;
880 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
881 m_errorMonitor->VerifyFound();
882}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600883
Dustin Gravesfce74c02016-05-10 11:42:58 -0600884TEST_F(VkLayerTest, ReservedParameter) {
885 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
886
887 ASSERT_NO_FATAL_FAILURE(InitState());
888
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600890 // Specify 0 for a reserved VkFlags parameter
891 // Expected to trigger an error with
892 // parameter_validation::validate_reserved_flags
893 VkEvent event_handle = VK_NULL_HANDLE;
894 VkEventCreateInfo event_info = {};
895 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
896 event_info.flags = 1;
897 vkCreateEvent(device(), &event_info, NULL, &event_handle);
898 m_errorMonitor->VerifyFound();
899}
900
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600901TEST_F(VkLayerTest, InvalidStructSType) {
902 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
903 "structure's sType field");
904
905 ASSERT_NO_FATAL_FAILURE(InitState());
906
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600908 // Zero struct memory, effectively setting sType to
909 // VK_STRUCTURE_TYPE_APPLICATION_INFO
910 // Expected to trigger an error with
911 // parameter_validation::validate_struct_type
912 VkMemoryAllocateInfo alloc_info = {};
913 VkDeviceMemory memory = VK_NULL_HANDLE;
914 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
915 m_errorMonitor->VerifyFound();
916
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600918 // Zero struct memory, effectively setting sType to
919 // VK_STRUCTURE_TYPE_APPLICATION_INFO
920 // Expected to trigger an error with
921 // parameter_validation::validate_struct_type_array
922 VkSubmitInfo submit_info = {};
923 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
924 m_errorMonitor->VerifyFound();
925}
926
927TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600928 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600929
930 ASSERT_NO_FATAL_FAILURE(InitState());
931
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600933 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600934 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600935 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600936 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600937 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600938 // Zero-initialization will provide the correct sType
939 VkApplicationInfo app_info = {};
940 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
941 event_alloc_info.pNext = &app_info;
942 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
943 m_errorMonitor->VerifyFound();
944
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
946 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600947 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
948 // a function that has allowed pNext structure types and specify
949 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600950 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600951 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600952 VkMemoryAllocateInfo memory_alloc_info = {};
953 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
954 memory_alloc_info.pNext = &app_info;
955 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600956 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600957}
Dustin Graves5d33d532016-05-09 16:21:12 -0600958
959TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600960 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600961
962 ASSERT_NO_FATAL_FAILURE(InitState());
963
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not fall within the begin..end "
965 "range of the core VkFormat "
966 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600967 // Specify an invalid VkFormat value
968 // Expected to trigger an error with
969 // parameter_validation::validate_ranged_enum
970 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600971 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600972 m_errorMonitor->VerifyFound();
973
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -0600975 // Specify an invalid VkFlags bitmask value
976 // Expected to trigger an error with parameter_validation::validate_flags
977 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600978 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
979 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600980 m_errorMonitor->VerifyFound();
981
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -0600983 // Specify an invalid VkFlags array entry
984 // Expected to trigger an error with
985 // parameter_validation::validate_flags_array
986 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600987 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -0600988 VkSubmitInfo submit_info = {};
989 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
990 submit_info.waitSemaphoreCount = 1;
991 submit_info.pWaitSemaphores = &semaphore;
992 submit_info.pWaitDstStageMask = &stage_flags;
993 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
994 m_errorMonitor->VerifyFound();
995
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -0600997 // Specify an invalid VkBool32 value
998 // Expected to trigger a warning with
999 // parameter_validation::validate_bool32
1000 VkSampler sampler = VK_NULL_HANDLE;
1001 VkSamplerCreateInfo sampler_info = {};
1002 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1003 sampler_info.pNext = NULL;
1004 sampler_info.magFilter = VK_FILTER_NEAREST;
1005 sampler_info.minFilter = VK_FILTER_NEAREST;
1006 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1007 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1008 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1009 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1010 sampler_info.mipLodBias = 1.0;
1011 sampler_info.maxAnisotropy = 1;
1012 sampler_info.compareEnable = VK_FALSE;
1013 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1014 sampler_info.minLod = 1.0;
1015 sampler_info.maxLod = 1.0;
1016 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1017 sampler_info.unnormalizedCoordinates = VK_FALSE;
1018 // Not VK_TRUE or VK_FALSE
1019 sampler_info.anisotropyEnable = 3;
1020 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1021 m_errorMonitor->VerifyFound();
1022}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001023
1024TEST_F(VkLayerTest, FailedReturnValue) {
1025 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1026
1027 ASSERT_NO_FATAL_FAILURE(InitState());
1028
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001029 // Find an unsupported image format
1030 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1031 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1032 VkFormat format = static_cast<VkFormat>(f);
1033 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001034 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001035 unsupported = format;
1036 break;
1037 }
1038 }
1039
1040 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1042 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001043 // Specify an unsupported VkFormat value to generate a
1044 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1045 // Expected to trigger a warning from
1046 // parameter_validation::validate_result
1047 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001048 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1049 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001050 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1051 m_errorMonitor->VerifyFound();
1052 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001053}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001054
1055TEST_F(VkLayerTest, UpdateBufferAlignment) {
1056 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001057 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001058
1059 ASSERT_NO_FATAL_FAILURE(InitState());
1060
1061 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1062 vk_testing::Buffer buffer;
1063 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1064
1065 BeginCommandBuffer();
1066 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001068 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1069 m_errorMonitor->VerifyFound();
1070
1071 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001073 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1074 m_errorMonitor->VerifyFound();
1075
1076 // Introduce failure by using dataSize that is < 0
1077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001078 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001079 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1080 m_errorMonitor->VerifyFound();
1081
1082 // Introduce failure by using dataSize that is > 65536
1083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001084 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001085 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1086 m_errorMonitor->VerifyFound();
1087
1088 EndCommandBuffer();
1089}
1090
1091TEST_F(VkLayerTest, FillBufferAlignment) {
1092 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1093
1094 ASSERT_NO_FATAL_FAILURE(InitState());
1095
1096 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1097 vk_testing::Buffer buffer;
1098 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1099
1100 BeginCommandBuffer();
1101
1102 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001104 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1105 m_errorMonitor->VerifyFound();
1106
1107 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001114 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1115 m_errorMonitor->VerifyFound();
1116
1117 EndCommandBuffer();
1118}
Dustin Graves40f35822016-06-23 11:12:53 -06001119
Cortd889ff92016-07-27 09:51:27 -07001120TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1121 VkResult err;
1122
1123 TEST_DESCRIPTION("Attempt to use a non-solid polygon fill mode in a "
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001124 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001125
1126 ASSERT_NO_FATAL_FAILURE(InitState());
1127 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1128
1129 std::vector<const char *> device_extension_names;
1130 auto features = m_device->phy().features();
1131 // Artificially disable support for non-solid fill modes
1132 features.fillModeNonSolid = false;
1133 // The sacrificial device object
1134 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1135
1136 VkRenderpassObj render_pass(&test_device);
1137
1138 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1139 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1140 pipeline_layout_ci.setLayoutCount = 0;
1141 pipeline_layout_ci.pSetLayouts = NULL;
1142
1143 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001144 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001145 ASSERT_VK_SUCCESS(err);
1146
1147 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1148 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1149 rs_ci.pNext = nullptr;
1150 rs_ci.lineWidth = 1.0f;
1151 rs_ci.rasterizerDiscardEnable = true;
1152
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001153 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1154 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001155
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001156 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001157 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1158 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001159 {
1160 VkPipelineObj pipe(&test_device);
1161 pipe.AddShader(&vs);
1162 pipe.AddShader(&fs);
1163 pipe.AddColorAttachment();
1164 // Introduce failure by setting unsupported polygon mode
1165 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1166 pipe.SetRasterization(&rs_ci);
1167 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1168 }
1169 m_errorMonitor->VerifyFound();
1170
1171 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1173 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001174 {
1175 VkPipelineObj pipe(&test_device);
1176 pipe.AddShader(&vs);
1177 pipe.AddShader(&fs);
1178 pipe.AddColorAttachment();
1179 // Introduce failure by setting unsupported polygon mode
1180 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1181 pipe.SetRasterization(&rs_ci);
1182 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1183 }
1184 m_errorMonitor->VerifyFound();
1185
Cortd889ff92016-07-27 09:51:27 -07001186 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1187}
1188
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001189#endif // PARAMETER_VALIDATION_TESTS
1190
Tobin Ehlis0788f522015-05-26 16:11:58 -06001191#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001192#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001193TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001194{
1195 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001196 VkFenceCreateInfo fenceInfo = {};
1197 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1198 fenceInfo.pNext = NULL;
1199 fenceInfo.flags = 0;
1200
Mike Weiblencce7ec72016-10-17 19:33:05 -06001201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001202
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001203 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001204
1205 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1206 vk_testing::Buffer buffer;
1207 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001208
Tony Barbourfe3351b2015-07-28 10:17:20 -06001209 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001210 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001211 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001212
1213 testFence.init(*m_device, fenceInfo);
1214
1215 // Bypass framework since it does the waits automatically
1216 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001217 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001218 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1219 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001220 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001221 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001222 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001223 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001224 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001225 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001226 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001227
1228 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001229 ASSERT_VK_SUCCESS( err );
1230
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001231 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001232 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001233
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001234 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001235}
1236
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001237TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001238{
1239 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001240 VkFenceCreateInfo fenceInfo = {};
1241 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1242 fenceInfo.pNext = NULL;
1243 fenceInfo.flags = 0;
1244
Mike Weiblencce7ec72016-10-17 19:33:05 -06001245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001246
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001247 ASSERT_NO_FATAL_FAILURE(InitState());
1248 ASSERT_NO_FATAL_FAILURE(InitViewport());
1249 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1250
Tony Barbourfe3351b2015-07-28 10:17:20 -06001251 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001252 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001253 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001254
1255 testFence.init(*m_device, fenceInfo);
1256
1257 // Bypass framework since it does the waits automatically
1258 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001259 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001260 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1261 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001262 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001263 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001264 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001265 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001266 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001267 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001268 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001269
1270 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001271 ASSERT_VK_SUCCESS( err );
1272
Jon Ashburnf19916e2016-01-11 13:12:43 -07001273 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001274 VkCommandBufferBeginInfo info = {};
1275 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1276 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001277 info.renderPass = VK_NULL_HANDLE;
1278 info.subpass = 0;
1279 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001280 info.occlusionQueryEnable = VK_FALSE;
1281 info.queryFlags = 0;
1282 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001283
1284 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001285 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001286
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001287 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001288}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001289#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001290
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001291TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1292 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1293
1294 ASSERT_NO_FATAL_FAILURE(InitState());
1295
1296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1297 VkBuffer buffer;
1298 VkBufferCreateInfo buf_info = {};
1299 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1300 buf_info.pNext = NULL;
1301 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1302 buf_info.size = 2048;
1303 buf_info.queueFamilyIndexCount = 0;
1304 buf_info.pQueueFamilyIndices = NULL;
1305 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1306 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1307 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1308 m_errorMonitor->VerifyFound();
1309
1310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1311 VkImage image;
1312 VkImageCreateInfo image_create_info = {};
1313 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1314 image_create_info.pNext = NULL;
1315 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1316 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1317 image_create_info.extent.width = 512;
1318 image_create_info.extent.height = 64;
1319 image_create_info.extent.depth = 1;
1320 image_create_info.mipLevels = 1;
1321 image_create_info.arrayLayers = 1;
1322 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1323 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1324 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1325 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1326 image_create_info.queueFamilyIndexCount = 0;
1327 image_create_info.pQueueFamilyIndices = NULL;
1328 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1329 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1330 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1331 m_errorMonitor->VerifyFound();
1332}
1333
Tobin Ehlisf11be982016-05-11 13:52:53 -06001334TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1335 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1336 "buffer and image to memory such that they will alias.");
1337 VkResult err;
1338 bool pass;
1339 ASSERT_NO_FATAL_FAILURE(InitState());
1340
Tobin Ehlis077ded32016-05-12 17:39:13 -06001341 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001342 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001343 VkImage image2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001344 VkDeviceMemory mem; // buffer will be bound first
1345 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001346 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001347
1348 VkBufferCreateInfo buf_info = {};
1349 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1350 buf_info.pNext = NULL;
1351 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1352 buf_info.size = 256;
1353 buf_info.queueFamilyIndexCount = 0;
1354 buf_info.pQueueFamilyIndices = NULL;
1355 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1356 buf_info.flags = 0;
1357 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1358 ASSERT_VK_SUCCESS(err);
1359
Tobin Ehlis077ded32016-05-12 17:39:13 -06001360 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001361
1362 VkImageCreateInfo image_create_info = {};
1363 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1364 image_create_info.pNext = NULL;
1365 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1366 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1367 image_create_info.extent.width = 64;
1368 image_create_info.extent.height = 64;
1369 image_create_info.extent.depth = 1;
1370 image_create_info.mipLevels = 1;
1371 image_create_info.arrayLayers = 1;
1372 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001373 // Image tiling must be optimal to trigger error when aliasing linear buffer
1374 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001375 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1376 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1377 image_create_info.queueFamilyIndexCount = 0;
1378 image_create_info.pQueueFamilyIndices = NULL;
1379 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1380 image_create_info.flags = 0;
1381
Tobin Ehlisf11be982016-05-11 13:52:53 -06001382 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1383 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001384 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1385 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001386
Tobin Ehlis077ded32016-05-12 17:39:13 -06001387 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1388
1389 VkMemoryAllocateInfo alloc_info = {};
1390 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1391 alloc_info.pNext = NULL;
1392 alloc_info.memoryTypeIndex = 0;
1393 // Ensure memory is big enough for both bindings
1394 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001395 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1396 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001397 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001398 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001399 vkDestroyImage(m_device->device(), image, NULL);
1400 return;
1401 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001402 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1403 ASSERT_VK_SUCCESS(err);
1404 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1405 ASSERT_VK_SUCCESS(err);
1406
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001408 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001409 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1410 m_errorMonitor->VerifyFound();
1411
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001412 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001413 // aliasing buffer2
1414 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1415 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001416 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1417 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001418 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001419 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001421 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001422 m_errorMonitor->VerifyFound();
1423
1424 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001425 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001426 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001427 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001428 vkFreeMemory(m_device->device(), mem, NULL);
1429 vkFreeMemory(m_device->device(), mem_img, NULL);
1430}
1431
Tobin Ehlis35372522016-05-12 08:32:31 -06001432TEST_F(VkLayerTest, InvalidMemoryMapping) {
1433 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1434 VkResult err;
1435 bool pass;
1436 ASSERT_NO_FATAL_FAILURE(InitState());
1437
1438 VkBuffer buffer;
1439 VkDeviceMemory mem;
1440 VkMemoryRequirements mem_reqs;
1441
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001442 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1443
Tobin Ehlis35372522016-05-12 08:32:31 -06001444 VkBufferCreateInfo buf_info = {};
1445 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1446 buf_info.pNext = NULL;
1447 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1448 buf_info.size = 256;
1449 buf_info.queueFamilyIndexCount = 0;
1450 buf_info.pQueueFamilyIndices = NULL;
1451 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1452 buf_info.flags = 0;
1453 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1454 ASSERT_VK_SUCCESS(err);
1455
1456 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1457 VkMemoryAllocateInfo alloc_info = {};
1458 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1459 alloc_info.pNext = NULL;
1460 alloc_info.memoryTypeIndex = 0;
1461
1462 // Ensure memory is big enough for both bindings
1463 static const VkDeviceSize allocation_size = 0x10000;
1464 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001465 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001466 if (!pass) {
1467 vkDestroyBuffer(m_device->device(), buffer, NULL);
1468 return;
1469 }
1470 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1471 ASSERT_VK_SUCCESS(err);
1472
1473 uint8_t *pData;
1474 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001476 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1477 m_errorMonitor->VerifyFound();
1478 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001479 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001480 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1482 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1483 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001484 m_errorMonitor->VerifyFound();
1485
1486 // Unmap the memory to avoid re-map error
1487 vkUnmapMemory(m_device->device(), mem);
1488 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1490 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1491 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001492 m_errorMonitor->VerifyFound();
1493 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1495 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001496 m_errorMonitor->VerifyFound();
1497 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001499 vkUnmapMemory(m_device->device(), mem);
1500 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001501
Tobin Ehlis35372522016-05-12 08:32:31 -06001502 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001503 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001504 ASSERT_VK_SUCCESS(err);
1505 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001506 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001507 mmr.memory = mem;
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001508 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001510 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1511 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001512
Tobin Ehlis35372522016-05-12 08:32:31 -06001513 // Now flush range that oversteps mapped range
1514 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001515 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001516 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001517 mmr.offset = atom_size;
1518 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1520 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1521 m_errorMonitor->VerifyFound();
1522
1523 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1524 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001525 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001526 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001527 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001528 mmr.size = VK_WHOLE_SIZE;
1529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001530 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1531 m_errorMonitor->VerifyFound();
1532
Tony Barboure3975eb2016-12-15 14:52:44 -07001533#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001534 // Some platforms have an atomsize of 1 which makes the test meaningless
1535 if (atom_size > 3) {
1536 // Now with an offset NOT a multiple of the device limit
1537 vkUnmapMemory(m_device->device(), mem);
1538 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1539 ASSERT_VK_SUCCESS(err);
1540 mmr.offset = 3; // Not a multiple of atom_size
1541 mmr.size = VK_WHOLE_SIZE;
1542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1543 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1544 m_errorMonitor->VerifyFound();
1545
1546 // Now with a size NOT a multiple of the device limit
1547 vkUnmapMemory(m_device->device(), mem);
1548 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1549 ASSERT_VK_SUCCESS(err);
1550 mmr.offset = atom_size;
1551 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1553 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1554 m_errorMonitor->VerifyFound();
1555 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001556#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001557 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1558 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001559 if (!pass) {
1560 vkFreeMemory(m_device->device(), mem, NULL);
1561 vkDestroyBuffer(m_device->device(), buffer, NULL);
1562 return;
1563 }
1564 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1565 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1566
1567 vkDestroyBuffer(m_device->device(), buffer, NULL);
1568 vkFreeMemory(m_device->device(), mem, NULL);
1569}
1570
Chris Forbes09368e42016-10-13 11:59:22 +13001571#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001572TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1573 VkResult err;
1574 bool pass;
1575
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001576 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1577 // following declaration (which is temporarily being moved below):
1578 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001579 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001580 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001581 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001582 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001583 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001584 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001585
1586 ASSERT_NO_FATAL_FAILURE(InitState());
1587
Ian Elliott3f06ce52016-04-29 14:46:21 -06001588#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1589#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1590 // Use the functions from the VK_KHR_android_surface extension without
1591 // enabling that extension:
1592
1593 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001594 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1596 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001597 pass = (err != VK_SUCCESS);
1598 ASSERT_TRUE(pass);
1599 m_errorMonitor->VerifyFound();
1600#endif // VK_USE_PLATFORM_ANDROID_KHR
1601
Ian Elliott3f06ce52016-04-29 14:46:21 -06001602#if defined(VK_USE_PLATFORM_MIR_KHR)
1603 // Use the functions from the VK_KHR_mir_surface extension without enabling
1604 // that extension:
1605
1606 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001607 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001609 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1610 pass = (err != VK_SUCCESS);
1611 ASSERT_TRUE(pass);
1612 m_errorMonitor->VerifyFound();
1613
1614 // Tell whether an mir_connection supports presentation:
1615 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1617 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001618 m_errorMonitor->VerifyFound();
1619#endif // VK_USE_PLATFORM_MIR_KHR
1620
Ian Elliott3f06ce52016-04-29 14:46:21 -06001621#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1622 // Use the functions from the VK_KHR_wayland_surface extension without
1623 // enabling that extension:
1624
1625 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001626 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1628 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001629 pass = (err != VK_SUCCESS);
1630 ASSERT_TRUE(pass);
1631 m_errorMonitor->VerifyFound();
1632
1633 // Tell whether an wayland_display supports presentation:
1634 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1636 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001637 m_errorMonitor->VerifyFound();
1638#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06001639#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001640
Ian Elliott3f06ce52016-04-29 14:46:21 -06001641#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001642 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1643 // TO NON-LINUX PLATFORMS:
1644 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001645 // Use the functions from the VK_KHR_win32_surface extension without
1646 // enabling that extension:
1647
1648 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001649 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1651 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001652 pass = (err != VK_SUCCESS);
1653 ASSERT_TRUE(pass);
1654 m_errorMonitor->VerifyFound();
1655
1656 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001658 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001659 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001660// Set this (for now, until all platforms are supported and tested):
1661#define NEED_TO_TEST_THIS_ON_PLATFORM
1662#endif // VK_USE_PLATFORM_WIN32_KHR
Tony Barbour2e7bd402016-11-14 14:46:33 -07001663#if defined(VK_USE_PLATFORM_XCB_KHR) || defined (VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001664 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1665 // TO NON-LINUX PLATFORMS:
1666 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001667#endif
1668#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001669 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1670 // that extension:
1671
1672 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001673 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001675 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1676 pass = (err != VK_SUCCESS);
1677 ASSERT_TRUE(pass);
1678 m_errorMonitor->VerifyFound();
1679
1680 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001681 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001682 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1684 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001685 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001686// Set this (for now, until all platforms are supported and tested):
1687#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001688#endif // VK_USE_PLATFORM_XCB_KHR
1689
Ian Elliott12630812016-04-29 14:35:43 -06001690#if defined(VK_USE_PLATFORM_XLIB_KHR)
1691 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1692 // that extension:
1693
1694 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001695 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001697 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1698 pass = (err != VK_SUCCESS);
1699 ASSERT_TRUE(pass);
1700 m_errorMonitor->VerifyFound();
1701
1702 // Tell whether an Xlib VisualID supports presentation:
1703 Display *dpy = NULL;
1704 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001706 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1707 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001708// Set this (for now, until all platforms are supported and tested):
1709#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06001710#endif // VK_USE_PLATFORM_XLIB_KHR
1711
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001712// Use the functions from the VK_KHR_surface extension without enabling
1713// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001714
Ian Elliott489eec02016-05-05 14:12:44 -06001715#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001716 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001718 vkDestroySurfaceKHR(instance(), surface, NULL);
1719 m_errorMonitor->VerifyFound();
1720
1721 // Check if surface supports presentation:
1722 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001724 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1725 pass = (err != VK_SUCCESS);
1726 ASSERT_TRUE(pass);
1727 m_errorMonitor->VerifyFound();
1728
1729 // Check surface capabilities:
1730 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1732 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001733 pass = (err != VK_SUCCESS);
1734 ASSERT_TRUE(pass);
1735 m_errorMonitor->VerifyFound();
1736
1737 // Check surface formats:
1738 uint32_t format_count = 0;
1739 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1741 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001742 pass = (err != VK_SUCCESS);
1743 ASSERT_TRUE(pass);
1744 m_errorMonitor->VerifyFound();
1745
1746 // Check surface present modes:
1747 uint32_t present_mode_count = 0;
1748 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001749 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1750 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001751 pass = (err != VK_SUCCESS);
1752 ASSERT_TRUE(pass);
1753 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001754#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001755
Ian Elliott1c32c772016-04-28 14:47:13 -06001756 // Use the functions from the VK_KHR_swapchain extension without enabling
1757 // that extension:
1758
1759 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001761 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1762 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001763 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001764 pass = (err != VK_SUCCESS);
1765 ASSERT_TRUE(pass);
1766 m_errorMonitor->VerifyFound();
1767
1768 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001769 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1770 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001771 pass = (err != VK_SUCCESS);
1772 ASSERT_TRUE(pass);
1773 m_errorMonitor->VerifyFound();
1774
Chris Forbeseb7d5502016-09-13 18:19:21 +12001775 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1776 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1777 VkFence fence;
1778 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1779
Ian Elliott1c32c772016-04-28 14:47:13 -06001780 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001782 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001783 pass = (err != VK_SUCCESS);
1784 ASSERT_TRUE(pass);
1785 m_errorMonitor->VerifyFound();
1786
Chris Forbeseb7d5502016-09-13 18:19:21 +12001787 vkDestroyFence(m_device->device(), fence, nullptr);
1788
Ian Elliott1c32c772016-04-28 14:47:13 -06001789 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001790 //
1791 // NOTE: Currently can't test this because a real swapchain is needed (as
1792 // opposed to the fake one we created) in order for the layer to lookup the
1793 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001794
1795 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001797 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1798 m_errorMonitor->VerifyFound();
1799}
Chris Forbes09368e42016-10-13 11:59:22 +13001800#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001801
Karl Schultz6addd812016-02-02 17:17:23 -07001802TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1803 VkResult err;
1804 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001805
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1807 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001808
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001809 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001810
1811 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001812 VkImage image;
1813 VkDeviceMemory mem;
1814 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001815
Karl Schultz6addd812016-02-02 17:17:23 -07001816 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1817 const int32_t tex_width = 32;
1818 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001819
Tony Barboureb254902015-07-15 12:50:33 -06001820 VkImageCreateInfo image_create_info = {};
1821 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001822 image_create_info.pNext = NULL;
1823 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1824 image_create_info.format = tex_format;
1825 image_create_info.extent.width = tex_width;
1826 image_create_info.extent.height = tex_height;
1827 image_create_info.extent.depth = 1;
1828 image_create_info.mipLevels = 1;
1829 image_create_info.arrayLayers = 1;
1830 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1831 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1832 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1833 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12001834 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001835
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001836 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001837 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001838 mem_alloc.pNext = NULL;
1839 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001840
Chia-I Wuf7458c52015-10-26 21:10:41 +08001841 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001842 ASSERT_VK_SUCCESS(err);
1843
Karl Schultz6addd812016-02-02 17:17:23 -07001844 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001845
Mark Lobodzinski23065352015-05-29 09:32:35 -05001846 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001847
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001848 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Karl Schultz6addd812016-02-02 17:17:23 -07001849 if (!pass) { // If we can't find any unmappable memory this test doesn't
1850 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001851 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001852 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001853 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001854
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001855 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001856 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001857 ASSERT_VK_SUCCESS(err);
1858
1859 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06001860 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001861 ASSERT_VK_SUCCESS(err);
1862
1863 // Map memory as if to initialize the image
1864 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001865 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001866
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001867 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001868
Chia-I Wuf7458c52015-10-26 21:10:41 +08001869 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06001870 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001871}
1872
Karl Schultz6addd812016-02-02 17:17:23 -07001873TEST_F(VkLayerTest, RebindMemory) {
1874 VkResult err;
1875 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001876
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001878
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001879 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001880
1881 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001882 VkImage image;
1883 VkDeviceMemory mem1;
1884 VkDeviceMemory mem2;
1885 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001886
Karl Schultz6addd812016-02-02 17:17:23 -07001887 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1888 const int32_t tex_width = 32;
1889 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001890
Tony Barboureb254902015-07-15 12:50:33 -06001891 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001892 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1893 image_create_info.pNext = NULL;
1894 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1895 image_create_info.format = tex_format;
1896 image_create_info.extent.width = tex_width;
1897 image_create_info.extent.height = tex_height;
1898 image_create_info.extent.depth = 1;
1899 image_create_info.mipLevels = 1;
1900 image_create_info.arrayLayers = 1;
1901 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1902 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1903 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1904 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001905
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001906 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001907 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1908 mem_alloc.pNext = NULL;
1909 mem_alloc.allocationSize = 0;
1910 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001911
Karl Schultz6addd812016-02-02 17:17:23 -07001912 // Introduce failure, do NOT set memProps to
1913 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001914 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001915 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001916 ASSERT_VK_SUCCESS(err);
1917
Karl Schultz6addd812016-02-02 17:17:23 -07001918 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001919
1920 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001921 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001922 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001923
1924 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001925 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001926 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001928 ASSERT_VK_SUCCESS(err);
1929
1930 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001931 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001932 ASSERT_VK_SUCCESS(err);
1933
Karl Schultz6addd812016-02-02 17:17:23 -07001934 // Introduce validation failure, try to bind a different memory object to
1935 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001936 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001937
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001938 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001939
Chia-I Wuf7458c52015-10-26 21:10:41 +08001940 vkDestroyImage(m_device->device(), image, NULL);
1941 vkFreeMemory(m_device->device(), mem1, NULL);
1942 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001943}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001944
Karl Schultz6addd812016-02-02 17:17:23 -07001945TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001946 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001947
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1949 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001950
1951 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001952 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1953 fenceInfo.pNext = NULL;
1954 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001955
Tony Barbour300a6082015-04-07 13:44:53 -06001956 ASSERT_NO_FATAL_FAILURE(InitState());
1957 ASSERT_NO_FATAL_FAILURE(InitViewport());
1958 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1959
Tony Barbourfe3351b2015-07-28 10:17:20 -06001960 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001961 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001962 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001963
1964 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001965
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001966 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001967 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1968 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001969 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001970 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001971 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001972 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001973 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001974 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001975 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001976
1977 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001978 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001979
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001980 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001981}
Chris Forbes4e44c912016-06-16 10:20:00 +12001982
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001983TEST_F(VkLayerTest, InvalidUsageBits) {
1984 TEST_DESCRIPTION("Specify wrong usage for image then create conflicting view of image "
1985 "Initialize buffer with wrong usage then perform copy expecting errors "
1986 "from both the image and the buffer (2 calls)");
1987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001988
1989 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesd2b5fe42016-11-28 18:00:00 +13001990
1991 auto format = VK_FORMAT_D24_UNORM_S8_UINT;
1992
Tony Barbourf92621a2016-05-02 14:28:12 -06001993 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06001994 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13001995 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001996 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001997
Tony Barbourf92621a2016-05-02 14:28:12 -06001998 VkImageView dsv;
1999 VkImageViewCreateInfo dsvci = {};
2000 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2001 dsvci.image = image.handle();
2002 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002003 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002004 dsvci.subresourceRange.layerCount = 1;
2005 dsvci.subresourceRange.baseMipLevel = 0;
2006 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002007 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002008
Tony Barbourf92621a2016-05-02 14:28:12 -06002009 // Create a view with depth / stencil aspect for image with different usage
2010 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002011
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002012 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002013
2014 // Initialize buffer with TRANSFER_DST usage
2015 vk_testing::Buffer buffer;
2016 VkMemoryPropertyFlags reqs = 0;
2017 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2018 VkBufferImageCopy region = {};
2019 region.bufferRowLength = 128;
2020 region.bufferImageHeight = 128;
2021 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2022 region.imageSubresource.layerCount = 1;
2023 region.imageExtent.height = 16;
2024 region.imageExtent.width = 16;
2025 region.imageExtent.depth = 1;
2026
Tony Barbourf92621a2016-05-02 14:28:12 -06002027 // Buffer usage not set to TRANSFER_SRC and image usage not set to
2028 // TRANSFER_DST
2029 BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002030
Chris Forbesda581202016-10-06 18:25:26 +13002031 // two separate errors from this call:
2032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2034
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002035 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2036 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002037 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002038}
Tony Barbour75d79f02016-08-30 09:39:07 -06002039
Tony Barbour75d79f02016-08-30 09:39:07 -06002040
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002041#endif // MEM_TRACKER_TESTS
2042
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06002043#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002044
2045TEST_F(VkLayerTest, LeakAnObject) {
2046 VkResult err;
2047
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002048 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002049
2050 // Note that we have to create a new device since destroying the
2051 // framework's device causes Teardown() to fail and just calling Teardown
2052 // will destroy the errorMonitor.
2053
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002055
2056 ASSERT_NO_FATAL_FAILURE(InitState());
2057
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002058 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002059 std::vector<VkDeviceQueueCreateInfo> queue_info;
2060 queue_info.reserve(queue_props.size());
2061 std::vector<std::vector<float>> queue_priorities;
2062 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2063 VkDeviceQueueCreateInfo qi = {};
2064 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2065 qi.pNext = NULL;
2066 qi.queueFamilyIndex = i;
2067 qi.queueCount = queue_props[i].queueCount;
2068 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2069 qi.pQueuePriorities = queue_priorities[i].data();
2070 queue_info.push_back(qi);
2071 }
2072
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002073 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002074
2075 // The sacrificial device object
2076 VkDevice testDevice;
2077 VkDeviceCreateInfo device_create_info = {};
2078 auto features = m_device->phy().features();
2079 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2080 device_create_info.pNext = NULL;
2081 device_create_info.queueCreateInfoCount = queue_info.size();
2082 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002083 device_create_info.enabledLayerCount = 0;
2084 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002085 device_create_info.pEnabledFeatures = &features;
2086 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2087 ASSERT_VK_SUCCESS(err);
2088
2089 VkFence fence;
2090 VkFenceCreateInfo fence_create_info = {};
2091 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2092 fence_create_info.pNext = NULL;
2093 fence_create_info.flags = 0;
2094 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2095 ASSERT_VK_SUCCESS(err);
2096
2097 // Induce failure by not calling vkDestroyFence
2098 vkDestroyDevice(testDevice, NULL);
2099 m_errorMonitor->VerifyFound();
2100}
2101
2102TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
2103
2104 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
2105 "attempt to delete them from another.");
2106
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002108
Cody Northropc31a84f2016-08-22 10:41:47 -06002109 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002110 VkCommandPool command_pool_one;
2111 VkCommandPool command_pool_two;
2112
2113 VkCommandPoolCreateInfo pool_create_info{};
2114 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2115 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2116 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2117
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002118 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002119
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002120 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002121
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002122 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002123 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002124 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002125 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002126 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002127 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002128 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002129
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002130 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002131
2132 m_errorMonitor->VerifyFound();
2133
2134 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2135 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2136}
2137
2138TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2139 VkResult err;
2140
2141 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002142 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002143
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002145
2146 ASSERT_NO_FATAL_FAILURE(InitState());
2147 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2148
2149 VkDescriptorPoolSize ds_type_count = {};
2150 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2151 ds_type_count.descriptorCount = 1;
2152
2153 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2154 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2155 ds_pool_ci.pNext = NULL;
2156 ds_pool_ci.flags = 0;
2157 ds_pool_ci.maxSets = 1;
2158 ds_pool_ci.poolSizeCount = 1;
2159 ds_pool_ci.pPoolSizes = &ds_type_count;
2160
2161 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002162 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002163 ASSERT_VK_SUCCESS(err);
2164
2165 // Create a second descriptor pool
2166 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002167 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002168 ASSERT_VK_SUCCESS(err);
2169
2170 VkDescriptorSetLayoutBinding dsl_binding = {};
2171 dsl_binding.binding = 0;
2172 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2173 dsl_binding.descriptorCount = 1;
2174 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2175 dsl_binding.pImmutableSamplers = NULL;
2176
2177 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2178 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2179 ds_layout_ci.pNext = NULL;
2180 ds_layout_ci.bindingCount = 1;
2181 ds_layout_ci.pBindings = &dsl_binding;
2182
2183 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002184 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002185 ASSERT_VK_SUCCESS(err);
2186
2187 VkDescriptorSet descriptorSet;
2188 VkDescriptorSetAllocateInfo alloc_info = {};
2189 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2190 alloc_info.descriptorSetCount = 1;
2191 alloc_info.descriptorPool = ds_pool_one;
2192 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002193 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002194 ASSERT_VK_SUCCESS(err);
2195
2196 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2197
2198 m_errorMonitor->VerifyFound();
2199
2200 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2201 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2202 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2203}
2204
2205TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002207
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002208 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002209
2210 ASSERT_NO_FATAL_FAILURE(InitState());
2211
2212 // Pass bogus handle into GetImageMemoryRequirements
2213 VkMemoryRequirements mem_reqs;
2214 uint64_t fakeImageHandle = 0xCADECADE;
2215 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2216
2217 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2218
2219 m_errorMonitor->VerifyFound();
2220}
2221
Karl Schultz6addd812016-02-02 17:17:23 -07002222TEST_F(VkLayerTest, PipelineNotBound) {
2223 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002224
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002225 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002226
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002228
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002229 ASSERT_NO_FATAL_FAILURE(InitState());
2230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002231
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002232 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002233 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2234 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002235
2236 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002237 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2238 ds_pool_ci.pNext = NULL;
2239 ds_pool_ci.maxSets = 1;
2240 ds_pool_ci.poolSizeCount = 1;
2241 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002242
2243 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002244 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002245 ASSERT_VK_SUCCESS(err);
2246
2247 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002248 dsl_binding.binding = 0;
2249 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2250 dsl_binding.descriptorCount = 1;
2251 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2252 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002253
2254 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002255 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2256 ds_layout_ci.pNext = NULL;
2257 ds_layout_ci.bindingCount = 1;
2258 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002259
2260 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002261 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002262 ASSERT_VK_SUCCESS(err);
2263
2264 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002265 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002266 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002267 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002268 alloc_info.descriptorPool = ds_pool;
2269 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002270 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002271 ASSERT_VK_SUCCESS(err);
2272
2273 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002274 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2275 pipeline_layout_ci.pNext = NULL;
2276 pipeline_layout_ci.setLayoutCount = 1;
2277 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002278
2279 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002280 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002281 ASSERT_VK_SUCCESS(err);
2282
Mark Youngad779052016-01-06 14:26:04 -07002283 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002284
2285 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002286 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002287
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002288 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002289
Chia-I Wuf7458c52015-10-26 21:10:41 +08002290 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2291 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2292 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002293}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002294
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002295TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2296 VkResult err;
2297
2298 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
2299 "during bind[Buffer|Image]Memory time");
2300
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002301 ASSERT_NO_FATAL_FAILURE(InitState());
2302
2303 // Create an image, allocate memory, set a bad typeIndex and then try to
2304 // bind it
2305 VkImage image;
2306 VkDeviceMemory mem;
2307 VkMemoryRequirements mem_reqs;
2308 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2309 const int32_t tex_width = 32;
2310 const int32_t tex_height = 32;
2311
2312 VkImageCreateInfo image_create_info = {};
2313 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2314 image_create_info.pNext = NULL;
2315 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2316 image_create_info.format = tex_format;
2317 image_create_info.extent.width = tex_width;
2318 image_create_info.extent.height = tex_height;
2319 image_create_info.extent.depth = 1;
2320 image_create_info.mipLevels = 1;
2321 image_create_info.arrayLayers = 1;
2322 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2323 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2324 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2325 image_create_info.flags = 0;
2326
2327 VkMemoryAllocateInfo mem_alloc = {};
2328 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2329 mem_alloc.pNext = NULL;
2330 mem_alloc.allocationSize = 0;
2331 mem_alloc.memoryTypeIndex = 0;
2332
2333 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2334 ASSERT_VK_SUCCESS(err);
2335
2336 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2337 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002338
2339 // Introduce Failure, select invalid TypeIndex
2340 VkPhysicalDeviceMemoryProperties memory_info;
2341
2342 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2343 unsigned int i;
2344 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2345 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2346 mem_alloc.memoryTypeIndex = i;
2347 break;
2348 }
2349 }
2350 if (i >= memory_info.memoryTypeCount) {
2351 printf("No invalid memory type index could be found; skipped.\n");
2352 vkDestroyImage(m_device->device(), image, NULL);
2353 return;
2354 }
2355
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002357
2358 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2359 ASSERT_VK_SUCCESS(err);
2360
2361 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2362 (void)err;
2363
2364 m_errorMonitor->VerifyFound();
2365
2366 vkDestroyImage(m_device->device(), image, NULL);
2367 vkFreeMemory(m_device->device(), mem, NULL);
2368}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002369
Karl Schultz6addd812016-02-02 17:17:23 -07002370TEST_F(VkLayerTest, BindInvalidMemory) {
2371 VkResult err;
2372 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002373
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002375
Tobin Ehlisec598302015-09-15 15:02:17 -06002376 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002377
2378 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002379 VkImage image;
2380 VkDeviceMemory mem;
2381 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002382
Karl Schultz6addd812016-02-02 17:17:23 -07002383 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2384 const int32_t tex_width = 32;
2385 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002386
2387 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002388 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2389 image_create_info.pNext = NULL;
2390 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2391 image_create_info.format = tex_format;
2392 image_create_info.extent.width = tex_width;
2393 image_create_info.extent.height = tex_height;
2394 image_create_info.extent.depth = 1;
2395 image_create_info.mipLevels = 1;
2396 image_create_info.arrayLayers = 1;
2397 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2398 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2399 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2400 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002401
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002402 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002403 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2404 mem_alloc.pNext = NULL;
2405 mem_alloc.allocationSize = 0;
2406 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002407
Chia-I Wuf7458c52015-10-26 21:10:41 +08002408 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002409 ASSERT_VK_SUCCESS(err);
2410
Karl Schultz6addd812016-02-02 17:17:23 -07002411 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002412
2413 mem_alloc.allocationSize = mem_reqs.size;
2414
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002415 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002416 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002417
2418 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002419 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002420 ASSERT_VK_SUCCESS(err);
2421
2422 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002423 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002424
2425 // Try to bind free memory that has been freed
2426 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2427 // This may very well return an error.
2428 (void)err;
2429
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002430 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002431
Chia-I Wuf7458c52015-10-26 21:10:41 +08002432 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002433}
2434
Karl Schultz6addd812016-02-02 17:17:23 -07002435TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2436 VkResult err;
2437 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002438
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002440
Tobin Ehlisec598302015-09-15 15:02:17 -06002441 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002442
Karl Schultz6addd812016-02-02 17:17:23 -07002443 // Create an image object, allocate memory, destroy the object and then try
2444 // to bind it
2445 VkImage image;
2446 VkDeviceMemory mem;
2447 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002448
Karl Schultz6addd812016-02-02 17:17:23 -07002449 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2450 const int32_t tex_width = 32;
2451 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002452
2453 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002454 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2455 image_create_info.pNext = NULL;
2456 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2457 image_create_info.format = tex_format;
2458 image_create_info.extent.width = tex_width;
2459 image_create_info.extent.height = tex_height;
2460 image_create_info.extent.depth = 1;
2461 image_create_info.mipLevels = 1;
2462 image_create_info.arrayLayers = 1;
2463 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2464 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2465 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2466 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002467
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002468 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002469 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2470 mem_alloc.pNext = NULL;
2471 mem_alloc.allocationSize = 0;
2472 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002473
Chia-I Wuf7458c52015-10-26 21:10:41 +08002474 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002475 ASSERT_VK_SUCCESS(err);
2476
Karl Schultz6addd812016-02-02 17:17:23 -07002477 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002478
2479 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002480 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002481 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002482
2483 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002484 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002485 ASSERT_VK_SUCCESS(err);
2486
2487 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002488 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002489 ASSERT_VK_SUCCESS(err);
2490
2491 // Now Try to bind memory to this destroyed object
2492 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2493 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002494 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002495
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002496 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002497
Chia-I Wuf7458c52015-10-26 21:10:41 +08002498 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002499}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002500
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002501#endif // OBJ_TRACKER_TESTS
2502
Tobin Ehlis0788f522015-05-26 16:11:58 -06002503#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002504
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002505TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
2506 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
2507
2508 ASSERT_NO_FATAL_FAILURE(InitState());
2509 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2510
2511 VkVertexInputBindingDescription input_binding;
2512 memset(&input_binding, 0, sizeof(input_binding));
2513
2514 VkVertexInputAttributeDescription input_attribs;
2515 memset(&input_attribs, 0, sizeof(input_attribs));
2516
2517 // Pick a really bad format for this purpose and make sure it should fail
2518 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
2519 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
2520 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
2521 printf("Format unsuitable for test; skipped.\n");
2522 return;
2523 }
2524
2525 input_attribs.location = 0;
2526 char const *vsSource = "#version 450\n"
2527 "\n"
2528 "out gl_PerVertex {\n"
2529 " vec4 gl_Position;\n"
2530 "};\n"
2531 "void main(){\n"
2532 " gl_Position = vec4(1);\n"
2533 "}\n";
2534 char const *fsSource = "#version 450\n"
2535 "\n"
2536 "layout(location=0) out vec4 color;\n"
2537 "void main(){\n"
2538 " color = vec4(1);\n"
2539 "}\n";
2540
2541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
2542 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2543 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2544
2545 VkPipelineObj pipe(m_device);
2546 pipe.AddColorAttachment();
2547 pipe.AddShader(&vs);
2548 pipe.AddShader(&fs);
2549
2550 pipe.AddVertexInputBindings(&input_binding, 1);
2551 pipe.AddVertexInputAttribs(&input_attribs, 1);
2552
2553 VkDescriptorSetObj descriptorSet(m_device);
2554 descriptorSet.AppendDummy();
2555 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
2556
2557 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
2558
2559 m_errorMonitor->VerifyFound();
2560}
2561
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002562TEST_F(VkLayerTest, ImageSampleCounts) {
2563
2564 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger "
2565 "validation errors.");
2566 ASSERT_NO_FATAL_FAILURE(InitState());
2567
2568 VkMemoryPropertyFlags reqs = 0;
2569 VkImageCreateInfo image_create_info = {};
2570 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2571 image_create_info.pNext = NULL;
2572 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2573 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
2574 image_create_info.extent.width = 256;
2575 image_create_info.extent.height = 256;
2576 image_create_info.extent.depth = 1;
2577 image_create_info.mipLevels = 1;
2578 image_create_info.arrayLayers = 1;
2579 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2580 image_create_info.flags = 0;
2581
2582 VkImageBlit blit_region = {};
2583 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2584 blit_region.srcSubresource.baseArrayLayer = 0;
2585 blit_region.srcSubresource.layerCount = 1;
2586 blit_region.srcSubresource.mipLevel = 0;
2587 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2588 blit_region.dstSubresource.baseArrayLayer = 0;
2589 blit_region.dstSubresource.layerCount = 1;
2590 blit_region.dstSubresource.mipLevel = 0;
2591
2592 // Create two images, the source with sampleCount = 2, and attempt to blit
2593 // between them
2594 {
2595 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002596 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002597 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002598 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002599 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002600 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002601 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002602 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002603 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2605 "of VK_SAMPLE_COUNT_2_BIT but "
2606 "must be VK_SAMPLE_COUNT_1_BIT");
2607 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2608 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002609 m_errorMonitor->VerifyFound();
2610 m_commandBuffer->EndCommandBuffer();
2611 }
2612
2613 // Create two images, the dest with sampleCount = 4, and attempt to blit
2614 // between them
2615 {
2616 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002617 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002618 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002619 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002620 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002621 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002622 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002623 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002624 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2626 "of VK_SAMPLE_COUNT_4_BIT but "
2627 "must be VK_SAMPLE_COUNT_1_BIT");
2628 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2629 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002630 m_errorMonitor->VerifyFound();
2631 m_commandBuffer->EndCommandBuffer();
2632 }
2633
2634 VkBufferImageCopy copy_region = {};
2635 copy_region.bufferRowLength = 128;
2636 copy_region.bufferImageHeight = 128;
2637 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2638 copy_region.imageSubresource.layerCount = 1;
2639 copy_region.imageExtent.height = 64;
2640 copy_region.imageExtent.width = 64;
2641 copy_region.imageExtent.depth = 1;
2642
2643 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
2644 // buffer to image
2645 {
2646 vk_testing::Buffer src_buffer;
2647 VkMemoryPropertyFlags reqs = 0;
2648 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
2649 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002650 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002651 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002652 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002653 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2655 "of VK_SAMPLE_COUNT_8_BIT but "
2656 "must be VK_SAMPLE_COUNT_1_BIT");
2657 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
2658 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002659 m_errorMonitor->VerifyFound();
2660 m_commandBuffer->EndCommandBuffer();
2661 }
2662
2663 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
2664 // image to buffer
2665 {
2666 vk_testing::Buffer dst_buffer;
2667 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
2668 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002669 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002670 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002671 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002672 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2674 "of VK_SAMPLE_COUNT_2_BIT but "
2675 "must be VK_SAMPLE_COUNT_1_BIT");
2676 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002677 dst_buffer.handle(), 1, &copy_region);
2678 m_errorMonitor->VerifyFound();
2679 m_commandBuffer->EndCommandBuffer();
2680 }
2681}
2682
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002683TEST_F(VkLayerTest, BlitImageFormats) {
2684
2685 // Image blit with mismatched formats
2686 const char * expected_message =
2687 "vkCmdBlitImage: If one of srcImage and dstImage images has signed/unsigned integer format,"
2688 " the other one must also have signed/unsigned integer format";
2689
2690 ASSERT_NO_FATAL_FAILURE(InitState());
2691
2692 VkImageObj src_image(m_device);
2693 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
2694 VkImageObj dst_image(m_device);
2695 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
2696 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06002697 dst_image2.init(64, 64, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002698
2699 VkImageBlit blitRegion = {};
2700 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2701 blitRegion.srcSubresource.baseArrayLayer = 0;
2702 blitRegion.srcSubresource.layerCount = 1;
2703 blitRegion.srcSubresource.mipLevel = 0;
2704 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2705 blitRegion.dstSubresource.baseArrayLayer = 0;
2706 blitRegion.dstSubresource.layerCount = 1;
2707 blitRegion.dstSubresource.mipLevel = 0;
2708
2709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, expected_message);
2710
2711 // Unsigned int vs not an int
2712 BeginCommandBuffer();
2713 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(),
2714 dst_image.layout(), 1, &blitRegion, VK_FILTER_NEAREST);
2715
2716 m_errorMonitor->VerifyFound();
2717
2718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, expected_message);
2719
2720 // Unsigned int vs signed int
2721 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(),
2722 dst_image2.layout(), 1, &blitRegion, VK_FILTER_NEAREST);
2723
2724 m_errorMonitor->VerifyFound();
2725
2726 EndCommandBuffer();
2727}
2728
2729
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002730TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
2731 VkResult err;
2732 bool pass;
2733
2734 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
2735 ASSERT_NO_FATAL_FAILURE(InitState());
2736
2737 // If w/d/h granularity is 1, test is not meaningful
2738 // TODO: When virtual device limits are available, create a set of limits for this test that
2739 // will always have a granularity of > 1 for w, h, and d
2740 auto index = m_device->graphics_queue_node_index_;
2741 auto queue_family_properties = m_device->phy().queue_properties();
2742
2743 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
2744 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
2745 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
2746 return;
2747 }
2748
2749 // Create two images of different types and try to copy between them
2750 VkImage srcImage;
2751 VkImage dstImage;
2752 VkDeviceMemory srcMem;
2753 VkDeviceMemory destMem;
2754 VkMemoryRequirements memReqs;
2755
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002756 VkImageCreateInfo image_create_info = {};
2757 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2758 image_create_info.pNext = NULL;
2759 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2760 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
2761 image_create_info.extent.width = 32;
2762 image_create_info.extent.height = 32;
2763 image_create_info.extent.depth = 1;
2764 image_create_info.mipLevels = 1;
2765 image_create_info.arrayLayers = 4;
2766 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2767 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2768 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2769 image_create_info.flags = 0;
2770
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002771 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002772 ASSERT_VK_SUCCESS(err);
2773
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002774 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002775 ASSERT_VK_SUCCESS(err);
2776
2777 // Allocate memory
2778 VkMemoryAllocateInfo memAlloc = {};
2779 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2780 memAlloc.pNext = NULL;
2781 memAlloc.allocationSize = 0;
2782 memAlloc.memoryTypeIndex = 0;
2783
2784 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
2785 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002786 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002787 ASSERT_TRUE(pass);
2788 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
2789 ASSERT_VK_SUCCESS(err);
2790
2791 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
2792 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002793 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002794 ASSERT_VK_SUCCESS(err);
2795 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
2796 ASSERT_VK_SUCCESS(err);
2797
2798 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
2799 ASSERT_VK_SUCCESS(err);
2800 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
2801 ASSERT_VK_SUCCESS(err);
2802
2803 BeginCommandBuffer();
2804 VkImageCopy copyRegion;
2805 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2806 copyRegion.srcSubresource.mipLevel = 0;
2807 copyRegion.srcSubresource.baseArrayLayer = 0;
2808 copyRegion.srcSubresource.layerCount = 1;
2809 copyRegion.srcOffset.x = 0;
2810 copyRegion.srcOffset.y = 0;
2811 copyRegion.srcOffset.z = 0;
2812 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2813 copyRegion.dstSubresource.mipLevel = 0;
2814 copyRegion.dstSubresource.baseArrayLayer = 0;
2815 copyRegion.dstSubresource.layerCount = 1;
2816 copyRegion.dstOffset.x = 0;
2817 copyRegion.dstOffset.y = 0;
2818 copyRegion.dstOffset.z = 0;
2819 copyRegion.extent.width = 1;
2820 copyRegion.extent.height = 1;
2821 copyRegion.extent.depth = 1;
2822
2823 // Introduce failure by setting srcOffset to a bad granularity value
2824 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2826 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002827 m_errorMonitor->VerifyFound();
2828
2829 // Introduce failure by setting extent to a bad granularity value
2830 copyRegion.srcOffset.y = 0;
2831 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2833 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002834 m_errorMonitor->VerifyFound();
2835
2836 // Now do some buffer/image copies
2837 vk_testing::Buffer buffer;
2838 VkMemoryPropertyFlags reqs = 0;
2839 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2840 VkBufferImageCopy region = {};
2841 region.bufferOffset = 0;
2842 region.bufferRowLength = 3;
2843 region.bufferImageHeight = 128;
2844 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2845 region.imageSubresource.layerCount = 1;
2846 region.imageExtent.height = 16;
2847 region.imageExtent.width = 16;
2848 region.imageExtent.depth = 1;
2849 region.imageOffset.x = 0;
2850 region.imageOffset.y = 0;
2851 region.imageOffset.z = 0;
2852
2853 // Introduce failure by setting bufferRowLength to a bad granularity value
2854 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2856 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2857 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002858 m_errorMonitor->VerifyFound();
2859 region.bufferRowLength = 128;
2860
2861 // Introduce failure by setting bufferOffset to a bad granularity value
2862 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2864 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
2865 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002866 m_errorMonitor->VerifyFound();
2867 region.bufferOffset = 0;
2868
2869 // Introduce failure by setting bufferImageHeight to a bad granularity value
2870 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2872 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
2873 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002874 m_errorMonitor->VerifyFound();
2875 region.bufferImageHeight = 128;
2876
2877 // Introduce failure by setting imageExtent to a bad granularity value
2878 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2880 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
2881 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002882 m_errorMonitor->VerifyFound();
2883 region.imageExtent.width = 16;
2884
2885 // Introduce failure by setting imageOffset to a bad granularity value
2886 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2888 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2889 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002890 m_errorMonitor->VerifyFound();
2891
2892 EndCommandBuffer();
2893
2894 vkDestroyImage(m_device->device(), srcImage, NULL);
2895 vkDestroyImage(m_device->device(), dstImage, NULL);
2896 vkFreeMemory(m_device->device(), srcMem, NULL);
2897 vkFreeMemory(m_device->device(), destMem, NULL);
2898}
2899
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002900TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002901 TEST_DESCRIPTION("Submit command buffer created using one queue family and "
2902 "attempt to submit them on a queue created in a different "
2903 "queue family.");
2904
Cody Northropc31a84f2016-08-22 10:41:47 -06002905 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002906 // This test is meaningless unless we have multiple queue families
2907 auto queue_family_properties = m_device->phy().queue_properties();
2908 if (queue_family_properties.size() < 2) {
2909 return;
2910 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002912 // Get safe index of another queue family
2913 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
2914 ASSERT_NO_FATAL_FAILURE(InitState());
2915 // Create a second queue using a different queue family
2916 VkQueue other_queue;
2917 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
2918
2919 // Record an empty cmd buffer
2920 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
2921 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2922 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
2923 vkEndCommandBuffer(m_commandBuffer->handle());
2924
2925 // And submit on the wrong queue
2926 VkSubmitInfo submit_info = {};
2927 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2928 submit_info.commandBufferCount = 1;
2929 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06002930 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002931
2932 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002933}
2934
Chris Forbes4c24a922016-11-16 08:59:10 +13002935TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
2936 ASSERT_NO_FATAL_FAILURE(InitState());
2937
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002938 // There are no attachments, but refer to attachment 0.
2939 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13002940 VkSubpassDescription subpasses[] = {
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002941 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr,
2942 nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13002943 };
2944
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002945 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
2946 nullptr,
2947 0,
2948 0,
2949 nullptr,
2950 1,
2951 subpasses,
2952 0,
2953 nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13002954 VkRenderPass rp;
2955
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002956 // "... must be less than the total number of attachments ..."
Chris Forbes4c24a922016-11-16 08:59:10 +13002957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002958 VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13002959 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
2960 m_errorMonitor->VerifyFound();
2961}
2962
Chris Forbesa58c4522016-09-28 15:19:39 +13002963TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
2964 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
2965 ASSERT_NO_FATAL_FAILURE(InitState());
2966
2967 // A renderpass with two subpasses, both writing the same attachment.
2968 VkAttachmentDescription attach[] = {
2969 { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
2970 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
2971 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
2972 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
2973 },
2974 };
2975 VkAttachmentReference ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
2976 VkSubpassDescription subpasses[] = {
2977 { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
2978 1, &ref, nullptr, nullptr, 0, nullptr },
2979 { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
2980 1, &ref, nullptr, nullptr, 0, nullptr },
2981 };
2982 VkSubpassDependency dep = {
2983 0, 1,
2984 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
2985 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
2986 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
2987 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
2988 VK_DEPENDENCY_BY_REGION_BIT
2989 };
2990 VkRenderPassCreateInfo rpci = {
2991 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
2992 0, 1, attach, 2, subpasses, 1, &dep
2993 };
2994 VkRenderPass rp;
2995 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
2996 ASSERT_VK_SUCCESS(err);
2997
2998 VkImageObj image(m_device);
2999 image.init_no_layout(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3000 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3001 VK_IMAGE_TILING_OPTIMAL, 0);
3002 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3003
3004 VkFramebufferCreateInfo fbci = {
3005 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3006 0, rp, 1, &imageView, 32, 32, 1
3007 };
3008 VkFramebuffer fb;
3009 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3010 ASSERT_VK_SUCCESS(err);
3011
3012 char const *vsSource =
3013 "#version 450\n"
3014 "void main() { gl_Position = vec4(1); }\n";
3015 char const *fsSource =
3016 "#version 450\n"
3017 "layout(location=0) out vec4 color;\n"
3018 "void main() { color = vec4(1); }\n";
3019
3020 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3021 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3022 VkPipelineObj pipe(m_device);
3023 pipe.AddColorAttachment();
3024 pipe.AddShader(&vs);
3025 pipe.AddShader(&fs);
3026 VkViewport view_port = {};
3027 m_viewports.push_back(view_port);
3028 pipe.SetViewport(m_viewports);
3029 VkRect2D rect = {};
3030 m_scissors.push_back(rect);
3031 pipe.SetScissor(m_scissors);
3032
3033 VkPipelineLayoutCreateInfo plci = {
3034 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
3035 0, 0, nullptr, 0, nullptr
3036 };
3037 VkPipelineLayout pl;
3038 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3039 ASSERT_VK_SUCCESS(err);
3040 pipe.CreateVKPipeline(pl, rp);
3041
3042 BeginCommandBuffer();
3043
3044 VkRenderPassBeginInfo rpbi = {
3045 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
3046 rp, fb, { { 0, 0, }, { 32, 32 } }, 0, nullptr
3047 };
3048
3049 // subtest 1: bind in the wrong subpass
3050 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3051 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
3052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3053 "built for subpass 0 but used in subpass 1");
3054 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3055 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3056 m_errorMonitor->VerifyFound();
3057
3058 vkCmdEndRenderPass(m_commandBuffer->handle());
3059
3060 // subtest 2: bind in correct subpass, then transition to next subpass
3061 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3062 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3063 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
3064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3065 "built for subpass 0 but used in subpass 1");
3066 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3067 m_errorMonitor->VerifyFound();
3068
3069 vkCmdEndRenderPass(m_commandBuffer->handle());
3070
3071 EndCommandBuffer();
3072
3073 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3074 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3075 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3076}
3077
Tony Barbour4e919972016-08-09 13:27:40 -06003078TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
3079 TEST_DESCRIPTION("Generate INVALID_RENDER_AREA error by beginning renderpass"
3080 "with extent outside of framebuffer");
3081 ASSERT_NO_FATAL_FAILURE(InitState());
3082 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3083
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot execute a render pass with renderArea "
3085 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003086
3087 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3088 m_renderPassBeginInfo.renderArea.extent.width = 257;
3089 m_renderPassBeginInfo.renderArea.extent.height = 257;
3090 BeginCommandBuffer();
3091 m_errorMonitor->VerifyFound();
3092}
3093
3094TEST_F(VkLayerTest, DisabledIndependentBlend) {
3095 TEST_DESCRIPTION("Generate INDEPENDENT_BLEND by disabling independent "
3096 "blend and then specifying different blend states for two "
3097 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003098 VkPhysicalDeviceFeatures features = {};
3099 features.independentBlend = VK_FALSE;
Cody Northropc31a84f2016-08-22 10:41:47 -06003100 ASSERT_NO_FATAL_FAILURE(InitState(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003101
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3103 "Invalid Pipeline CreateInfo: If independent blend feature not "
3104 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003105
Cody Northropc31a84f2016-08-22 10:41:47 -06003106 VkDescriptorSetObj descriptorSet(m_device);
3107 descriptorSet.AppendDummy();
3108 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003109
Cody Northropc31a84f2016-08-22 10:41:47 -06003110 VkPipelineObj pipeline(m_device);
3111 VkRenderpassObj renderpass(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003112 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003113 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003114
Cody Northropc31a84f2016-08-22 10:41:47 -06003115 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3116 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3117 att_state1.blendEnable = VK_TRUE;
3118 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3119 att_state2.blendEnable = VK_FALSE;
3120 pipeline.AddColorAttachment(0, &att_state1);
3121 pipeline.AddColorAttachment(1, &att_state2);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003122 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass.handle());
Cody Northropc31a84f2016-08-22 10:41:47 -06003123 m_errorMonitor->VerifyFound();
Tony Barbour4e919972016-08-09 13:27:40 -06003124}
3125
Chris Forbes26ec2122016-11-29 08:58:33 +13003126#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003127TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3128 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3129 "depth attachments in subpass");
Cody Northropc31a84f2016-08-22 10:41:47 -06003130 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour4e919972016-08-09 13:27:40 -06003131
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3133 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003134
3135 // Create a renderPass with a single color attachment
3136 VkAttachmentReference attach = {};
3137 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3138 VkSubpassDescription subpass = {};
3139 VkRenderPassCreateInfo rpci = {};
3140 rpci.subpassCount = 1;
3141 rpci.pSubpasses = &subpass;
3142 rpci.attachmentCount = 1;
3143 VkAttachmentDescription attach_desc = {};
3144 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3145 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3146 rpci.pAttachments = &attach_desc;
3147 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3148 VkRenderPass rp;
3149 subpass.pDepthStencilAttachment = &attach;
3150 subpass.pColorAttachments = NULL;
3151 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3152 m_errorMonitor->VerifyFound();
3153}
Chris Forbes26ec2122016-11-29 08:58:33 +13003154#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003155
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003156TEST_F(VkLayerTest, UnusedPreserveAttachment) {
3157 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
3158 "attachment reference of VK_ATTACHMENT_UNUSED");
3159
3160 ASSERT_NO_FATAL_FAILURE(InitState());
3161 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3162
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003164
3165 VkAttachmentReference color_attach = {};
3166 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3167 color_attach.attachment = 0;
3168 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3169 VkSubpassDescription subpass = {};
3170 subpass.colorAttachmentCount = 1;
3171 subpass.pColorAttachments = &color_attach;
3172 subpass.preserveAttachmentCount = 1;
3173 subpass.pPreserveAttachments = &preserve_attachment;
3174
3175 VkRenderPassCreateInfo rpci = {};
3176 rpci.subpassCount = 1;
3177 rpci.pSubpasses = &subpass;
3178 rpci.attachmentCount = 1;
3179 VkAttachmentDescription attach_desc = {};
3180 attach_desc.format = VK_FORMAT_UNDEFINED;
3181 rpci.pAttachments = &attach_desc;
3182 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3183 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003184 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003185
3186 m_errorMonitor->VerifyFound();
3187
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003188 if (result == VK_SUCCESS) {
3189 vkDestroyRenderPass(m_device->device(), rp, NULL);
3190 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003191}
3192
Chris Forbesc5389742016-06-29 11:49:23 +12003193TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12003194 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
3195 "when the source of a subpass multisample resolve "
3196 "does not have multiple samples.");
3197
Chris Forbesc5389742016-06-29 11:49:23 +12003198 ASSERT_NO_FATAL_FAILURE(InitState());
3199
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3201 "Subpass 0 requests multisample resolve from attachment 0 which has "
3202 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003203
3204 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003205 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3206 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3207 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3208 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3209 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3210 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003211 };
3212
3213 VkAttachmentReference color = {
3214 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3215 };
3216
3217 VkAttachmentReference resolve = {
3218 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3219 };
3220
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003221 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003222
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003223 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003224
3225 VkRenderPass rp;
3226 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3227
3228 m_errorMonitor->VerifyFound();
3229
3230 if (err == VK_SUCCESS)
3231 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3232}
3233
3234TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12003235 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
3236 "when a subpass multisample resolve operation is "
3237 "requested, and the destination of that resolve has "
3238 "multiple samples.");
3239
Chris Forbesc5389742016-06-29 11:49:23 +12003240 ASSERT_NO_FATAL_FAILURE(InitState());
3241
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3243 "Subpass 0 requests multisample resolve into attachment 1, which "
3244 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003245
3246 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003247 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3248 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3249 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3250 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3251 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3252 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003253 };
3254
3255 VkAttachmentReference color = {
3256 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3257 };
3258
3259 VkAttachmentReference resolve = {
3260 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3261 };
3262
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003263 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003264
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003265 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003266
3267 VkRenderPass rp;
3268 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3269
3270 m_errorMonitor->VerifyFound();
3271
3272 if (err == VK_SUCCESS)
3273 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3274}
3275
Chris Forbes3f128ef2016-06-29 14:58:53 +12003276TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12003277 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
3278 "when the color and depth attachments used by a subpass "
3279 "have inconsistent sample counts");
3280
Chris Forbes3f128ef2016-06-29 14:58:53 +12003281 ASSERT_NO_FATAL_FAILURE(InitState());
3282
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3284 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003285
3286 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003287 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3288 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3289 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3290 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3291 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3292 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003293 };
3294
3295 VkAttachmentReference color[] = {
3296 {
3297 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3298 },
3299 {
3300 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3301 },
3302 };
3303
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003304 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003305
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003306 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003307
3308 VkRenderPass rp;
3309 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3310
3311 m_errorMonitor->VerifyFound();
3312
3313 if (err == VK_SUCCESS)
3314 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3315}
3316
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003317TEST_F(VkLayerTest, FramebufferCreateErrors) {
3318 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
Mike Weiblencce7ec72016-10-17 19:33:05 -06003319 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003320 " 2. Use a color image as depthStencil attachment\n"
Mike Weiblencce7ec72016-10-17 19:33:05 -06003321 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3322 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3323 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3324 " 6. Framebuffer attachment where dimensions don't match\n"
3325 " 7. Framebuffer attachment w/o identity swizzle\n"
3326 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003327
3328 ASSERT_NO_FATAL_FAILURE(InitState());
3329 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3330
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3332 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
3333 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003334
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003335 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003336 VkAttachmentReference attach = {};
3337 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3338 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003339 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003340 VkRenderPassCreateInfo rpci = {};
3341 rpci.subpassCount = 1;
3342 rpci.pSubpasses = &subpass;
3343 rpci.attachmentCount = 1;
3344 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003345 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003346 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003347 rpci.pAttachments = &attach_desc;
3348 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3349 VkRenderPass rp;
3350 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3351 ASSERT_VK_SUCCESS(err);
3352
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003353 VkImageView ivs[2];
3354 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3355 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003356 VkFramebufferCreateInfo fb_info = {};
3357 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3358 fb_info.pNext = NULL;
3359 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003360 // Set mis-matching attachmentCount
3361 fb_info.attachmentCount = 2;
3362 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003363 fb_info.width = 100;
3364 fb_info.height = 100;
3365 fb_info.layers = 1;
3366
3367 VkFramebuffer fb;
3368 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3369
3370 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003371 if (err == VK_SUCCESS) {
3372 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3373 }
3374 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003375
3376 // Create a renderPass with a depth-stencil attachment created with
3377 // IMAGE_USAGE_COLOR_ATTACHMENT
3378 // Add our color attachment to pDepthStencilAttachment
3379 subpass.pDepthStencilAttachment = &attach;
3380 subpass.pColorAttachments = NULL;
3381 VkRenderPass rp_ds;
3382 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3383 ASSERT_VK_SUCCESS(err);
3384 // Set correct attachment count, but attachment has COLOR usage bit set
3385 fb_info.attachmentCount = 1;
3386 fb_info.renderPass = rp_ds;
3387
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003389 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3390
3391 m_errorMonitor->VerifyFound();
3392 if (err == VK_SUCCESS) {
3393 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3394 }
3395 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003396
3397 // Create new renderpass with alternate attachment format from fb
3398 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3399 subpass.pDepthStencilAttachment = NULL;
3400 subpass.pColorAttachments = &attach;
3401 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3402 ASSERT_VK_SUCCESS(err);
3403
3404 // Cause error due to mis-matched formats between rp & fb
3405 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3406 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3408 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003409 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3410
3411 m_errorMonitor->VerifyFound();
3412 if (err == VK_SUCCESS) {
3413 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3414 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003415 vkDestroyRenderPass(m_device->device(), rp, NULL);
3416
3417 // Create new renderpass with alternate sample count from fb
3418 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3419 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3420 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3421 ASSERT_VK_SUCCESS(err);
3422
3423 // Cause error due to mis-matched sample count between rp & fb
3424 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has VK_SAMPLE_COUNT_1_BIT samples "
3426 "that do not match the "
3427 "VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003428 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3429
3430 m_errorMonitor->VerifyFound();
3431 if (err == VK_SUCCESS) {
3432 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3433 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003434
3435 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003436
3437 // Create a custom imageView with non-1 mip levels
3438 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003439 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003440 ASSERT_TRUE(image.initialized());
3441
3442 VkImageView view;
3443 VkImageViewCreateInfo ivci = {};
3444 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3445 ivci.image = image.handle();
3446 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3447 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3448 ivci.subresourceRange.layerCount = 1;
3449 ivci.subresourceRange.baseMipLevel = 0;
3450 // Set level count 2 (only 1 is allowed for FB attachment)
3451 ivci.subresourceRange.levelCount = 2;
3452 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3453 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3454 ASSERT_VK_SUCCESS(err);
3455 // Re-create renderpass to have matching sample count
3456 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3457 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3458 ASSERT_VK_SUCCESS(err);
3459
3460 fb_info.renderPass = rp;
3461 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003463 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3464
3465 m_errorMonitor->VerifyFound();
3466 if (err == VK_SUCCESS) {
3467 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3468 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003469 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003470 // Update view to original color buffer and grow FB dimensions too big
3471 fb_info.pAttachments = ivs;
3472 fb_info.height = 1024;
3473 fb_info.width = 1024;
3474 fb_info.layers = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at "
3476 "least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003477 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3478
3479 m_errorMonitor->VerifyFound();
3480 if (err == VK_SUCCESS) {
3481 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3482 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003483 // Create view attachment with non-identity swizzle
3484 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3485 ivci.image = image.handle();
3486 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3487 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3488 ivci.subresourceRange.layerCount = 1;
3489 ivci.subresourceRange.baseMipLevel = 0;
3490 ivci.subresourceRange.levelCount = 1;
3491 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3492 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
3493 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
3494 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
3495 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
3496 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3497 ASSERT_VK_SUCCESS(err);
3498
3499 fb_info.pAttachments = &view;
3500 fb_info.height = 100;
3501 fb_info.width = 100;
3502 fb_info.layers = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has non-identy swizzle. All "
3504 "framebuffer attachments must have "
3505 "been created with the identity "
3506 "swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003507 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3508
3509 m_errorMonitor->VerifyFound();
3510 if (err == VK_SUCCESS) {
3511 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3512 }
3513 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003514 // Request fb that exceeds max dimensions
3515 // reset attachment to color attachment
3516 fb_info.pAttachments = ivs;
3517 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
3518 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
3519 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Requested VkFramebufferCreateInfo "
3521 "dimensions exceed physical device "
3522 "limits. ");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003523 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3524
3525 m_errorMonitor->VerifyFound();
3526 if (err == VK_SUCCESS) {
3527 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3528 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003529
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003530 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003531}
3532
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003533TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003534 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Depth Bias dynamic "
3535 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003536
Cody Northropc31a84f2016-08-22 10:41:47 -06003537 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003538 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
3540 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003541 m_errorMonitor->VerifyFound();
3542}
3543
3544TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003545 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Line Width dynamic "
3546 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003547
Cody Northropc31a84f2016-08-22 10:41:47 -06003548 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003549 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
3551 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003552 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003553}
3554
3555TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003556 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Viewport dynamic "
3557 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003558
Cody Northropc31a84f2016-08-22 10:41:47 -06003559 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003560 // Dynamic viewport state
Mike Weiblen95dd0f92016-10-19 12:28:27 -06003561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003562 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003563 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003564}
3565
3566TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003567 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Scissor dynamic "
3568 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003569
Cody Northropc31a84f2016-08-22 10:41:47 -06003570 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003571 // Dynamic scissor state
Mike Weiblen95dd0f92016-10-19 12:28:27 -06003572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003573 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003574 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003575}
3576
Cortd713fe82016-07-27 09:51:27 -07003577TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003578 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Blend Constants "
3579 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003580
3581 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003582 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003583 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3584 "Dynamic blend constants state not set for this command buffer");
3585 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06003586 m_errorMonitor->VerifyFound();
3587}
3588
3589TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003590 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Depth Bounds dynamic "
3591 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003592
3593 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003594 if (!m_device->phy().features().depthBounds) {
3595 printf("Device does not support depthBounds test; skipped.\n");
3596 return;
3597 }
3598 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003599 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3600 "Dynamic depth bounds state not set for this command buffer");
3601 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003602 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003603}
3604
3605TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003606 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Read dynamic "
3607 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003608
3609 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003610 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3612 "Dynamic stencil read mask state not set for this command buffer");
3613 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003614 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003615}
3616
3617TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003618 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Write dynamic"
3619 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003620
3621 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003622 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3624 "Dynamic stencil write mask state not set for this command buffer");
3625 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003626 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003627}
3628
3629TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003630 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Ref dynamic "
3631 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003632
3633 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003634 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3636 "Dynamic stencil reference state not set for this command buffer");
3637 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003638 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06003639}
3640
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06003641TEST_F(VkLayerTest, IndexBufferNotBound) {
3642 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003643
3644 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3646 "Index buffer object not bound to this command buffer when Indexed ");
3647 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06003648 m_errorMonitor->VerifyFound();
3649}
3650
Karl Schultz6addd812016-02-02 17:17:23 -07003651TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3653 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
3654 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003655
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003656 ASSERT_NO_FATAL_FAILURE(InitState());
3657 ASSERT_NO_FATAL_FAILURE(InitViewport());
3658 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3659
Karl Schultz6addd812016-02-02 17:17:23 -07003660 // We luck out b/c by default the framework creates CB w/ the
3661 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003662 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003663 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003664 EndCommandBuffer();
3665
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003666 // Bypass framework since it does the waits automatically
3667 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003668 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003669 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3670 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003671 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003672 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003673 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003674 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003675 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003676 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003677 submit_info.pSignalSemaphores = NULL;
3678
Chris Forbes40028e22016-06-13 09:59:34 +12003679 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07003680 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07003681 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003682
Karl Schultz6addd812016-02-02 17:17:23 -07003683 // Cause validation error by re-submitting cmd buffer that should only be
3684 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12003685 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07003686 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003687
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003688 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003689}
3690
Karl Schultz6addd812016-02-02 17:17:23 -07003691TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003692 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07003693 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003694
3695 ASSERT_NO_FATAL_FAILURE(InitState());
3696 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003697
Karl Schultz6addd812016-02-02 17:17:23 -07003698 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
3699 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003700 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003701 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003702 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003703
3704 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003705 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3706 ds_pool_ci.pNext = NULL;
3707 ds_pool_ci.flags = 0;
3708 ds_pool_ci.maxSets = 1;
3709 ds_pool_ci.poolSizeCount = 1;
3710 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003711
3712 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003713 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003714 ASSERT_VK_SUCCESS(err);
3715
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003716 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
3717 dsl_binding_samp.binding = 0;
3718 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3719 dsl_binding_samp.descriptorCount = 1;
3720 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
3721 dsl_binding_samp.pImmutableSamplers = NULL;
3722
3723 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3724 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3725 ds_layout_ci.pNext = NULL;
3726 ds_layout_ci.bindingCount = 1;
3727 ds_layout_ci.pBindings = &dsl_binding_samp;
3728
3729 VkDescriptorSetLayout ds_layout_samp;
3730 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
3731 ASSERT_VK_SUCCESS(err);
3732
3733 // Try to allocate 2 sets when pool only has 1 set
3734 VkDescriptorSet descriptor_sets[2];
3735 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
3736 VkDescriptorSetAllocateInfo alloc_info = {};
3737 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3738 alloc_info.descriptorSetCount = 2;
3739 alloc_info.descriptorPool = ds_pool;
3740 alloc_info.pSetLayouts = set_layouts;
3741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
3742 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
3743 m_errorMonitor->VerifyFound();
3744
3745 alloc_info.descriptorSetCount = 1;
3746 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003747 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003748 dsl_binding.binding = 0;
3749 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3750 dsl_binding.descriptorCount = 1;
3751 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3752 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003753
Karl Schultz6addd812016-02-02 17:17:23 -07003754 ds_layout_ci.bindingCount = 1;
3755 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003756
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003757 VkDescriptorSetLayout ds_layout_ub;
3758 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003759 ASSERT_VK_SUCCESS(err);
3760
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003761 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003762 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003763 alloc_info.pSetLayouts = &ds_layout_ub;
3764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
3765 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003766
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003767 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003768
Karl Schultz2825ab92016-12-02 08:23:14 -07003769 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003770 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08003771 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003772}
3773
Karl Schultz6addd812016-02-02 17:17:23 -07003774TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
3775 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06003776
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3778 "It is invalid to call vkFreeDescriptorSets() with a pool created "
3779 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003780
Tobin Ehlise735c692015-10-08 13:13:50 -06003781 ASSERT_NO_FATAL_FAILURE(InitState());
3782 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06003783
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003784 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003785 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3786 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06003787
3788 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003789 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3790 ds_pool_ci.pNext = NULL;
3791 ds_pool_ci.maxSets = 1;
3792 ds_pool_ci.poolSizeCount = 1;
3793 ds_pool_ci.flags = 0;
3794 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
3795 // app can only call vkResetDescriptorPool on this pool.;
3796 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06003797
3798 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003799 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06003800 ASSERT_VK_SUCCESS(err);
3801
3802 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003803 dsl_binding.binding = 0;
3804 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3805 dsl_binding.descriptorCount = 1;
3806 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3807 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06003808
3809 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003810 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3811 ds_layout_ci.pNext = NULL;
3812 ds_layout_ci.bindingCount = 1;
3813 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06003814
3815 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003816 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06003817 ASSERT_VK_SUCCESS(err);
3818
3819 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003820 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003821 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003822 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003823 alloc_info.descriptorPool = ds_pool;
3824 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003825 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06003826 ASSERT_VK_SUCCESS(err);
3827
3828 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003829 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06003830
Chia-I Wuf7458c52015-10-26 21:10:41 +08003831 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3832 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06003833}
3834
Karl Schultz6addd812016-02-02 17:17:23 -07003835TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003836 // Attempt to clear Descriptor Pool with bad object.
3837 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06003838
3839 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003841 uint64_t fake_pool_handle = 0xbaad6001;
3842 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
3843 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06003844 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003845}
3846
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003847TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003848 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
3849 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003850 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06003851 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003852
3853 uint64_t fake_set_handle = 0xbaad6001;
3854 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003855 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06003857
3858 ASSERT_NO_FATAL_FAILURE(InitState());
3859
3860 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
3861 layout_bindings[0].binding = 0;
3862 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3863 layout_bindings[0].descriptorCount = 1;
3864 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3865 layout_bindings[0].pImmutableSamplers = NULL;
3866
3867 VkDescriptorSetLayout descriptor_set_layout;
3868 VkDescriptorSetLayoutCreateInfo dslci = {};
3869 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3870 dslci.pNext = NULL;
3871 dslci.bindingCount = 1;
3872 dslci.pBindings = layout_bindings;
3873 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003874 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003875
3876 VkPipelineLayout pipeline_layout;
3877 VkPipelineLayoutCreateInfo plci = {};
3878 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3879 plci.pNext = NULL;
3880 plci.setLayoutCount = 1;
3881 plci.pSetLayouts = &descriptor_set_layout;
3882 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003883 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003884
3885 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003886 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
3887 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06003888 m_errorMonitor->VerifyFound();
3889 EndCommandBuffer();
3890 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
3891 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003892}
3893
Karl Schultz6addd812016-02-02 17:17:23 -07003894TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003895 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
3896 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003897 uint64_t fake_layout_handle = 0xbaad6001;
3898 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Cody Northropc31a84f2016-08-22 10:41:47 -06003900 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06003901 VkPipelineLayout pipeline_layout;
3902 VkPipelineLayoutCreateInfo plci = {};
3903 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3904 plci.pNext = NULL;
3905 plci.setLayoutCount = 1;
3906 plci.pSetLayouts = &bad_layout;
3907 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
3908
3909 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003910}
3911
Mark Muellerd4914412016-06-13 17:52:06 -06003912TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
3913 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
3914 "1) A uniform buffer update must have a valid buffer index."
3915 "2) When using an array of descriptors in a single WriteDescriptor,"
3916 " the descriptor types and stageflags must all be the same."
3917 "3) Immutable Sampler state must match across descriptors");
3918
3919 const char *invalid_BufferInfo_ErrorMessage =
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003920 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
3921 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
3922 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
3923 const char *stateFlag_ErrorMessage = "Attempting write update to descriptor set ";
3924 const char *immutable_ErrorMessage = "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06003925
Mark Muellerd4914412016-06-13 17:52:06 -06003926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
3927
3928 ASSERT_NO_FATAL_FAILURE(InitState());
3929 VkDescriptorPoolSize ds_type_count[4] = {};
3930 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3931 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07003932 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06003933 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07003934 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06003935 ds_type_count[2].descriptorCount = 1;
3936 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3937 ds_type_count[3].descriptorCount = 1;
3938
3939 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3940 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3941 ds_pool_ci.maxSets = 1;
3942 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
3943 ds_pool_ci.pPoolSizes = ds_type_count;
3944
3945 VkDescriptorPool ds_pool;
3946 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3947 ASSERT_VK_SUCCESS(err);
3948
Mark Muellerb9896722016-06-16 09:54:29 -06003949 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06003950 layout_binding[0].binding = 0;
3951 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3952 layout_binding[0].descriptorCount = 1;
3953 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3954 layout_binding[0].pImmutableSamplers = NULL;
3955
3956 layout_binding[1].binding = 1;
3957 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3958 layout_binding[1].descriptorCount = 1;
3959 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
3960 layout_binding[1].pImmutableSamplers = NULL;
3961
3962 VkSamplerCreateInfo sampler_ci = {};
3963 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3964 sampler_ci.pNext = NULL;
3965 sampler_ci.magFilter = VK_FILTER_NEAREST;
3966 sampler_ci.minFilter = VK_FILTER_NEAREST;
3967 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3968 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3969 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3970 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3971 sampler_ci.mipLodBias = 1.0;
3972 sampler_ci.anisotropyEnable = VK_FALSE;
3973 sampler_ci.maxAnisotropy = 1;
3974 sampler_ci.compareEnable = VK_FALSE;
3975 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3976 sampler_ci.minLod = 1.0;
3977 sampler_ci.maxLod = 1.0;
3978 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3979 sampler_ci.unnormalizedCoordinates = VK_FALSE;
3980 VkSampler sampler;
3981
3982 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
3983 ASSERT_VK_SUCCESS(err);
3984
3985 layout_binding[2].binding = 2;
3986 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3987 layout_binding[2].descriptorCount = 1;
3988 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
3989 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
3990
Mark Muellerd4914412016-06-13 17:52:06 -06003991 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3992 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3993 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
3994 ds_layout_ci.pBindings = layout_binding;
3995 VkDescriptorSetLayout ds_layout;
3996 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
3997 ASSERT_VK_SUCCESS(err);
3998
3999 VkDescriptorSetAllocateInfo alloc_info = {};
4000 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4001 alloc_info.descriptorSetCount = 1;
4002 alloc_info.descriptorPool = ds_pool;
4003 alloc_info.pSetLayouts = &ds_layout;
4004 VkDescriptorSet descriptorSet;
4005 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4006 ASSERT_VK_SUCCESS(err);
4007
4008 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4009 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4010 pipeline_layout_ci.pNext = NULL;
4011 pipeline_layout_ci.setLayoutCount = 1;
4012 pipeline_layout_ci.pSetLayouts = &ds_layout;
4013
4014 VkPipelineLayout pipeline_layout;
4015 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4016 ASSERT_VK_SUCCESS(err);
4017
Mark Mueller5c838ce2016-06-16 09:54:29 -06004018 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004019 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4020 descriptor_write.dstSet = descriptorSet;
4021 descriptor_write.dstBinding = 0;
4022 descriptor_write.descriptorCount = 1;
4023 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4024
Mark Mueller5c838ce2016-06-16 09:54:29 -06004025 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004026 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4027 m_errorMonitor->VerifyFound();
4028
4029 // Create a buffer to update the descriptor with
4030 uint32_t qfi = 0;
4031 VkBufferCreateInfo buffCI = {};
4032 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4033 buffCI.size = 1024;
4034 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4035 buffCI.queueFamilyIndexCount = 1;
4036 buffCI.pQueueFamilyIndices = &qfi;
4037
4038 VkBuffer dyub;
4039 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4040 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004041
Tony Barboure132c5f2016-12-12 11:50:20 -07004042 VkDeviceMemory mem;
4043 VkMemoryRequirements mem_reqs;
4044 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4045
4046 VkMemoryAllocateInfo mem_alloc_info = {};
4047 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4048 mem_alloc_info.allocationSize = mem_reqs.size;
4049 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4050 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4051 ASSERT_VK_SUCCESS(err);
4052
4053 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4054 ASSERT_VK_SUCCESS(err);
4055
4056 VkDescriptorBufferInfo buffInfo[2] = {};
4057 buffInfo[0].buffer = dyub;
4058 buffInfo[0].offset = 0;
4059 buffInfo[0].range = 1024;
4060 buffInfo[1].buffer = dyub;
4061 buffInfo[1].offset = 0;
4062 buffInfo[1].range = 1024;
4063 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004064 descriptor_write.descriptorCount = 2;
4065
Mark Mueller5c838ce2016-06-16 09:54:29 -06004066 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06004067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
4068 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4069 m_errorMonitor->VerifyFound();
4070
Mark Mueller5c838ce2016-06-16 09:54:29 -06004071 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4072 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004073 descriptor_write.dstBinding = 1;
4074 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004075
Mark Mueller5c838ce2016-06-16 09:54:29 -06004076 // Make pImageInfo index non-null to avoid complaints of it missing
4077 VkDescriptorImageInfo imageInfo = {};
4078 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4079 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
4081 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4082 m_errorMonitor->VerifyFound();
4083
Mark Muellerd4914412016-06-13 17:52:06 -06004084 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004085 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004086 vkDestroySampler(m_device->device(), sampler, NULL);
4087 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4088 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4089 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4090}
4091
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004092TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
4093 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4094 "due to a buffer dependency being destroyed.");
4095 ASSERT_NO_FATAL_FAILURE(InitState());
4096
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004097 VkBuffer buffer;
4098 VkDeviceMemory mem;
4099 VkMemoryRequirements mem_reqs;
4100
4101 VkBufferCreateInfo buf_info = {};
4102 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004103 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004104 buf_info.size = 256;
4105 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4106 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4107 ASSERT_VK_SUCCESS(err);
4108
4109 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4110
4111 VkMemoryAllocateInfo alloc_info = {};
4112 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4113 alloc_info.allocationSize = 256;
4114 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004115 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004116 if (!pass) {
4117 vkDestroyBuffer(m_device->device(), buffer, NULL);
4118 return;
4119 }
4120 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4121 ASSERT_VK_SUCCESS(err);
4122
4123 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4124 ASSERT_VK_SUCCESS(err);
4125
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004126 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004127 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004128 m_commandBuffer->EndCommandBuffer();
4129
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004131 // Destroy buffer dependency prior to submit to cause ERROR
4132 vkDestroyBuffer(m_device->device(), buffer, NULL);
4133
4134 VkSubmitInfo submit_info = {};
4135 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4136 submit_info.commandBufferCount = 1;
4137 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4138 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4139
4140 m_errorMonitor->VerifyFound();
4141 vkFreeMemory(m_device->handle(), mem, NULL);
4142}
4143
Tobin Ehlisea413442016-09-28 10:23:59 -06004144TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4145 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4146
4147 ASSERT_NO_FATAL_FAILURE(InitState());
4148 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4149
4150 VkDescriptorPoolSize ds_type_count;
4151 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4152 ds_type_count.descriptorCount = 1;
4153
4154 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4155 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4156 ds_pool_ci.maxSets = 1;
4157 ds_pool_ci.poolSizeCount = 1;
4158 ds_pool_ci.pPoolSizes = &ds_type_count;
4159
4160 VkDescriptorPool ds_pool;
4161 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4162 ASSERT_VK_SUCCESS(err);
4163
4164 VkDescriptorSetLayoutBinding layout_binding;
4165 layout_binding.binding = 0;
4166 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4167 layout_binding.descriptorCount = 1;
4168 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4169 layout_binding.pImmutableSamplers = NULL;
4170
4171 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4172 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4173 ds_layout_ci.bindingCount = 1;
4174 ds_layout_ci.pBindings = &layout_binding;
4175 VkDescriptorSetLayout ds_layout;
4176 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4177 ASSERT_VK_SUCCESS(err);
4178
4179 VkDescriptorSetAllocateInfo alloc_info = {};
4180 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4181 alloc_info.descriptorSetCount = 1;
4182 alloc_info.descriptorPool = ds_pool;
4183 alloc_info.pSetLayouts = &ds_layout;
4184 VkDescriptorSet descriptor_set;
4185 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4186 ASSERT_VK_SUCCESS(err);
4187
4188 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4189 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4190 pipeline_layout_ci.pNext = NULL;
4191 pipeline_layout_ci.setLayoutCount = 1;
4192 pipeline_layout_ci.pSetLayouts = &ds_layout;
4193
4194 VkPipelineLayout pipeline_layout;
4195 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4196 ASSERT_VK_SUCCESS(err);
4197
4198 VkBuffer buffer;
4199 uint32_t queue_family_index = 0;
4200 VkBufferCreateInfo buffer_create_info = {};
4201 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4202 buffer_create_info.size = 1024;
4203 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4204 buffer_create_info.queueFamilyIndexCount = 1;
4205 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4206
4207 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4208 ASSERT_VK_SUCCESS(err);
4209
4210 VkMemoryRequirements memory_reqs;
4211 VkDeviceMemory buffer_memory;
4212
4213 VkMemoryAllocateInfo memory_info = {};
4214 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4215 memory_info.allocationSize = 0;
4216 memory_info.memoryTypeIndex = 0;
4217
4218 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4219 memory_info.allocationSize = memory_reqs.size;
4220 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4221 ASSERT_TRUE(pass);
4222
4223 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4224 ASSERT_VK_SUCCESS(err);
4225 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4226 ASSERT_VK_SUCCESS(err);
4227
4228 VkBufferView view;
4229 VkBufferViewCreateInfo bvci = {};
4230 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4231 bvci.buffer = buffer;
4232 bvci.format = VK_FORMAT_R8_UNORM;
4233 bvci.range = VK_WHOLE_SIZE;
4234
4235 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4236 ASSERT_VK_SUCCESS(err);
4237
4238 VkWriteDescriptorSet descriptor_write = {};
4239 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4240 descriptor_write.dstSet = descriptor_set;
4241 descriptor_write.dstBinding = 0;
4242 descriptor_write.descriptorCount = 1;
4243 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4244 descriptor_write.pTexelBufferView = &view;
4245
4246 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4247
4248 char const *vsSource = "#version 450\n"
4249 "\n"
4250 "out gl_PerVertex { \n"
4251 " vec4 gl_Position;\n"
4252 "};\n"
4253 "void main(){\n"
4254 " gl_Position = vec4(1);\n"
4255 "}\n";
4256 char const *fsSource = "#version 450\n"
4257 "\n"
4258 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4259 "layout(location=0) out vec4 x;\n"
4260 "void main(){\n"
4261 " x = imageLoad(s, 0);\n"
4262 "}\n";
4263 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4264 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4265 VkPipelineObj pipe(m_device);
4266 pipe.AddShader(&vs);
4267 pipe.AddShader(&fs);
4268 pipe.AddColorAttachment();
4269 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4270
4271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted buffer view ");
4272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4273
4274 BeginCommandBuffer();
4275 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4276 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4277 VkRect2D scissor = {{0, 0}, {16, 16}};
4278 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4279 // Bind pipeline to cmd buffer
4280 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4281 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4282 &descriptor_set, 0, nullptr);
4283 Draw(1, 0, 0, 0);
4284 EndCommandBuffer();
4285
4286 // Delete BufferView in order to invalidate cmd buffer
4287 vkDestroyBufferView(m_device->device(), view, NULL);
4288 // Now attempt submit of cmd buffer
4289 VkSubmitInfo submit_info = {};
4290 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4291 submit_info.commandBufferCount = 1;
4292 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4293 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4294 m_errorMonitor->VerifyFound();
4295
4296 // Clean-up
4297 vkDestroyBuffer(m_device->device(), buffer, NULL);
4298 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4299 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4300 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4301 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4302}
4303
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004304TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
4305 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4306 "due to an image dependency being destroyed.");
4307 ASSERT_NO_FATAL_FAILURE(InitState());
4308
4309 VkImage image;
4310 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4311 VkImageCreateInfo image_create_info = {};
4312 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4313 image_create_info.pNext = NULL;
4314 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4315 image_create_info.format = tex_format;
4316 image_create_info.extent.width = 32;
4317 image_create_info.extent.height = 32;
4318 image_create_info.extent.depth = 1;
4319 image_create_info.mipLevels = 1;
4320 image_create_info.arrayLayers = 1;
4321 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4322 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004323 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004324 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004325 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004326 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004327 // Have to bind memory to image before recording cmd in cmd buffer using it
4328 VkMemoryRequirements mem_reqs;
4329 VkDeviceMemory image_mem;
4330 bool pass;
4331 VkMemoryAllocateInfo mem_alloc = {};
4332 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4333 mem_alloc.pNext = NULL;
4334 mem_alloc.memoryTypeIndex = 0;
4335 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4336 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004337 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004338 ASSERT_TRUE(pass);
4339 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4340 ASSERT_VK_SUCCESS(err);
4341 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4342 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004343
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004344 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004345 VkClearColorValue ccv;
4346 ccv.float32[0] = 1.0f;
4347 ccv.float32[1] = 1.0f;
4348 ccv.float32[2] = 1.0f;
4349 ccv.float32[3] = 1.0f;
4350 VkImageSubresourceRange isr = {};
4351 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004352 isr.baseArrayLayer = 0;
4353 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004354 isr.layerCount = 1;
4355 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004356 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004357 m_commandBuffer->EndCommandBuffer();
4358
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004359 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004360 // Destroy image dependency prior to submit to cause ERROR
4361 vkDestroyImage(m_device->device(), image, NULL);
4362
4363 VkSubmitInfo submit_info = {};
4364 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4365 submit_info.commandBufferCount = 1;
4366 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4367 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4368
4369 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004370 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004371}
4372
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004373TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
4374 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4375 "due to a framebuffer image dependency being destroyed.");
4376 VkFormatProperties format_properties;
4377 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004378 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4379 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004380 return;
4381 }
4382
4383 ASSERT_NO_FATAL_FAILURE(InitState());
4384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4385
4386 VkImageCreateInfo image_ci = {};
4387 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4388 image_ci.pNext = NULL;
4389 image_ci.imageType = VK_IMAGE_TYPE_2D;
4390 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4391 image_ci.extent.width = 32;
4392 image_ci.extent.height = 32;
4393 image_ci.extent.depth = 1;
4394 image_ci.mipLevels = 1;
4395 image_ci.arrayLayers = 1;
4396 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4397 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004398 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004399 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4400 image_ci.flags = 0;
4401 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004402 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004403
4404 VkMemoryRequirements memory_reqs;
4405 VkDeviceMemory image_memory;
4406 bool pass;
4407 VkMemoryAllocateInfo memory_info = {};
4408 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4409 memory_info.pNext = NULL;
4410 memory_info.allocationSize = 0;
4411 memory_info.memoryTypeIndex = 0;
4412 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4413 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004414 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004415 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004416 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004417 ASSERT_VK_SUCCESS(err);
4418 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4419 ASSERT_VK_SUCCESS(err);
4420
4421 VkImageViewCreateInfo ivci = {
4422 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4423 nullptr,
4424 0,
4425 image,
4426 VK_IMAGE_VIEW_TYPE_2D,
4427 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004428 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004429 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4430 };
4431 VkImageView view;
4432 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4433 ASSERT_VK_SUCCESS(err);
4434
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004435 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004436 VkFramebuffer fb;
4437 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4438 ASSERT_VK_SUCCESS(err);
4439
4440 // Just use default renderpass with our framebuffer
4441 m_renderPassBeginInfo.framebuffer = fb;
4442 // Create Null cmd buffer for submit
4443 BeginCommandBuffer();
4444 EndCommandBuffer();
4445 // Destroy image attached to framebuffer to invalidate cmd buffer
4446 vkDestroyImage(m_device->device(), image, NULL);
4447 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004449 QueueCommandBuffer(false);
4450 m_errorMonitor->VerifyFound();
4451
4452 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4453 vkDestroyImageView(m_device->device(), view, nullptr);
4454 vkFreeMemory(m_device->device(), image_memory, nullptr);
4455}
4456
Tobin Ehlisb329f992016-10-12 13:20:29 -06004457TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
4458 TEST_DESCRIPTION("Delete in-use framebuffer.");
4459 VkFormatProperties format_properties;
4460 VkResult err = VK_SUCCESS;
4461 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4462
4463 ASSERT_NO_FATAL_FAILURE(InitState());
4464 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4465
4466 VkImageObj image(m_device);
4467 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4468 ASSERT_TRUE(image.initialized());
4469 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
4470
4471 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4472 VkFramebuffer fb;
4473 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4474 ASSERT_VK_SUCCESS(err);
4475
4476 // Just use default renderpass with our framebuffer
4477 m_renderPassBeginInfo.framebuffer = fb;
4478 // Create Null cmd buffer for submit
4479 BeginCommandBuffer();
4480 EndCommandBuffer();
4481 // Submit cmd buffer to put it in-flight
4482 VkSubmitInfo submit_info = {};
4483 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4484 submit_info.commandBufferCount = 1;
4485 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4486 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4487 // Destroy framebuffer while in-flight
4488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete framebuffer 0x");
4489 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4490 m_errorMonitor->VerifyFound();
4491 // Wait for queue to complete so we can safely destroy everything
4492 vkQueueWaitIdle(m_device->m_queue);
4493 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4494}
4495
Tobin Ehlis88becd72016-09-21 14:33:41 -06004496TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
4497 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
4498 VkFormatProperties format_properties;
4499 VkResult err = VK_SUCCESS;
4500 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06004501
4502 ASSERT_NO_FATAL_FAILURE(InitState());
4503 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4504
4505 VkImageCreateInfo image_ci = {};
4506 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4507 image_ci.pNext = NULL;
4508 image_ci.imageType = VK_IMAGE_TYPE_2D;
4509 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4510 image_ci.extent.width = 256;
4511 image_ci.extent.height = 256;
4512 image_ci.extent.depth = 1;
4513 image_ci.mipLevels = 1;
4514 image_ci.arrayLayers = 1;
4515 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4516 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06004517 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06004518 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4519 image_ci.flags = 0;
4520 VkImage image;
4521 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
4522
4523 VkMemoryRequirements memory_reqs;
4524 VkDeviceMemory image_memory;
4525 bool pass;
4526 VkMemoryAllocateInfo memory_info = {};
4527 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4528 memory_info.pNext = NULL;
4529 memory_info.allocationSize = 0;
4530 memory_info.memoryTypeIndex = 0;
4531 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4532 memory_info.allocationSize = memory_reqs.size;
4533 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4534 ASSERT_TRUE(pass);
4535 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
4536 ASSERT_VK_SUCCESS(err);
4537 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4538 ASSERT_VK_SUCCESS(err);
4539
4540 VkImageViewCreateInfo ivci = {
4541 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4542 nullptr,
4543 0,
4544 image,
4545 VK_IMAGE_VIEW_TYPE_2D,
4546 VK_FORMAT_B8G8R8A8_UNORM,
4547 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
4548 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4549 };
4550 VkImageView view;
4551 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4552 ASSERT_VK_SUCCESS(err);
4553
4554 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4555 VkFramebuffer fb;
4556 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4557 ASSERT_VK_SUCCESS(err);
4558
4559 // Just use default renderpass with our framebuffer
4560 m_renderPassBeginInfo.framebuffer = fb;
4561 // Create Null cmd buffer for submit
4562 BeginCommandBuffer();
4563 EndCommandBuffer();
4564 // Submit cmd buffer to put it (and attached imageView) in-flight
4565 VkSubmitInfo submit_info = {};
4566 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4567 submit_info.commandBufferCount = 1;
4568 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4569 // Submit cmd buffer to put framebuffer and children in-flight
4570 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4571 // Destroy image attached to framebuffer while in-flight
4572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete image 0x");
4573 vkDestroyImage(m_device->device(), image, NULL);
4574 m_errorMonitor->VerifyFound();
4575 // Wait for queue to complete so we can safely destroy image and other objects
4576 vkQueueWaitIdle(m_device->m_queue);
4577 vkDestroyImage(m_device->device(), image, NULL);
4578 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4579 vkDestroyImageView(m_device->device(), view, nullptr);
4580 vkFreeMemory(m_device->device(), image_memory, nullptr);
4581}
4582
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06004583TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
4584 TEST_DESCRIPTION("Delete in-use renderPass.");
4585
4586 ASSERT_NO_FATAL_FAILURE(InitState());
4587 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4588
4589 // Create simple renderpass
4590 VkAttachmentReference attach = {};
4591 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4592 VkSubpassDescription subpass = {};
4593 subpass.pColorAttachments = &attach;
4594 VkRenderPassCreateInfo rpci = {};
4595 rpci.subpassCount = 1;
4596 rpci.pSubpasses = &subpass;
4597 rpci.attachmentCount = 1;
4598 VkAttachmentDescription attach_desc = {};
4599 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4600 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4601 rpci.pAttachments = &attach_desc;
4602 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4603 VkRenderPass rp;
4604 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4605 ASSERT_VK_SUCCESS(err);
4606
4607 // Create a pipeline that uses the given renderpass
4608 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4609 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4610
4611 VkPipelineLayout pipeline_layout;
4612 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4613 ASSERT_VK_SUCCESS(err);
4614
4615 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4616 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4617 vp_state_ci.viewportCount = 1;
4618 VkViewport vp = {}; // Just need dummy vp to point to
4619 vp_state_ci.pViewports = &vp;
4620 vp_state_ci.scissorCount = 1;
4621 VkRect2D scissors = {}; // Dummy scissors to point to
4622 vp_state_ci.pScissors = &scissors;
4623
4624 VkPipelineShaderStageCreateInfo shaderStages[2];
4625 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4626
4627 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
4628 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
4629 // but add it to be able to run on more devices
4630 shaderStages[0] = vs.GetStageCreateInfo();
4631 shaderStages[1] = fs.GetStageCreateInfo();
4632
4633 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4634 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4635
4636 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4637 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4638 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4639
4640 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4641 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4642 rs_ci.rasterizerDiscardEnable = true;
4643 rs_ci.lineWidth = 1.0f;
4644
4645 VkPipelineColorBlendAttachmentState att = {};
4646 att.blendEnable = VK_FALSE;
4647 att.colorWriteMask = 0xf;
4648
4649 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4650 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4651 cb_ci.attachmentCount = 1;
4652 cb_ci.pAttachments = &att;
4653
4654 VkGraphicsPipelineCreateInfo gp_ci = {};
4655 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4656 gp_ci.stageCount = 2;
4657 gp_ci.pStages = shaderStages;
4658 gp_ci.pVertexInputState = &vi_ci;
4659 gp_ci.pInputAssemblyState = &ia_ci;
4660 gp_ci.pViewportState = &vp_state_ci;
4661 gp_ci.pRasterizationState = &rs_ci;
4662 gp_ci.pColorBlendState = &cb_ci;
4663 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4664 gp_ci.layout = pipeline_layout;
4665 gp_ci.renderPass = rp;
4666
4667 VkPipelineCacheCreateInfo pc_ci = {};
4668 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4669
4670 VkPipeline pipeline;
4671 VkPipelineCache pipe_cache;
4672 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
4673 ASSERT_VK_SUCCESS(err);
4674
4675 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
4676 ASSERT_VK_SUCCESS(err);
4677 // Bind pipeline to cmd buffer, will also bind renderpass
4678 m_commandBuffer->BeginCommandBuffer();
4679 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4680 m_commandBuffer->EndCommandBuffer();
4681
4682 VkSubmitInfo submit_info = {};
4683 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4684 submit_info.commandBufferCount = 1;
4685 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4686 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4687
4688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
4689 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4690 m_errorMonitor->VerifyFound();
4691
4692 // Wait for queue to complete so we can safely destroy everything
4693 vkQueueWaitIdle(m_device->m_queue);
4694 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4695 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
4696 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
4697 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
4698}
4699
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004700TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004701 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004702 ASSERT_NO_FATAL_FAILURE(InitState());
4703
4704 VkImage image;
4705 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4706 VkImageCreateInfo image_create_info = {};
4707 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4708 image_create_info.pNext = NULL;
4709 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4710 image_create_info.format = tex_format;
4711 image_create_info.extent.width = 32;
4712 image_create_info.extent.height = 32;
4713 image_create_info.extent.depth = 1;
4714 image_create_info.mipLevels = 1;
4715 image_create_info.arrayLayers = 1;
4716 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4717 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004718 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004719 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004720 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004721 ASSERT_VK_SUCCESS(err);
4722 // Have to bind memory to image before recording cmd in cmd buffer using it
4723 VkMemoryRequirements mem_reqs;
4724 VkDeviceMemory image_mem;
4725 bool pass;
4726 VkMemoryAllocateInfo mem_alloc = {};
4727 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4728 mem_alloc.pNext = NULL;
4729 mem_alloc.memoryTypeIndex = 0;
4730 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4731 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004732 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004733 ASSERT_TRUE(pass);
4734 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4735 ASSERT_VK_SUCCESS(err);
4736
Tobin Ehlisfed999f2016-09-21 15:09:45 -06004737 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
4738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06004739 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004740
4741 m_commandBuffer->BeginCommandBuffer();
4742 VkClearColorValue ccv;
4743 ccv.float32[0] = 1.0f;
4744 ccv.float32[1] = 1.0f;
4745 ccv.float32[2] = 1.0f;
4746 ccv.float32[3] = 1.0f;
4747 VkImageSubresourceRange isr = {};
4748 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4749 isr.baseArrayLayer = 0;
4750 isr.baseMipLevel = 0;
4751 isr.layerCount = 1;
4752 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004753 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004754 m_commandBuffer->EndCommandBuffer();
4755
4756 m_errorMonitor->VerifyFound();
4757 vkDestroyImage(m_device->device(), image, NULL);
4758 vkFreeMemory(m_device->device(), image_mem, nullptr);
4759}
4760
4761TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004762 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004763 ASSERT_NO_FATAL_FAILURE(InitState());
4764
4765 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004766 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004767 VK_IMAGE_TILING_OPTIMAL, 0);
4768 ASSERT_TRUE(image.initialized());
4769
4770 VkBuffer buffer;
4771 VkDeviceMemory mem;
4772 VkMemoryRequirements mem_reqs;
4773
4774 VkBufferCreateInfo buf_info = {};
4775 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12004776 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004777 buf_info.size = 256;
4778 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4779 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4780 ASSERT_VK_SUCCESS(err);
4781
4782 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4783
4784 VkMemoryAllocateInfo alloc_info = {};
4785 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4786 alloc_info.allocationSize = 256;
4787 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004788 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004789 if (!pass) {
4790 vkDestroyBuffer(m_device->device(), buffer, NULL);
4791 return;
4792 }
4793 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4794 ASSERT_VK_SUCCESS(err);
4795
Tobin Ehlisfed999f2016-09-21 15:09:45 -06004796 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06004798 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004799 VkBufferImageCopy region = {};
4800 region.bufferRowLength = 128;
4801 region.bufferImageHeight = 128;
4802 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4803
4804 region.imageSubresource.layerCount = 1;
4805 region.imageExtent.height = 4;
4806 region.imageExtent.width = 4;
4807 region.imageExtent.depth = 1;
4808 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004809 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
4810 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004811 m_commandBuffer->EndCommandBuffer();
4812
4813 m_errorMonitor->VerifyFound();
4814
4815 vkDestroyBuffer(m_device->device(), buffer, NULL);
4816 vkFreeMemory(m_device->handle(), mem, NULL);
4817}
4818
Tobin Ehlis85940f52016-07-07 16:57:21 -06004819TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
4820 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4821 "due to an event dependency being destroyed.");
4822 ASSERT_NO_FATAL_FAILURE(InitState());
4823
4824 VkEvent event;
4825 VkEventCreateInfo evci = {};
4826 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4827 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
4828 ASSERT_VK_SUCCESS(result);
4829
4830 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004831 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06004832 m_commandBuffer->EndCommandBuffer();
4833
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06004835 // Destroy event dependency prior to submit to cause ERROR
4836 vkDestroyEvent(m_device->device(), event, NULL);
4837
4838 VkSubmitInfo submit_info = {};
4839 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4840 submit_info.commandBufferCount = 1;
4841 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4842 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4843
4844 m_errorMonitor->VerifyFound();
4845}
4846
Tobin Ehlisdbea7552016-07-08 14:33:31 -06004847TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
4848 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4849 "due to a query pool dependency being destroyed.");
4850 ASSERT_NO_FATAL_FAILURE(InitState());
4851
4852 VkQueryPool query_pool;
4853 VkQueryPoolCreateInfo qpci{};
4854 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
4855 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
4856 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004857 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06004858 ASSERT_VK_SUCCESS(result);
4859
4860 m_commandBuffer->BeginCommandBuffer();
4861 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
4862 m_commandBuffer->EndCommandBuffer();
4863
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06004865 // Destroy query pool dependency prior to submit to cause ERROR
4866 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
4867
4868 VkSubmitInfo submit_info = {};
4869 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4870 submit_info.commandBufferCount = 1;
4871 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4872 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4873
4874 m_errorMonitor->VerifyFound();
4875}
4876
Tobin Ehlis24130d92016-07-08 15:50:53 -06004877TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
4878 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4879 "due to a pipeline dependency being destroyed.");
4880 ASSERT_NO_FATAL_FAILURE(InitState());
4881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4882
4883 VkResult err;
4884
4885 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4886 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4887
4888 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004889 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004890 ASSERT_VK_SUCCESS(err);
4891
4892 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4893 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4894 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004895 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06004896 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004897 vp_state_ci.scissorCount = 1;
4898 VkRect2D scissors = {}; // Dummy scissors to point to
4899 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004900
4901 VkPipelineShaderStageCreateInfo shaderStages[2];
4902 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4903
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004904 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
4905 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
4906 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06004907 shaderStages[0] = vs.GetStageCreateInfo();
4908 shaderStages[1] = fs.GetStageCreateInfo();
4909
4910 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4911 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4912
4913 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4914 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4915 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4916
4917 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4918 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12004919 rs_ci.rasterizerDiscardEnable = true;
4920 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004921
4922 VkPipelineColorBlendAttachmentState att = {};
4923 att.blendEnable = VK_FALSE;
4924 att.colorWriteMask = 0xf;
4925
4926 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4927 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4928 cb_ci.attachmentCount = 1;
4929 cb_ci.pAttachments = &att;
4930
4931 VkGraphicsPipelineCreateInfo gp_ci = {};
4932 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4933 gp_ci.stageCount = 2;
4934 gp_ci.pStages = shaderStages;
4935 gp_ci.pVertexInputState = &vi_ci;
4936 gp_ci.pInputAssemblyState = &ia_ci;
4937 gp_ci.pViewportState = &vp_state_ci;
4938 gp_ci.pRasterizationState = &rs_ci;
4939 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004940 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4941 gp_ci.layout = pipeline_layout;
4942 gp_ci.renderPass = renderPass();
4943
4944 VkPipelineCacheCreateInfo pc_ci = {};
4945 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4946
4947 VkPipeline pipeline;
4948 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004949 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004950 ASSERT_VK_SUCCESS(err);
4951
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004952 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004953 ASSERT_VK_SUCCESS(err);
4954
4955 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004956 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004957 m_commandBuffer->EndCommandBuffer();
4958 // Now destroy pipeline in order to cause error when submitting
4959 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
4960
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06004962
4963 VkSubmitInfo submit_info = {};
4964 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4965 submit_info.commandBufferCount = 1;
4966 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4967 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4968
4969 m_errorMonitor->VerifyFound();
4970 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4971 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4972}
4973
Tobin Ehlis31289162016-08-17 14:57:58 -06004974TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
4975 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4976 "due to a bound descriptor set with a buffer dependency "
4977 "being destroyed.");
4978 ASSERT_NO_FATAL_FAILURE(InitState());
4979 ASSERT_NO_FATAL_FAILURE(InitViewport());
4980 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4981
4982 VkDescriptorPoolSize ds_type_count = {};
4983 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4984 ds_type_count.descriptorCount = 1;
4985
4986 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4987 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4988 ds_pool_ci.pNext = NULL;
4989 ds_pool_ci.maxSets = 1;
4990 ds_pool_ci.poolSizeCount = 1;
4991 ds_pool_ci.pPoolSizes = &ds_type_count;
4992
4993 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004994 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06004995 ASSERT_VK_SUCCESS(err);
4996
4997 VkDescriptorSetLayoutBinding dsl_binding = {};
4998 dsl_binding.binding = 0;
4999 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5000 dsl_binding.descriptorCount = 1;
5001 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5002 dsl_binding.pImmutableSamplers = NULL;
5003
5004 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5005 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5006 ds_layout_ci.pNext = NULL;
5007 ds_layout_ci.bindingCount = 1;
5008 ds_layout_ci.pBindings = &dsl_binding;
5009 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005010 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005011 ASSERT_VK_SUCCESS(err);
5012
5013 VkDescriptorSet descriptorSet;
5014 VkDescriptorSetAllocateInfo alloc_info = {};
5015 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5016 alloc_info.descriptorSetCount = 1;
5017 alloc_info.descriptorPool = ds_pool;
5018 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005019 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005020 ASSERT_VK_SUCCESS(err);
5021
5022 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5023 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5024 pipeline_layout_ci.pNext = NULL;
5025 pipeline_layout_ci.setLayoutCount = 1;
5026 pipeline_layout_ci.pSetLayouts = &ds_layout;
5027
5028 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005029 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005030 ASSERT_VK_SUCCESS(err);
5031
5032 // Create a buffer to update the descriptor with
5033 uint32_t qfi = 0;
5034 VkBufferCreateInfo buffCI = {};
5035 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5036 buffCI.size = 1024;
5037 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5038 buffCI.queueFamilyIndexCount = 1;
5039 buffCI.pQueueFamilyIndices = &qfi;
5040
5041 VkBuffer buffer;
5042 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5043 ASSERT_VK_SUCCESS(err);
5044 // Allocate memory and bind to buffer so we can make it to the appropriate
5045 // error
5046 VkMemoryAllocateInfo mem_alloc = {};
5047 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5048 mem_alloc.pNext = NULL;
5049 mem_alloc.allocationSize = 1024;
5050 mem_alloc.memoryTypeIndex = 0;
5051
5052 VkMemoryRequirements memReqs;
5053 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005054 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005055 if (!pass) {
5056 vkDestroyBuffer(m_device->device(), buffer, NULL);
5057 return;
5058 }
5059
5060 VkDeviceMemory mem;
5061 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5062 ASSERT_VK_SUCCESS(err);
5063 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5064 ASSERT_VK_SUCCESS(err);
5065 // Correctly update descriptor to avoid "NOT_UPDATED" error
5066 VkDescriptorBufferInfo buffInfo = {};
5067 buffInfo.buffer = buffer;
5068 buffInfo.offset = 0;
5069 buffInfo.range = 1024;
5070
5071 VkWriteDescriptorSet descriptor_write;
5072 memset(&descriptor_write, 0, sizeof(descriptor_write));
5073 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5074 descriptor_write.dstSet = descriptorSet;
5075 descriptor_write.dstBinding = 0;
5076 descriptor_write.descriptorCount = 1;
5077 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5078 descriptor_write.pBufferInfo = &buffInfo;
5079
5080 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5081
5082 // Create PSO to be used for draw-time errors below
5083 char const *vsSource = "#version 450\n"
5084 "\n"
5085 "out gl_PerVertex { \n"
5086 " vec4 gl_Position;\n"
5087 "};\n"
5088 "void main(){\n"
5089 " gl_Position = vec4(1);\n"
5090 "}\n";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005091 char const *fsSource = "#version 450\n"
5092 "\n"
5093 "layout(location=0) out vec4 x;\n"
5094 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5095 "void main(){\n"
5096 " x = vec4(bar.y);\n"
5097 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005098 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5099 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5100 VkPipelineObj pipe(m_device);
5101 pipe.AddShader(&vs);
5102 pipe.AddShader(&fs);
5103 pipe.AddColorAttachment();
5104 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5105
5106 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005107 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5108 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5109 &descriptorSet, 0, NULL);
Tobin Ehlis31289162016-08-17 14:57:58 -06005110 Draw(1, 0, 0, 0);
5111 EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005113 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5114 vkDestroyBuffer(m_device->device(), buffer, NULL);
5115 // Attempt to submit cmd buffer
5116 VkSubmitInfo submit_info = {};
5117 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5118 submit_info.commandBufferCount = 1;
5119 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5120 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5121 m_errorMonitor->VerifyFound();
5122 // Cleanup
5123 vkFreeMemory(m_device->device(), mem, NULL);
5124
5125 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5126 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5127 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5128}
5129
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005130TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
5131 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
5132 "due to a bound descriptor sets with a combined image "
5133 "sampler having their image, sampler, and descriptor set "
5134 "each respectively destroyed and then attempting to "
Mark Mueller917f6bc2016-08-30 10:57:19 -06005135 "submit associated cmd buffers. Attempt to destroy a "
5136 "DescriptorSet that is in use.");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005137 ASSERT_NO_FATAL_FAILURE(InitState());
5138 ASSERT_NO_FATAL_FAILURE(InitViewport());
5139 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5140
5141 VkDescriptorPoolSize ds_type_count = {};
5142 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5143 ds_type_count.descriptorCount = 1;
5144
5145 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5146 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5147 ds_pool_ci.pNext = NULL;
5148 ds_pool_ci.maxSets = 1;
5149 ds_pool_ci.poolSizeCount = 1;
5150 ds_pool_ci.pPoolSizes = &ds_type_count;
5151
5152 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005153 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005154 ASSERT_VK_SUCCESS(err);
5155
5156 VkDescriptorSetLayoutBinding dsl_binding = {};
5157 dsl_binding.binding = 0;
5158 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5159 dsl_binding.descriptorCount = 1;
5160 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5161 dsl_binding.pImmutableSamplers = NULL;
5162
5163 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5164 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5165 ds_layout_ci.pNext = NULL;
5166 ds_layout_ci.bindingCount = 1;
5167 ds_layout_ci.pBindings = &dsl_binding;
5168 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005169 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005170 ASSERT_VK_SUCCESS(err);
5171
5172 VkDescriptorSet descriptorSet;
5173 VkDescriptorSetAllocateInfo alloc_info = {};
5174 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5175 alloc_info.descriptorSetCount = 1;
5176 alloc_info.descriptorPool = ds_pool;
5177 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005178 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005179 ASSERT_VK_SUCCESS(err);
5180
5181 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5182 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5183 pipeline_layout_ci.pNext = NULL;
5184 pipeline_layout_ci.setLayoutCount = 1;
5185 pipeline_layout_ci.pSetLayouts = &ds_layout;
5186
5187 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005188 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005189 ASSERT_VK_SUCCESS(err);
5190
5191 // Create images to update the descriptor with
5192 VkImage image;
5193 VkImage image2;
5194 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5195 const int32_t tex_width = 32;
5196 const int32_t tex_height = 32;
5197 VkImageCreateInfo image_create_info = {};
5198 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5199 image_create_info.pNext = NULL;
5200 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5201 image_create_info.format = tex_format;
5202 image_create_info.extent.width = tex_width;
5203 image_create_info.extent.height = tex_height;
5204 image_create_info.extent.depth = 1;
5205 image_create_info.mipLevels = 1;
5206 image_create_info.arrayLayers = 1;
5207 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5208 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5209 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5210 image_create_info.flags = 0;
5211 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5212 ASSERT_VK_SUCCESS(err);
5213 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5214 ASSERT_VK_SUCCESS(err);
5215
5216 VkMemoryRequirements memory_reqs;
5217 VkDeviceMemory image_memory;
5218 bool pass;
5219 VkMemoryAllocateInfo memory_info = {};
5220 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5221 memory_info.pNext = NULL;
5222 memory_info.allocationSize = 0;
5223 memory_info.memoryTypeIndex = 0;
5224 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5225 // Allocate enough memory for both images
5226 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005227 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005228 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005229 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005230 ASSERT_VK_SUCCESS(err);
5231 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5232 ASSERT_VK_SUCCESS(err);
5233 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005234 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005235 ASSERT_VK_SUCCESS(err);
5236
5237 VkImageViewCreateInfo image_view_create_info = {};
5238 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5239 image_view_create_info.image = image;
5240 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5241 image_view_create_info.format = tex_format;
5242 image_view_create_info.subresourceRange.layerCount = 1;
5243 image_view_create_info.subresourceRange.baseMipLevel = 0;
5244 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005245 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005246
5247 VkImageView view;
5248 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005249 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005250 ASSERT_VK_SUCCESS(err);
5251 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005252 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005253 ASSERT_VK_SUCCESS(err);
5254 // Create Samplers
5255 VkSamplerCreateInfo sampler_ci = {};
5256 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5257 sampler_ci.pNext = NULL;
5258 sampler_ci.magFilter = VK_FILTER_NEAREST;
5259 sampler_ci.minFilter = VK_FILTER_NEAREST;
5260 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5261 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5262 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5263 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5264 sampler_ci.mipLodBias = 1.0;
5265 sampler_ci.anisotropyEnable = VK_FALSE;
5266 sampler_ci.maxAnisotropy = 1;
5267 sampler_ci.compareEnable = VK_FALSE;
5268 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5269 sampler_ci.minLod = 1.0;
5270 sampler_ci.maxLod = 1.0;
5271 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5272 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5273 VkSampler sampler;
5274 VkSampler sampler2;
5275 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5276 ASSERT_VK_SUCCESS(err);
5277 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5278 ASSERT_VK_SUCCESS(err);
5279 // Update descriptor with image and sampler
5280 VkDescriptorImageInfo img_info = {};
5281 img_info.sampler = sampler;
5282 img_info.imageView = view;
5283 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5284
5285 VkWriteDescriptorSet descriptor_write;
5286 memset(&descriptor_write, 0, sizeof(descriptor_write));
5287 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5288 descriptor_write.dstSet = descriptorSet;
5289 descriptor_write.dstBinding = 0;
5290 descriptor_write.descriptorCount = 1;
5291 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5292 descriptor_write.pImageInfo = &img_info;
5293
5294 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5295
5296 // Create PSO to be used for draw-time errors below
5297 char const *vsSource = "#version 450\n"
5298 "\n"
5299 "out gl_PerVertex { \n"
5300 " vec4 gl_Position;\n"
5301 "};\n"
5302 "void main(){\n"
5303 " gl_Position = vec4(1);\n"
5304 "}\n";
5305 char const *fsSource = "#version 450\n"
5306 "\n"
5307 "layout(set=0, binding=0) uniform sampler2D s;\n"
5308 "layout(location=0) out vec4 x;\n"
5309 "void main(){\n"
5310 " x = texture(s, vec2(1));\n"
5311 "}\n";
5312 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5313 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5314 VkPipelineObj pipe(m_device);
5315 pipe.AddShader(&vs);
5316 pipe.AddShader(&fs);
5317 pipe.AddColorAttachment();
5318 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5319
5320 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted sampler ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005322 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005323 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5324 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5325 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005326 Draw(1, 0, 0, 0);
5327 EndCommandBuffer();
5328 // Destroy sampler invalidates the cmd buffer, causing error on submit
5329 vkDestroySampler(m_device->device(), sampler, NULL);
5330 // Attempt to submit cmd buffer
5331 VkSubmitInfo submit_info = {};
5332 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5333 submit_info.commandBufferCount = 1;
5334 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5335 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5336 m_errorMonitor->VerifyFound();
5337 // Now re-update descriptor with valid sampler and delete image
5338 img_info.sampler = sampler2;
5339 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005341 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005342 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5343 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5344 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005345 Draw(1, 0, 0, 0);
5346 EndCommandBuffer();
5347 // Destroy image invalidates the cmd buffer, causing error on submit
5348 vkDestroyImage(m_device->device(), image, NULL);
5349 // Attempt to submit cmd buffer
5350 submit_info = {};
5351 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5352 submit_info.commandBufferCount = 1;
5353 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5354 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5355 m_errorMonitor->VerifyFound();
5356 // Now update descriptor to be valid, but then free descriptor
5357 img_info.imageView = view2;
5358 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005359 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005360 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005361 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5362 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5363 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005364 Draw(1, 0, 0, 0);
5365 EndCommandBuffer();
5366 // Destroy descriptor set invalidates the cb, causing error on submit
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005368 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06005369 m_errorMonitor->VerifyFound();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005370 // Attempt to submit cmd buffer
5371 submit_info = {};
5372 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5373 submit_info.commandBufferCount = 1;
5374 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5375 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5376 m_errorMonitor->VerifyFound();
5377 // Cleanup
5378 vkFreeMemory(m_device->device(), image_memory, NULL);
5379 vkDestroySampler(m_device->device(), sampler2, NULL);
5380 vkDestroyImage(m_device->device(), image2, NULL);
5381 vkDestroyImageView(m_device->device(), view, NULL);
5382 vkDestroyImageView(m_device->device(), view2, NULL);
5383 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5384 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5385 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5386}
5387
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005388TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
5389 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
5390 ASSERT_NO_FATAL_FAILURE(InitState());
5391 ASSERT_NO_FATAL_FAILURE(InitViewport());
5392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5393
5394 VkDescriptorPoolSize ds_type_count = {};
5395 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5396 ds_type_count.descriptorCount = 1;
5397
5398 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5399 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5400 ds_pool_ci.pNext = NULL;
5401 ds_pool_ci.maxSets = 1;
5402 ds_pool_ci.poolSizeCount = 1;
5403 ds_pool_ci.pPoolSizes = &ds_type_count;
5404
5405 VkDescriptorPool ds_pool;
5406 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5407 ASSERT_VK_SUCCESS(err);
5408
5409 VkDescriptorSetLayoutBinding dsl_binding = {};
5410 dsl_binding.binding = 0;
5411 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5412 dsl_binding.descriptorCount = 1;
5413 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5414 dsl_binding.pImmutableSamplers = NULL;
5415
5416 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5417 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5418 ds_layout_ci.pNext = NULL;
5419 ds_layout_ci.bindingCount = 1;
5420 ds_layout_ci.pBindings = &dsl_binding;
5421 VkDescriptorSetLayout ds_layout;
5422 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5423 ASSERT_VK_SUCCESS(err);
5424
5425 VkDescriptorSet descriptor_set;
5426 VkDescriptorSetAllocateInfo alloc_info = {};
5427 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5428 alloc_info.descriptorSetCount = 1;
5429 alloc_info.descriptorPool = ds_pool;
5430 alloc_info.pSetLayouts = &ds_layout;
5431 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
5432 ASSERT_VK_SUCCESS(err);
5433
5434 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5435 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5436 pipeline_layout_ci.pNext = NULL;
5437 pipeline_layout_ci.setLayoutCount = 1;
5438 pipeline_layout_ci.pSetLayouts = &ds_layout;
5439
5440 VkPipelineLayout pipeline_layout;
5441 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5442 ASSERT_VK_SUCCESS(err);
5443
5444 // Create image to update the descriptor with
5445 VkImageObj image(m_device);
5446 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5447 ASSERT_TRUE(image.initialized());
5448
5449 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5450 // Create Sampler
5451 VkSamplerCreateInfo sampler_ci = {};
5452 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5453 sampler_ci.pNext = NULL;
5454 sampler_ci.magFilter = VK_FILTER_NEAREST;
5455 sampler_ci.minFilter = VK_FILTER_NEAREST;
5456 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5457 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5458 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5459 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5460 sampler_ci.mipLodBias = 1.0;
5461 sampler_ci.anisotropyEnable = VK_FALSE;
5462 sampler_ci.maxAnisotropy = 1;
5463 sampler_ci.compareEnable = VK_FALSE;
5464 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5465 sampler_ci.minLod = 1.0;
5466 sampler_ci.maxLod = 1.0;
5467 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5468 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5469 VkSampler sampler;
5470 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5471 ASSERT_VK_SUCCESS(err);
5472 // Update descriptor with image and sampler
5473 VkDescriptorImageInfo img_info = {};
5474 img_info.sampler = sampler;
5475 img_info.imageView = view;
5476 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5477
5478 VkWriteDescriptorSet descriptor_write;
5479 memset(&descriptor_write, 0, sizeof(descriptor_write));
5480 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5481 descriptor_write.dstSet = descriptor_set;
5482 descriptor_write.dstBinding = 0;
5483 descriptor_write.descriptorCount = 1;
5484 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5485 descriptor_write.pImageInfo = &img_info;
5486
5487 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5488
5489 // Create PSO to be used for draw-time errors below
5490 char const *vsSource = "#version 450\n"
5491 "\n"
5492 "out gl_PerVertex { \n"
5493 " vec4 gl_Position;\n"
5494 "};\n"
5495 "void main(){\n"
5496 " gl_Position = vec4(1);\n"
5497 "}\n";
5498 char const *fsSource = "#version 450\n"
5499 "\n"
5500 "layout(set=0, binding=0) uniform sampler2D s;\n"
5501 "layout(location=0) out vec4 x;\n"
5502 "void main(){\n"
5503 " x = texture(s, vec2(1));\n"
5504 "}\n";
5505 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5506 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5507 VkPipelineObj pipe(m_device);
5508 pipe.AddShader(&vs);
5509 pipe.AddShader(&fs);
5510 pipe.AddColorAttachment();
5511 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5512
5513 BeginCommandBuffer();
5514 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5515 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5516 &descriptor_set, 0, NULL);
5517 Draw(1, 0, 0, 0);
5518 EndCommandBuffer();
5519 // Submit cmd buffer to put pool in-flight
5520 VkSubmitInfo submit_info = {};
5521 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5522 submit_info.commandBufferCount = 1;
5523 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5524 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5525 // Destroy pool while in-flight, causing error
5526 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
5527 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5528 m_errorMonitor->VerifyFound();
5529 vkQueueWaitIdle(m_device->m_queue);
5530 // Cleanup
5531 vkDestroySampler(m_device->device(), sampler, NULL);
5532 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5533 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5534 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5535}
5536
Tobin Ehlis50a095d2016-09-21 17:32:49 -06005537TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
5538 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
5539 ASSERT_NO_FATAL_FAILURE(InitState());
5540 ASSERT_NO_FATAL_FAILURE(InitViewport());
5541 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5542
5543 VkDescriptorPoolSize ds_type_count = {};
5544 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5545 ds_type_count.descriptorCount = 1;
5546
5547 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5548 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5549 ds_pool_ci.pNext = NULL;
5550 ds_pool_ci.maxSets = 1;
5551 ds_pool_ci.poolSizeCount = 1;
5552 ds_pool_ci.pPoolSizes = &ds_type_count;
5553
5554 VkDescriptorPool ds_pool;
5555 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5556 ASSERT_VK_SUCCESS(err);
5557
5558 VkDescriptorSetLayoutBinding dsl_binding = {};
5559 dsl_binding.binding = 0;
5560 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5561 dsl_binding.descriptorCount = 1;
5562 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5563 dsl_binding.pImmutableSamplers = NULL;
5564
5565 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5566 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5567 ds_layout_ci.pNext = NULL;
5568 ds_layout_ci.bindingCount = 1;
5569 ds_layout_ci.pBindings = &dsl_binding;
5570 VkDescriptorSetLayout ds_layout;
5571 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5572 ASSERT_VK_SUCCESS(err);
5573
5574 VkDescriptorSet descriptorSet;
5575 VkDescriptorSetAllocateInfo alloc_info = {};
5576 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5577 alloc_info.descriptorSetCount = 1;
5578 alloc_info.descriptorPool = ds_pool;
5579 alloc_info.pSetLayouts = &ds_layout;
5580 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
5581 ASSERT_VK_SUCCESS(err);
5582
5583 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5584 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5585 pipeline_layout_ci.pNext = NULL;
5586 pipeline_layout_ci.setLayoutCount = 1;
5587 pipeline_layout_ci.pSetLayouts = &ds_layout;
5588
5589 VkPipelineLayout pipeline_layout;
5590 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5591 ASSERT_VK_SUCCESS(err);
5592
5593 // Create images to update the descriptor with
5594 VkImage image;
5595 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5596 const int32_t tex_width = 32;
5597 const int32_t tex_height = 32;
5598 VkImageCreateInfo image_create_info = {};
5599 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5600 image_create_info.pNext = NULL;
5601 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5602 image_create_info.format = tex_format;
5603 image_create_info.extent.width = tex_width;
5604 image_create_info.extent.height = tex_height;
5605 image_create_info.extent.depth = 1;
5606 image_create_info.mipLevels = 1;
5607 image_create_info.arrayLayers = 1;
5608 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5609 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5610 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5611 image_create_info.flags = 0;
5612 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5613 ASSERT_VK_SUCCESS(err);
5614 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
5615 VkMemoryRequirements memory_reqs;
5616 VkDeviceMemory image_memory;
5617 bool pass;
5618 VkMemoryAllocateInfo memory_info = {};
5619 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5620 memory_info.pNext = NULL;
5621 memory_info.allocationSize = 0;
5622 memory_info.memoryTypeIndex = 0;
5623 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5624 // Allocate enough memory for image
5625 memory_info.allocationSize = memory_reqs.size;
5626 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5627 ASSERT_TRUE(pass);
5628 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5629 ASSERT_VK_SUCCESS(err);
5630 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5631 ASSERT_VK_SUCCESS(err);
5632
5633 VkImageViewCreateInfo image_view_create_info = {};
5634 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5635 image_view_create_info.image = image;
5636 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5637 image_view_create_info.format = tex_format;
5638 image_view_create_info.subresourceRange.layerCount = 1;
5639 image_view_create_info.subresourceRange.baseMipLevel = 0;
5640 image_view_create_info.subresourceRange.levelCount = 1;
5641 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5642
5643 VkImageView view;
5644 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
5645 ASSERT_VK_SUCCESS(err);
5646 // Create Samplers
5647 VkSamplerCreateInfo sampler_ci = {};
5648 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5649 sampler_ci.pNext = NULL;
5650 sampler_ci.magFilter = VK_FILTER_NEAREST;
5651 sampler_ci.minFilter = VK_FILTER_NEAREST;
5652 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5653 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5654 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5655 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5656 sampler_ci.mipLodBias = 1.0;
5657 sampler_ci.anisotropyEnable = VK_FALSE;
5658 sampler_ci.maxAnisotropy = 1;
5659 sampler_ci.compareEnable = VK_FALSE;
5660 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5661 sampler_ci.minLod = 1.0;
5662 sampler_ci.maxLod = 1.0;
5663 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5664 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5665 VkSampler sampler;
5666 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5667 ASSERT_VK_SUCCESS(err);
5668 // Update descriptor with image and sampler
5669 VkDescriptorImageInfo img_info = {};
5670 img_info.sampler = sampler;
5671 img_info.imageView = view;
5672 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5673
5674 VkWriteDescriptorSet descriptor_write;
5675 memset(&descriptor_write, 0, sizeof(descriptor_write));
5676 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5677 descriptor_write.dstSet = descriptorSet;
5678 descriptor_write.dstBinding = 0;
5679 descriptor_write.descriptorCount = 1;
5680 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5681 descriptor_write.pImageInfo = &img_info;
5682 // Break memory binding and attempt update
5683 vkFreeMemory(m_device->device(), image_memory, nullptr);
5684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005685 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06005686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5687 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
5688 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5689 m_errorMonitor->VerifyFound();
5690 // Cleanup
5691 vkDestroyImage(m_device->device(), image, NULL);
5692 vkDestroySampler(m_device->device(), sampler, NULL);
5693 vkDestroyImageView(m_device->device(), view, NULL);
5694 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5695 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5696 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5697}
5698
Karl Schultz6addd812016-02-02 17:17:23 -07005699TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06005700 // Attempt to bind an invalid Pipeline to a valid Command Buffer
5701 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005702 // Create a valid cmd buffer
5703 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06005704 uint64_t fake_pipeline_handle = 0xbaad6001;
5705 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06005706 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005707 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5708
Karl Schultzf78bcdd2016-11-30 12:36:01 -07005709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Karl Schultzbdb75952016-04-19 11:36:49 -06005710 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005711 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06005712 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005713
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005714 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005716 Draw(1, 0, 0, 0);
5717 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005718
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005719 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005721 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005722 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
5723 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005724}
5725
Karl Schultz6addd812016-02-02 17:17:23 -07005726TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06005727 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07005728 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005729
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005731
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005732 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06005733 ASSERT_NO_FATAL_FAILURE(InitViewport());
5734 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005735 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005736 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5737 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005738
5739 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005740 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5741 ds_pool_ci.pNext = NULL;
5742 ds_pool_ci.maxSets = 1;
5743 ds_pool_ci.poolSizeCount = 1;
5744 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06005745
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005746 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005747 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005748 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005749
Tony Barboureb254902015-07-15 12:50:33 -06005750 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005751 dsl_binding.binding = 0;
5752 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5753 dsl_binding.descriptorCount = 1;
5754 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5755 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005756
Tony Barboureb254902015-07-15 12:50:33 -06005757 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005758 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5759 ds_layout_ci.pNext = NULL;
5760 ds_layout_ci.bindingCount = 1;
5761 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005762 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005763 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005764 ASSERT_VK_SUCCESS(err);
5765
5766 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005767 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005768 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005769 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005770 alloc_info.descriptorPool = ds_pool;
5771 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005772 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005773 ASSERT_VK_SUCCESS(err);
5774
Tony Barboureb254902015-07-15 12:50:33 -06005775 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005776 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5777 pipeline_layout_ci.pNext = NULL;
5778 pipeline_layout_ci.setLayoutCount = 1;
5779 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005780
5781 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005782 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005783 ASSERT_VK_SUCCESS(err);
5784
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005785 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005786 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005787 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005788 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005789
Tony Barbourc95e4ac2015-08-04 17:05:26 -06005790 VkPipelineObj pipe(m_device);
5791 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005792 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005793 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06005794 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005795
5796 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005797 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5798 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5799 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005800
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005801 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005802
Chia-I Wuf7458c52015-10-26 21:10:41 +08005803 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5804 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5805 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005806}
5807
Karl Schultz6addd812016-02-02 17:17:23 -07005808TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005809 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07005810 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005811
Karl Schultzf78bcdd2016-11-30 12:36:01 -07005812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005813
5814 ASSERT_NO_FATAL_FAILURE(InitState());
5815 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005816 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5817 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005818
5819 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005820 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5821 ds_pool_ci.pNext = NULL;
5822 ds_pool_ci.maxSets = 1;
5823 ds_pool_ci.poolSizeCount = 1;
5824 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005825
5826 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005827 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005828 ASSERT_VK_SUCCESS(err);
5829
5830 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005831 dsl_binding.binding = 0;
5832 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5833 dsl_binding.descriptorCount = 1;
5834 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5835 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005836
5837 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005838 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5839 ds_layout_ci.pNext = NULL;
5840 ds_layout_ci.bindingCount = 1;
5841 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005842 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005843 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005844 ASSERT_VK_SUCCESS(err);
5845
5846 VkDescriptorSet descriptorSet;
5847 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005848 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005849 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005850 alloc_info.descriptorPool = ds_pool;
5851 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005852 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005853 ASSERT_VK_SUCCESS(err);
5854
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005855 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005856 VkWriteDescriptorSet descriptor_write;
5857 memset(&descriptor_write, 0, sizeof(descriptor_write));
5858 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5859 descriptor_write.dstSet = descriptorSet;
5860 descriptor_write.dstBinding = 0;
5861 descriptor_write.descriptorCount = 1;
5862 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5863 descriptor_write.pTexelBufferView = &view;
5864
5865 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5866
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005867 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005868
5869 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5870 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5871}
5872
Mark Youngd339ba32016-05-30 13:28:35 -06005873TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005874 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06005875
5876 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005878 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06005879
5880 ASSERT_NO_FATAL_FAILURE(InitState());
5881
5882 // Create a buffer with no bound memory and then attempt to create
5883 // a buffer view.
5884 VkBufferCreateInfo buff_ci = {};
5885 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12005886 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06005887 buff_ci.size = 256;
5888 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5889 VkBuffer buffer;
5890 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
5891 ASSERT_VK_SUCCESS(err);
5892
5893 VkBufferViewCreateInfo buff_view_ci = {};
5894 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
5895 buff_view_ci.buffer = buffer;
5896 buff_view_ci.format = VK_FORMAT_R8_UNORM;
5897 buff_view_ci.range = VK_WHOLE_SIZE;
5898 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005899 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06005900
5901 m_errorMonitor->VerifyFound();
5902 vkDestroyBuffer(m_device->device(), buffer, NULL);
5903 // If last error is success, it still created the view, so delete it.
5904 if (err == VK_SUCCESS) {
5905 vkDestroyBufferView(m_device->device(), buff_view, NULL);
5906 }
5907}
5908
Karl Schultz6addd812016-02-02 17:17:23 -07005909TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
5910 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
5911 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07005912 // 1. No dynamicOffset supplied
5913 // 2. Too many dynamicOffsets supplied
5914 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07005915 VkResult err;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005916 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " requires 1 dynamicOffsets, but only "
5917 "0 dynamicOffsets are left in "
5918 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005919
5920 ASSERT_NO_FATAL_FAILURE(InitState());
5921 ASSERT_NO_FATAL_FAILURE(InitViewport());
5922 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5923
5924 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005925 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
5926 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005927
5928 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005929 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5930 ds_pool_ci.pNext = NULL;
5931 ds_pool_ci.maxSets = 1;
5932 ds_pool_ci.poolSizeCount = 1;
5933 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005934
5935 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005936 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005937 ASSERT_VK_SUCCESS(err);
5938
5939 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005940 dsl_binding.binding = 0;
5941 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
5942 dsl_binding.descriptorCount = 1;
5943 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5944 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005945
5946 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005947 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5948 ds_layout_ci.pNext = NULL;
5949 ds_layout_ci.bindingCount = 1;
5950 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005951 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005952 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005953 ASSERT_VK_SUCCESS(err);
5954
5955 VkDescriptorSet descriptorSet;
5956 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005957 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005958 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005959 alloc_info.descriptorPool = ds_pool;
5960 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005961 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005962 ASSERT_VK_SUCCESS(err);
5963
5964 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005965 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5966 pipeline_layout_ci.pNext = NULL;
5967 pipeline_layout_ci.setLayoutCount = 1;
5968 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005969
5970 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005971 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005972 ASSERT_VK_SUCCESS(err);
5973
5974 // Create a buffer to update the descriptor with
5975 uint32_t qfi = 0;
5976 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005977 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5978 buffCI.size = 1024;
5979 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5980 buffCI.queueFamilyIndexCount = 1;
5981 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005982
5983 VkBuffer dyub;
5984 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
5985 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005986 // Allocate memory and bind to buffer so we can make it to the appropriate
5987 // error
5988 VkMemoryAllocateInfo mem_alloc = {};
5989 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5990 mem_alloc.pNext = NULL;
5991 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12005992 mem_alloc.memoryTypeIndex = 0;
5993
5994 VkMemoryRequirements memReqs;
5995 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005996 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12005997 if (!pass) {
5998 vkDestroyBuffer(m_device->device(), dyub, NULL);
5999 return;
6000 }
6001
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006002 VkDeviceMemory mem;
6003 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6004 ASSERT_VK_SUCCESS(err);
6005 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6006 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006007 // Correctly update descriptor to avoid "NOT_UPDATED" error
6008 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006009 buffInfo.buffer = dyub;
6010 buffInfo.offset = 0;
6011 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006012
6013 VkWriteDescriptorSet descriptor_write;
6014 memset(&descriptor_write, 0, sizeof(descriptor_write));
6015 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6016 descriptor_write.dstSet = descriptorSet;
6017 descriptor_write.dstBinding = 0;
6018 descriptor_write.descriptorCount = 1;
6019 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6020 descriptor_write.pBufferInfo = &buffInfo;
6021
6022 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6023
6024 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006025 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6026 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006027 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006028 uint32_t pDynOff[2] = {512, 756};
6029 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6031 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6032 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6033 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006034 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006035 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " dynamic offset 512 combined with "
6037 "offset 0 and range 1024 that "
6038 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006039 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006040 char const *vsSource = "#version 450\n"
6041 "\n"
6042 "out gl_PerVertex { \n"
6043 " vec4 gl_Position;\n"
6044 "};\n"
6045 "void main(){\n"
6046 " gl_Position = vec4(1);\n"
6047 "}\n";
6048 char const *fsSource = "#version 450\n"
6049 "\n"
6050 "layout(location=0) out vec4 x;\n"
6051 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6052 "void main(){\n"
6053 " x = vec4(bar.y);\n"
6054 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006055 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6056 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6057 VkPipelineObj pipe(m_device);
6058 pipe.AddShader(&vs);
6059 pipe.AddShader(&fs);
6060 pipe.AddColorAttachment();
6061 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6062
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006063 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6064 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6065 VkRect2D scissor = {{0, 0}, {16, 16}};
6066 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6067
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006068 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006069 // This update should succeed, but offset size of 512 will overstep buffer
6070 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006071 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6072 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006073 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006074 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006075
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006076 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006077 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006078
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006079 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006080 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006081 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6082}
6083
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006084TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
6085 TEST_DESCRIPTION("Attempt to update a descriptor with a non-sparse buffer "
6086 "that doesn't have memory bound");
6087 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006089 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6091 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006092
6093 ASSERT_NO_FATAL_FAILURE(InitState());
6094 ASSERT_NO_FATAL_FAILURE(InitViewport());
6095 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6096
6097 VkDescriptorPoolSize ds_type_count = {};
6098 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6099 ds_type_count.descriptorCount = 1;
6100
6101 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6102 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6103 ds_pool_ci.pNext = NULL;
6104 ds_pool_ci.maxSets = 1;
6105 ds_pool_ci.poolSizeCount = 1;
6106 ds_pool_ci.pPoolSizes = &ds_type_count;
6107
6108 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006109 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006110 ASSERT_VK_SUCCESS(err);
6111
6112 VkDescriptorSetLayoutBinding dsl_binding = {};
6113 dsl_binding.binding = 0;
6114 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6115 dsl_binding.descriptorCount = 1;
6116 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6117 dsl_binding.pImmutableSamplers = NULL;
6118
6119 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6120 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6121 ds_layout_ci.pNext = NULL;
6122 ds_layout_ci.bindingCount = 1;
6123 ds_layout_ci.pBindings = &dsl_binding;
6124 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006125 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006126 ASSERT_VK_SUCCESS(err);
6127
6128 VkDescriptorSet descriptorSet;
6129 VkDescriptorSetAllocateInfo alloc_info = {};
6130 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6131 alloc_info.descriptorSetCount = 1;
6132 alloc_info.descriptorPool = ds_pool;
6133 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006134 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006135 ASSERT_VK_SUCCESS(err);
6136
6137 // Create a buffer to update the descriptor with
6138 uint32_t qfi = 0;
6139 VkBufferCreateInfo buffCI = {};
6140 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6141 buffCI.size = 1024;
6142 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6143 buffCI.queueFamilyIndexCount = 1;
6144 buffCI.pQueueFamilyIndices = &qfi;
6145
6146 VkBuffer dyub;
6147 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6148 ASSERT_VK_SUCCESS(err);
6149
6150 // Attempt to update descriptor without binding memory to it
6151 VkDescriptorBufferInfo buffInfo = {};
6152 buffInfo.buffer = dyub;
6153 buffInfo.offset = 0;
6154 buffInfo.range = 1024;
6155
6156 VkWriteDescriptorSet descriptor_write;
6157 memset(&descriptor_write, 0, sizeof(descriptor_write));
6158 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6159 descriptor_write.dstSet = descriptorSet;
6160 descriptor_write.dstBinding = 0;
6161 descriptor_write.descriptorCount = 1;
6162 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6163 descriptor_write.pBufferInfo = &buffInfo;
6164
6165 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6166 m_errorMonitor->VerifyFound();
6167
6168 vkDestroyBuffer(m_device->device(), dyub, NULL);
6169 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6170 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6171}
6172
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006173TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006174 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006175 ASSERT_NO_FATAL_FAILURE(InitState());
6176 ASSERT_NO_FATAL_FAILURE(InitViewport());
6177 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6178
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006179 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006180 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006181 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6182 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6183 pipeline_layout_ci.pushConstantRangeCount = 1;
6184 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6185
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006186 //
6187 // Check for invalid push constant ranges in pipeline layouts.
6188 //
6189 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006190 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006191 char const *msg;
6192 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006193
Karl Schultzc81037d2016-05-12 08:11:23 -06006194 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6195 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6196 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6197 "vkCreatePipelineLayout() call has push constants index 0 with "
6198 "size 0."},
6199 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6200 "vkCreatePipelineLayout() call has push constants index 0 with "
6201 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006202 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006203 "vkCreatePipelineLayout() call has push constants index 0 with "
6204 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006205 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006206 "vkCreatePipelineLayout() call has push constants index 0 with "
6207 "size 0."},
6208 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6209 "vkCreatePipelineLayout() call has push constants index 0 with "
6210 "offset 1. Offset must"},
6211 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6212 "vkCreatePipelineLayout() call has push constants index 0 "
6213 "with offset "},
6214 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6215 "vkCreatePipelineLayout() call has push constants "
6216 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006217 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006218 "vkCreatePipelineLayout() call has push constants index 0 "
6219 "with offset "},
6220 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6221 "vkCreatePipelineLayout() call has push "
6222 "constants index 0 with offset "},
6223 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6224 "vkCreatePipelineLayout() call has push "
6225 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006226 }};
6227
6228 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006229 for (const auto &iter : range_tests) {
6230 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6232 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006233 m_errorMonitor->VerifyFound();
6234 if (VK_SUCCESS == err) {
6235 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6236 }
6237 }
6238
6239 // Check for invalid stage flag
6240 pc_range.offset = 0;
6241 pc_range.size = 16;
6242 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006243 m_errorMonitor->SetDesiredFailureMsg(
6244 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6245 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006246 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006247 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006248 if (VK_SUCCESS == err) {
6249 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6250 }
6251
6252 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06006253 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006254 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006255 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006256 char const *msg;
6257 };
6258
Karl Schultzc81037d2016-05-12 08:11:23 -06006259 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006260 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6261 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6262 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6263 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6264 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006265 "vkCreatePipelineLayout() call has push constants with overlapping ranges:"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006266 {
6267 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6268 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6269 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6270 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6271 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006272 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 3:[12, 20), 4:[16, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006273 },
6274 {
6275 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6276 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6277 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6278 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6279 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006280 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 1:[12, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006281 },
6282 {
6283 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6284 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6285 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6286 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6287 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006288 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 3:[12, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006289 },
6290 {
6291 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6292 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
6293 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
6294 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
6295 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006296 "vkCreatePipelineLayout() call has push constants with overlapping ranges:",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006297 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006298
Karl Schultzc81037d2016-05-12 08:11:23 -06006299 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006300 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006301 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, iter.msg);
6303 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006304 m_errorMonitor->VerifyFound();
6305 if (VK_SUCCESS == err) {
6306 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6307 }
6308 }
6309
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006310 //
6311 // CmdPushConstants tests
6312 //
Karl Schultzc81037d2016-05-12 08:11:23 -06006313 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006314
6315 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006316 const std::array<PipelineLayoutTestCase, 11> cmd_range_tests = {{
6317 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "vkCmdPushConstants: parameter size must be greater than 0"},
Karl Schultzc81037d2016-05-12 08:11:23 -06006318 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6319 "vkCmdPushConstants() call has push constants with size 1. Size "
6320 "must be greater than zero and a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006321 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006322 "vkCmdPushConstants() call has push constants with size 1. Size "
6323 "must be greater than zero and a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006324 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006325 "vkCmdPushConstants() call has push constants with offset 1. "
6326 "Offset must be a multiple of 4."},
6327 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6328 "vkCmdPushConstants() call has push constants with offset 1. "
6329 "Offset must be a multiple of 4."},
6330 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6331 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6332 "0x1 not within flag-matching ranges in pipeline layout"},
6333 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
6334 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
6335 "0x1 not within flag-matching ranges in pipeline layout"},
6336 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
6337 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
6338 "0x1 not within flag-matching ranges in pipeline layout"},
6339 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
6340 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
6341 "0x1 not within flag-matching ranges in pipeline layout"},
6342 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6343 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
6344 "any of the ranges in pipeline layout"},
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006345 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06006346 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
6347 "any of the ranges in pipeline layout"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006348 }};
6349
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006350 BeginCommandBuffer();
6351
6352 // Setup ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006353 const VkPushConstantRange pc_range2[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006354 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006355 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006356 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006357 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006358 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006359 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006360 for (const auto &iter : cmd_range_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6362 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006363 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006364 m_errorMonitor->VerifyFound();
6365 }
6366
6367 // Check for invalid stage flag
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006369 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006370 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06006371 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006372
Karl Schultzc81037d2016-05-12 08:11:23 -06006373 // overlapping range tests with cmd
6374 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
6375 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6376 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6377 "0x1 not within flag-matching ranges in pipeline layout"},
6378 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6379 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
6380 "0x1 not within flag-matching ranges in pipeline layout"},
6381 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
6382 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
6383 "0x1 not within flag-matching ranges in pipeline layout"},
6384 }};
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006385 // Setup ranges: [0,16), [20,36), [36,44), [44,52), [80,92)
Karl Schultzc81037d2016-05-12 08:11:23 -06006386 const VkPushConstantRange pc_range3[] = {
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006387 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
6388 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12}, {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
Karl Schultzc81037d2016-05-12 08:11:23 -06006389 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006390 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range3) / sizeof(VkPushConstantRange);
Karl Schultzc81037d2016-05-12 08:11:23 -06006391 pipeline_layout_ci.pPushConstantRanges = pc_range3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006392 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzc81037d2016-05-12 08:11:23 -06006393 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006394 for (const auto &iter : cmd_overlap_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6396 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006397 iter.range.size, dummy_values);
6398 m_errorMonitor->VerifyFound();
6399 }
Karl Schultzc81037d2016-05-12 08:11:23 -06006400 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6401
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006402 EndCommandBuffer();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006403}
6404
Karl Schultz6addd812016-02-02 17:17:23 -07006405TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07006406 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07006407 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006408
6409 ASSERT_NO_FATAL_FAILURE(InitState());
6410 ASSERT_NO_FATAL_FAILURE(InitViewport());
6411 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6412
Mike Stroyanb8a61002016-06-20 16:00:28 -06006413 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
6414 VkImageTiling tiling;
6415 VkFormatProperties format_properties;
6416 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006417 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Mike Stroyanb8a61002016-06-20 16:00:28 -06006418 tiling = VK_IMAGE_TILING_LINEAR;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006419 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Mike Stroyanb8a61002016-06-20 16:00:28 -06006420 tiling = VK_IMAGE_TILING_OPTIMAL;
6421 } else {
6422 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
6423 "skipped.\n");
6424 return;
6425 }
6426
Tobin Ehlis559c6382015-11-05 09:52:49 -07006427 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
6428 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006429 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6430 ds_type_count[0].descriptorCount = 10;
6431 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6432 ds_type_count[1].descriptorCount = 2;
6433 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6434 ds_type_count[2].descriptorCount = 2;
6435 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6436 ds_type_count[3].descriptorCount = 5;
6437 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
6438 // type
6439 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6440 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
6441 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006442
6443 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006444 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6445 ds_pool_ci.pNext = NULL;
6446 ds_pool_ci.maxSets = 5;
6447 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
6448 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006449
6450 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006451 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006452 ASSERT_VK_SUCCESS(err);
6453
6454 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
6455 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006456 dsl_binding[0].binding = 0;
6457 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6458 dsl_binding[0].descriptorCount = 5;
6459 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6460 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006461
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006462 // Create layout identical to set0 layout but w/ different stageFlags
6463 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006464 dsl_fs_stage_only.binding = 0;
6465 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6466 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006467 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
6468 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07006469 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006470 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006471 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6472 ds_layout_ci.pNext = NULL;
6473 ds_layout_ci.bindingCount = 1;
6474 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006475 static const uint32_t NUM_LAYOUTS = 4;
6476 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006477 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006478 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
6479 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006480 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006481 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006482 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006483 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006484 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006485 dsl_binding[0].binding = 0;
6486 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006487 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006488 dsl_binding[1].binding = 1;
6489 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6490 dsl_binding[1].descriptorCount = 2;
6491 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6492 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006493 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006494 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006495 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006496 ASSERT_VK_SUCCESS(err);
6497 dsl_binding[0].binding = 0;
6498 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006499 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006500 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006501 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006502 ASSERT_VK_SUCCESS(err);
6503 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006504 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006505 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006506 ASSERT_VK_SUCCESS(err);
6507
6508 static const uint32_t NUM_SETS = 4;
6509 VkDescriptorSet descriptorSet[NUM_SETS] = {};
6510 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006511 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006512 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006513 alloc_info.descriptorPool = ds_pool;
6514 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006515 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006516 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006517 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006518 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006519 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006520 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006521 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006522
6523 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006524 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6525 pipeline_layout_ci.pNext = NULL;
6526 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
6527 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006528
6529 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006530 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006531 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006532 // Create pipelineLayout with only one setLayout
6533 pipeline_layout_ci.setLayoutCount = 1;
6534 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006535 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006536 ASSERT_VK_SUCCESS(err);
6537 // Create pipelineLayout with 2 descriptor setLayout at index 0
6538 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
6539 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006540 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006541 ASSERT_VK_SUCCESS(err);
6542 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
6543 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
6544 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006545 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006546 ASSERT_VK_SUCCESS(err);
6547 // Create pipelineLayout with UB type, but stageFlags for FS only
6548 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
6549 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006550 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006551 ASSERT_VK_SUCCESS(err);
6552 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
6553 VkDescriptorSetLayout pl_bad_s0[2] = {};
6554 pl_bad_s0[0] = ds_layout_fs_only;
6555 pl_bad_s0[1] = ds_layout[1];
6556 pipeline_layout_ci.setLayoutCount = 2;
6557 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
6558 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006559 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006560 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006561
6562 // Create a buffer to update the descriptor with
6563 uint32_t qfi = 0;
6564 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006565 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6566 buffCI.size = 1024;
6567 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6568 buffCI.queueFamilyIndexCount = 1;
6569 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006570
6571 VkBuffer dyub;
6572 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6573 ASSERT_VK_SUCCESS(err);
6574 // Correctly update descriptor to avoid "NOT_UPDATED" error
6575 static const uint32_t NUM_BUFFS = 5;
6576 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006577 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07006578 buffInfo[i].buffer = dyub;
6579 buffInfo[i].offset = 0;
6580 buffInfo[i].range = 1024;
6581 }
Karl Schultz6addd812016-02-02 17:17:23 -07006582 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07006583 const int32_t tex_width = 32;
6584 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006585 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006586 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6587 image_create_info.pNext = NULL;
6588 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6589 image_create_info.format = tex_format;
6590 image_create_info.extent.width = tex_width;
6591 image_create_info.extent.height = tex_height;
6592 image_create_info.extent.depth = 1;
6593 image_create_info.mipLevels = 1;
6594 image_create_info.arrayLayers = 1;
6595 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06006596 image_create_info.tiling = tiling;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006597 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07006598 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006599 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6600 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006601
Karl Schultz6addd812016-02-02 17:17:23 -07006602 VkMemoryRequirements memReqs;
6603 VkDeviceMemory imageMem;
6604 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006605 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006606 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6607 memAlloc.pNext = NULL;
6608 memAlloc.allocationSize = 0;
6609 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006610 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
6611 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006612 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006613 ASSERT_TRUE(pass);
6614 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
6615 ASSERT_VK_SUCCESS(err);
6616 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
6617 ASSERT_VK_SUCCESS(err);
6618
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006619 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006620 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6621 image_view_create_info.image = image;
6622 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6623 image_view_create_info.format = tex_format;
6624 image_view_create_info.subresourceRange.layerCount = 1;
6625 image_view_create_info.subresourceRange.baseMipLevel = 0;
6626 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006627 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006628
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006629 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006630 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006631 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006632 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006633 imageInfo[0].imageView = view;
6634 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6635 imageInfo[1].imageView = view;
6636 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006637 imageInfo[2].imageView = view;
Tobin Ehlisa1fccbc2016-10-10 14:54:43 -06006638 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006639 imageInfo[3].imageView = view;
Tobin Ehlisa1fccbc2016-10-10 14:54:43 -06006640 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006641
6642 static const uint32_t NUM_SET_UPDATES = 3;
6643 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
6644 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6645 descriptor_write[0].dstSet = descriptorSet[0];
6646 descriptor_write[0].dstBinding = 0;
6647 descriptor_write[0].descriptorCount = 5;
6648 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6649 descriptor_write[0].pBufferInfo = buffInfo;
6650 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6651 descriptor_write[1].dstSet = descriptorSet[1];
6652 descriptor_write[1].dstBinding = 0;
6653 descriptor_write[1].descriptorCount = 2;
6654 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6655 descriptor_write[1].pImageInfo = imageInfo;
6656 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6657 descriptor_write[2].dstSet = descriptorSet[1];
6658 descriptor_write[2].dstBinding = 1;
6659 descriptor_write[2].descriptorCount = 2;
6660 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006661 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006662
6663 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006664
Tobin Ehlis88452832015-12-03 09:40:56 -07006665 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006666 char const *vsSource = "#version 450\n"
6667 "\n"
6668 "out gl_PerVertex {\n"
6669 " vec4 gl_Position;\n"
6670 "};\n"
6671 "void main(){\n"
6672 " gl_Position = vec4(1);\n"
6673 "}\n";
6674 char const *fsSource = "#version 450\n"
6675 "\n"
6676 "layout(location=0) out vec4 x;\n"
6677 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6678 "void main(){\n"
6679 " x = vec4(bar.y);\n"
6680 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07006681 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6682 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006683 VkPipelineObj pipe(m_device);
6684 pipe.AddShader(&vs);
6685 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07006686 pipe.AddColorAttachment();
6687 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07006688
6689 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07006690
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006691 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006692 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
6693 // of PSO
6694 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
6695 // cmd_pipeline.c
6696 // due to the fact that cmd_alloc_dset_data() has not been called in
6697 // cmd_bind_graphics_pipeline()
6698 // TODO : Want to cause various binding incompatibility issues here to test
6699 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07006700 // First cause various verify_layout_compatibility() fails
6701 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006702 // verify_set_layout_compatibility fail cases:
6703 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006705 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
6706 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006707 m_errorMonitor->VerifyFound();
6708
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006709 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
6711 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
6712 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006713 m_errorMonitor->VerifyFound();
6714
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006715 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006716 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
6717 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
6719 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
6720 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006721 m_errorMonitor->VerifyFound();
6722
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006723 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
6724 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
6726 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
6727 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006728 m_errorMonitor->VerifyFound();
6729
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006730 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
6731 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6733 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
6734 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
6735 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006736 m_errorMonitor->VerifyFound();
6737
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006738 // Cause INFO messages due to disturbing previously bound Sets
6739 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006740 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6741 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006742 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
6744 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
6745 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006746 m_errorMonitor->VerifyFound();
6747
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006748 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6749 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006750 // 2. Disturb set after last bound set
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " newly bound as set #0 so set #1 and "
6752 "any subsequent sets were disturbed ");
6753 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
6754 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006755 m_errorMonitor->VerifyFound();
6756
Tobin Ehlis10fad692016-07-07 12:00:36 -06006757 // Now that we're done actively using the pipelineLayout that gfx pipeline
6758 // was created with, we should be able to delete it. Do that now to verify
6759 // that validation obeys pipelineLayout lifetime
6760 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
6761
Tobin Ehlis88452832015-12-03 09:40:56 -07006762 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07006763 // 1. Error due to not binding required set (we actually use same code as
6764 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006765 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6766 &descriptorSet[0], 0, NULL);
6767 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
6768 &descriptorSet[1], 0, NULL);
6769 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07006770 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006771 m_errorMonitor->VerifyFound();
6772
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006773 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006774 // 2. Error due to bound set not being compatible with PSO's
6775 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006776 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6777 &descriptorSet[0], 0, NULL);
6778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07006779 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006780 m_errorMonitor->VerifyFound();
6781
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006782 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07006783 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006784 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
6785 }
6786 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006787 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006788 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6789 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006790 vkFreeMemory(m_device->device(), imageMem, NULL);
6791 vkDestroyImage(m_device->device(), image, NULL);
6792 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006793}
Tobin Ehlis559c6382015-11-05 09:52:49 -07006794
Karl Schultz6addd812016-02-02 17:17:23 -07006795TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006796
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6798 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006799
6800 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006801 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006802 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006803 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006804
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006805 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006806}
6807
Karl Schultz6addd812016-02-02 17:17:23 -07006808TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
6809 VkResult err;
6810 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006811
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006813
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006814 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006815
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006816 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006817 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06006818 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006819 cmd.commandPool = m_commandPool;
6820 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006821 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06006822
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006823 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06006824 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006825
6826 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006827 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006828 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006829 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06006830 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006831 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006832 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006833
6834 // The error should be caught by validation of the BeginCommandBuffer call
6835 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
6836
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006837 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006838 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006839}
6840
Karl Schultz6addd812016-02-02 17:17:23 -07006841TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006842 // Cause error due to Begin while recording CB
6843 // Then cause 2 errors for attempting to reset CB w/o having
6844 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
6845 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06006846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006847
6848 ASSERT_NO_FATAL_FAILURE(InitState());
6849
6850 // Calls AllocateCommandBuffers
6851 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
6852
Karl Schultz6addd812016-02-02 17:17:23 -07006853 // Force the failure by setting the Renderpass and Framebuffer fields with
6854 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006855 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006856 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006857 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6858 cmd_buf_info.pNext = NULL;
6859 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006860 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006861
6862 // Begin CB to transition to recording state
6863 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
6864 // Can't re-begin. This should trigger error
6865 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006866 m_errorMonitor->VerifyFound();
6867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006869 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
6870 // Reset attempt will trigger error due to incorrect CommandPool state
6871 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006872 m_errorMonitor->VerifyFound();
6873
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006875 // Transition CB to RECORDED state
6876 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
6877 // Now attempting to Begin will implicitly reset, which triggers error
6878 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006879 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006880}
6881
Karl Schultz6addd812016-02-02 17:17:23 -07006882TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006883 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07006884 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006885
Mike Weiblencce7ec72016-10-17 19:33:05 -06006886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006887
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006888 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006889 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006890
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006891 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006892 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6893 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006894
6895 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006896 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6897 ds_pool_ci.pNext = NULL;
6898 ds_pool_ci.maxSets = 1;
6899 ds_pool_ci.poolSizeCount = 1;
6900 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006901
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006902 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006903 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006904 ASSERT_VK_SUCCESS(err);
6905
Tony Barboureb254902015-07-15 12:50:33 -06006906 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006907 dsl_binding.binding = 0;
6908 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6909 dsl_binding.descriptorCount = 1;
6910 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6911 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006912
Tony Barboureb254902015-07-15 12:50:33 -06006913 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006914 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6915 ds_layout_ci.pNext = NULL;
6916 ds_layout_ci.bindingCount = 1;
6917 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006918
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006919 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006920 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006921 ASSERT_VK_SUCCESS(err);
6922
6923 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006924 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006925 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006926 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006927 alloc_info.descriptorPool = ds_pool;
6928 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006929 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006930 ASSERT_VK_SUCCESS(err);
6931
Tony Barboureb254902015-07-15 12:50:33 -06006932 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006933 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6934 pipeline_layout_ci.setLayoutCount = 1;
6935 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006936
6937 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006938 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006939 ASSERT_VK_SUCCESS(err);
6940
Tobin Ehlise68360f2015-10-01 11:15:13 -06006941 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07006942 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06006943
6944 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006945 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
6946 vp_state_ci.scissorCount = 1;
6947 vp_state_ci.pScissors = &sc;
6948 vp_state_ci.viewportCount = 1;
6949 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06006950
Karl Schultzdfdb8d42016-03-08 10:30:21 -07006951 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
6952 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
6953 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
6954 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
6955 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
6956 rs_state_ci.depthClampEnable = VK_FALSE;
6957 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
6958 rs_state_ci.depthBiasEnable = VK_FALSE;
6959
Tony Barboureb254902015-07-15 12:50:33 -06006960 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006961 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
6962 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07006963 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07006964 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
6965 gp_ci.layout = pipeline_layout;
6966 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06006967
6968 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006969 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
6970 pc_ci.initialDataSize = 0;
6971 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006972
6973 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06006974 VkPipelineCache pipelineCache;
6975
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006976 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06006977 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006978 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006979
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006980 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006981
Chia-I Wuf7458c52015-10-26 21:10:41 +08006982 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6983 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6984 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6985 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006986}
Tobin Ehlis912df022015-09-17 08:46:18 -06006987/*// TODO : This test should be good, but needs Tess support in compiler to run
6988TEST_F(VkLayerTest, InvalidPatchControlPoints)
6989{
6990 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06006991 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006992
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006994 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
6995primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006996
Tobin Ehlis912df022015-09-17 08:46:18 -06006997 ASSERT_NO_FATAL_FAILURE(InitState());
6998 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06006999
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007000 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007001 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007002 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007003
7004 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7005 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7006 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007007 ds_pool_ci.poolSizeCount = 1;
7008 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007009
7010 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007011 err = vkCreateDescriptorPool(m_device->device(),
7012VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007013 ASSERT_VK_SUCCESS(err);
7014
7015 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007016 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007017 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007018 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007019 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7020 dsl_binding.pImmutableSamplers = NULL;
7021
7022 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007023 ds_layout_ci.sType =
7024VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007025 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007026 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007027 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007028
7029 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007030 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7031&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007032 ASSERT_VK_SUCCESS(err);
7033
7034 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007035 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7036VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007037 ASSERT_VK_SUCCESS(err);
7038
7039 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007040 pipeline_layout_ci.sType =
7041VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007042 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007043 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007044 pipeline_layout_ci.pSetLayouts = &ds_layout;
7045
7046 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007047 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7048&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007049 ASSERT_VK_SUCCESS(err);
7050
7051 VkPipelineShaderStageCreateInfo shaderStages[3];
7052 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7053
Karl Schultz6addd812016-02-02 17:17:23 -07007054 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7055this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007056 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007057 VkShaderObj
7058tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7059this);
7060 VkShaderObj
7061te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7062this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007063
Karl Schultz6addd812016-02-02 17:17:23 -07007064 shaderStages[0].sType =
7065VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007066 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007067 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007068 shaderStages[1].sType =
7069VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007070 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007071 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007072 shaderStages[2].sType =
7073VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007074 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007075 shaderStages[2].shader = te.handle();
7076
7077 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007078 iaCI.sType =
7079VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007080 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007081
7082 VkPipelineTessellationStateCreateInfo tsCI = {};
7083 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7084 tsCI.patchControlPoints = 0; // This will cause an error
7085
7086 VkGraphicsPipelineCreateInfo gp_ci = {};
7087 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7088 gp_ci.pNext = NULL;
7089 gp_ci.stageCount = 3;
7090 gp_ci.pStages = shaderStages;
7091 gp_ci.pVertexInputState = NULL;
7092 gp_ci.pInputAssemblyState = &iaCI;
7093 gp_ci.pTessellationState = &tsCI;
7094 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007095 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007096 gp_ci.pMultisampleState = NULL;
7097 gp_ci.pDepthStencilState = NULL;
7098 gp_ci.pColorBlendState = NULL;
7099 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7100 gp_ci.layout = pipeline_layout;
7101 gp_ci.renderPass = renderPass();
7102
7103 VkPipelineCacheCreateInfo pc_ci = {};
7104 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7105 pc_ci.pNext = NULL;
7106 pc_ci.initialSize = 0;
7107 pc_ci.initialData = 0;
7108 pc_ci.maxSize = 0;
7109
7110 VkPipeline pipeline;
7111 VkPipelineCache pipelineCache;
7112
Karl Schultz6addd812016-02-02 17:17:23 -07007113 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7114&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007115 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007116 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7117&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007118
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007119 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007120
Chia-I Wuf7458c52015-10-26 21:10:41 +08007121 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7122 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7123 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7124 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007125}
7126*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06007127// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07007128TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007129 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007130
Mark Lobodzinski6fcae552016-12-18 08:57:03 -07007131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007132
Tobin Ehlise68360f2015-10-01 11:15:13 -06007133 ASSERT_NO_FATAL_FAILURE(InitState());
7134 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007135
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007136 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007137 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7138 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007139
7140 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007141 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7142 ds_pool_ci.maxSets = 1;
7143 ds_pool_ci.poolSizeCount = 1;
7144 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007145
7146 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007147 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007148 ASSERT_VK_SUCCESS(err);
7149
7150 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007151 dsl_binding.binding = 0;
7152 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7153 dsl_binding.descriptorCount = 1;
7154 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007155
7156 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007157 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7158 ds_layout_ci.bindingCount = 1;
7159 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007160
7161 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007162 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007163 ASSERT_VK_SUCCESS(err);
7164
7165 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007166 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007167 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007168 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007169 alloc_info.descriptorPool = ds_pool;
7170 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007171 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007172 ASSERT_VK_SUCCESS(err);
7173
7174 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007175 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7176 pipeline_layout_ci.setLayoutCount = 1;
7177 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007178
7179 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007181 ASSERT_VK_SUCCESS(err);
7182
7183 VkViewport vp = {}; // Just need dummy vp to point to
7184
7185 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007186 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7187 vp_state_ci.scissorCount = 0;
7188 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
7189 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007190
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007191 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7192 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7193 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7194 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7195 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7196 rs_state_ci.depthClampEnable = VK_FALSE;
7197 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7198 rs_state_ci.depthBiasEnable = VK_FALSE;
7199
Cody Northropeb3a6c12015-10-05 14:44:45 -06007200 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007201 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007202
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007203 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007204 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7205 // 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 +08007206 shaderStages[0] = vs.GetStageCreateInfo();
7207 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007208
7209 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007210 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7211 gp_ci.stageCount = 2;
7212 gp_ci.pStages = shaderStages;
7213 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007214 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007215 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7216 gp_ci.layout = pipeline_layout;
7217 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007218
7219 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007220 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007221
7222 VkPipeline pipeline;
7223 VkPipelineCache pipelineCache;
7224
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007225 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007226 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007227 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007228
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007229 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007230
Chia-I Wuf7458c52015-10-26 21:10:41 +08007231 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7232 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7233 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7234 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007235}
Karl Schultz6addd812016-02-02 17:17:23 -07007236// Don't set viewport state in PSO. This is an error b/c we always need this
7237// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06007238// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007239TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06007240 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007241 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007242
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007244
Tobin Ehlise68360f2015-10-01 11:15:13 -06007245 ASSERT_NO_FATAL_FAILURE(InitState());
7246 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007247
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007248 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007249 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7250 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007251
7252 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007253 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7254 ds_pool_ci.maxSets = 1;
7255 ds_pool_ci.poolSizeCount = 1;
7256 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007257
7258 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007259 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007260 ASSERT_VK_SUCCESS(err);
7261
7262 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007263 dsl_binding.binding = 0;
7264 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7265 dsl_binding.descriptorCount = 1;
7266 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007267
7268 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007269 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7270 ds_layout_ci.bindingCount = 1;
7271 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007272
7273 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007274 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007275 ASSERT_VK_SUCCESS(err);
7276
7277 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007278 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007279 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007280 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007281 alloc_info.descriptorPool = ds_pool;
7282 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007283 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007284 ASSERT_VK_SUCCESS(err);
7285
7286 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007287 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7288 pipeline_layout_ci.setLayoutCount = 1;
7289 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007290
7291 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007292 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007293 ASSERT_VK_SUCCESS(err);
7294
7295 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7296 // Set scissor as dynamic to avoid second error
7297 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007298 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7299 dyn_state_ci.dynamicStateCount = 1;
7300 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007301
Cody Northropeb3a6c12015-10-05 14:44:45 -06007302 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007303 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007304
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007305 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7306 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
7307 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007308 shaderStages[0] = vs.GetStageCreateInfo();
7309 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007310
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007311 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7312 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7313 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7314 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7315 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7316 rs_state_ci.depthClampEnable = VK_FALSE;
7317 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7318 rs_state_ci.depthBiasEnable = VK_FALSE;
7319
Tobin Ehlise68360f2015-10-01 11:15:13 -06007320 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007321 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7322 gp_ci.stageCount = 2;
7323 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007324 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007325 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
7326 // should cause validation error
7327 gp_ci.pDynamicState = &dyn_state_ci;
7328 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7329 gp_ci.layout = pipeline_layout;
7330 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007331
7332 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007333 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007334
7335 VkPipeline pipeline;
7336 VkPipelineCache pipelineCache;
7337
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007338 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007339 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007340 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007341
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007342 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007343
Chia-I Wuf7458c52015-10-26 21:10:41 +08007344 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7345 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7346 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7347 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007348}
7349// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07007350// Then run second test where dynamic scissor count doesn't match PSO scissor
7351// count
7352TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7353 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007354
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007356
Tobin Ehlise68360f2015-10-01 11:15:13 -06007357 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007358
7359 if (!m_device->phy().features().multiViewport) {
7360 printf("Device does not support multiple viewports/scissors; skipped.\n");
7361 return;
7362 }
7363
Tobin Ehlise68360f2015-10-01 11:15:13 -06007364 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007365
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007366 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007367 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7368 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007369
7370 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007371 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7372 ds_pool_ci.maxSets = 1;
7373 ds_pool_ci.poolSizeCount = 1;
7374 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007375
7376 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007377 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007378 ASSERT_VK_SUCCESS(err);
7379
7380 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007381 dsl_binding.binding = 0;
7382 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7383 dsl_binding.descriptorCount = 1;
7384 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007385
7386 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007387 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7388 ds_layout_ci.bindingCount = 1;
7389 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007390
7391 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007392 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007393 ASSERT_VK_SUCCESS(err);
7394
7395 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007396 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007397 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007398 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007399 alloc_info.descriptorPool = ds_pool;
7400 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007401 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007402 ASSERT_VK_SUCCESS(err);
7403
7404 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007405 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7406 pipeline_layout_ci.setLayoutCount = 1;
7407 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007408
7409 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007410 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007411 ASSERT_VK_SUCCESS(err);
7412
7413 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007414 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7415 vp_state_ci.viewportCount = 1;
7416 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
7417 vp_state_ci.scissorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007418 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06007419
7420 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7421 // Set scissor as dynamic to avoid that error
7422 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007423 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7424 dyn_state_ci.dynamicStateCount = 1;
7425 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007426
Cody Northropeb3a6c12015-10-05 14:44:45 -06007427 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007428 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007429
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007430 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7431 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
7432 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007433 shaderStages[0] = vs.GetStageCreateInfo();
7434 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007435
Cody Northropf6622dc2015-10-06 10:33:21 -06007436 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7437 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7438 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007439 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007440 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007441 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007442 vi_ci.pVertexAttributeDescriptions = nullptr;
7443
7444 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7445 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7446 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7447
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007448 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007449 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06007450 rs_ci.pNext = nullptr;
7451
Mark Youngc89c6312016-03-31 16:03:20 -06007452 VkPipelineColorBlendAttachmentState att = {};
7453 att.blendEnable = VK_FALSE;
7454 att.colorWriteMask = 0xf;
7455
Cody Northropf6622dc2015-10-06 10:33:21 -06007456 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7457 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7458 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007459 cb_ci.attachmentCount = 1;
7460 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06007461
Tobin Ehlise68360f2015-10-01 11:15:13 -06007462 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007463 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7464 gp_ci.stageCount = 2;
7465 gp_ci.pStages = shaderStages;
7466 gp_ci.pVertexInputState = &vi_ci;
7467 gp_ci.pInputAssemblyState = &ia_ci;
7468 gp_ci.pViewportState = &vp_state_ci;
7469 gp_ci.pRasterizationState = &rs_ci;
7470 gp_ci.pColorBlendState = &cb_ci;
7471 gp_ci.pDynamicState = &dyn_state_ci;
7472 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7473 gp_ci.layout = pipeline_layout;
7474 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007475
7476 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007477 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007478
7479 VkPipeline pipeline;
7480 VkPipelineCache pipelineCache;
7481
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007482 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007483 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007484 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007485
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007486 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007487
Tobin Ehlisd332f282015-10-02 11:00:56 -06007488 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07007489 // First need to successfully create the PSO from above by setting
7490 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06007491 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 -07007492
7493 VkViewport vp = {}; // Just need dummy vp to point to
7494 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007495 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007496 ASSERT_VK_SUCCESS(err);
7497 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007498 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007499 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07007500 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007501 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07007502 Draw(1, 0, 0, 0);
7503
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007504 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007505
7506 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7507 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7508 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7509 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007510 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007511}
7512// Create PSO w/o non-zero scissorCount but no scissor data
7513// Then run second test where dynamic viewportCount doesn't match PSO
7514// viewportCount
7515TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
7516 VkResult err;
7517
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07007519
7520 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007521
7522 if (!m_device->phy().features().multiViewport) {
7523 printf("Device does not support multiple viewports/scissors; skipped.\n");
7524 return;
7525 }
7526
Karl Schultz6addd812016-02-02 17:17:23 -07007527 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7528
7529 VkDescriptorPoolSize ds_type_count = {};
7530 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7531 ds_type_count.descriptorCount = 1;
7532
7533 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7534 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7535 ds_pool_ci.maxSets = 1;
7536 ds_pool_ci.poolSizeCount = 1;
7537 ds_pool_ci.pPoolSizes = &ds_type_count;
7538
7539 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007540 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07007541 ASSERT_VK_SUCCESS(err);
7542
7543 VkDescriptorSetLayoutBinding dsl_binding = {};
7544 dsl_binding.binding = 0;
7545 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7546 dsl_binding.descriptorCount = 1;
7547 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7548
7549 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7550 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7551 ds_layout_ci.bindingCount = 1;
7552 ds_layout_ci.pBindings = &dsl_binding;
7553
7554 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007555 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07007556 ASSERT_VK_SUCCESS(err);
7557
7558 VkDescriptorSet descriptorSet;
7559 VkDescriptorSetAllocateInfo alloc_info = {};
7560 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7561 alloc_info.descriptorSetCount = 1;
7562 alloc_info.descriptorPool = ds_pool;
7563 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007564 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07007565 ASSERT_VK_SUCCESS(err);
7566
7567 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7568 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7569 pipeline_layout_ci.setLayoutCount = 1;
7570 pipeline_layout_ci.pSetLayouts = &ds_layout;
7571
7572 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007573 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07007574 ASSERT_VK_SUCCESS(err);
7575
7576 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7577 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7578 vp_state_ci.scissorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007579 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007580 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007581 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007582
7583 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
7584 // Set scissor as dynamic to avoid that error
7585 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7586 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7587 dyn_state_ci.dynamicStateCount = 1;
7588 dyn_state_ci.pDynamicStates = &vp_state;
7589
7590 VkPipelineShaderStageCreateInfo shaderStages[2];
7591 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7592
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007593 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7594 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
7595 // but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07007596 shaderStages[0] = vs.GetStageCreateInfo();
7597 shaderStages[1] = fs.GetStageCreateInfo();
7598
7599 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7600 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7601 vi_ci.pNext = nullptr;
7602 vi_ci.vertexBindingDescriptionCount = 0;
7603 vi_ci.pVertexBindingDescriptions = nullptr;
7604 vi_ci.vertexAttributeDescriptionCount = 0;
7605 vi_ci.pVertexAttributeDescriptions = nullptr;
7606
7607 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7608 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7609 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7610
7611 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7612 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7613 rs_ci.pNext = nullptr;
7614
Mark Youngc89c6312016-03-31 16:03:20 -06007615 VkPipelineColorBlendAttachmentState att = {};
7616 att.blendEnable = VK_FALSE;
7617 att.colorWriteMask = 0xf;
7618
Karl Schultz6addd812016-02-02 17:17:23 -07007619 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7620 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7621 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007622 cb_ci.attachmentCount = 1;
7623 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07007624
7625 VkGraphicsPipelineCreateInfo gp_ci = {};
7626 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7627 gp_ci.stageCount = 2;
7628 gp_ci.pStages = shaderStages;
7629 gp_ci.pVertexInputState = &vi_ci;
7630 gp_ci.pInputAssemblyState = &ia_ci;
7631 gp_ci.pViewportState = &vp_state_ci;
7632 gp_ci.pRasterizationState = &rs_ci;
7633 gp_ci.pColorBlendState = &cb_ci;
7634 gp_ci.pDynamicState = &dyn_state_ci;
7635 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7636 gp_ci.layout = pipeline_layout;
7637 gp_ci.renderPass = renderPass();
7638
7639 VkPipelineCacheCreateInfo pc_ci = {};
7640 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7641
7642 VkPipeline pipeline;
7643 VkPipelineCache pipelineCache;
7644
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007645 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07007646 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007647 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007648
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007649 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007650
7651 // Now hit second fail case where we set scissor w/ different count than PSO
7652 // First need to successfully create the PSO from above by setting
7653 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06007654 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 -06007655
Tobin Ehlisd332f282015-10-02 11:00:56 -06007656 VkRect2D sc = {}; // Just need dummy vp to point to
7657 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007658 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007659 ASSERT_VK_SUCCESS(err);
7660 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007661 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007662 VkViewport viewports[1] = {}; // don't care about data
Tobin Ehlisd332f282015-10-02 11:00:56 -06007663 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007664 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007665 Draw(1, 0, 0, 0);
7666
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007667 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007668
Chia-I Wuf7458c52015-10-26 21:10:41 +08007669 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7670 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7671 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7672 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007673 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007674}
7675
Mark Young7394fdd2016-03-31 14:56:43 -06007676TEST_F(VkLayerTest, PSOLineWidthInvalid) {
7677 VkResult err;
7678
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06007680
7681 ASSERT_NO_FATAL_FAILURE(InitState());
7682 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7683
7684 VkDescriptorPoolSize ds_type_count = {};
7685 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7686 ds_type_count.descriptorCount = 1;
7687
7688 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7689 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7690 ds_pool_ci.maxSets = 1;
7691 ds_pool_ci.poolSizeCount = 1;
7692 ds_pool_ci.pPoolSizes = &ds_type_count;
7693
7694 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007695 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06007696 ASSERT_VK_SUCCESS(err);
7697
7698 VkDescriptorSetLayoutBinding dsl_binding = {};
7699 dsl_binding.binding = 0;
7700 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7701 dsl_binding.descriptorCount = 1;
7702 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7703
7704 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7705 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7706 ds_layout_ci.bindingCount = 1;
7707 ds_layout_ci.pBindings = &dsl_binding;
7708
7709 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007710 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06007711 ASSERT_VK_SUCCESS(err);
7712
7713 VkDescriptorSet descriptorSet;
7714 VkDescriptorSetAllocateInfo alloc_info = {};
7715 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7716 alloc_info.descriptorSetCount = 1;
7717 alloc_info.descriptorPool = ds_pool;
7718 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007719 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06007720 ASSERT_VK_SUCCESS(err);
7721
7722 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7723 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7724 pipeline_layout_ci.setLayoutCount = 1;
7725 pipeline_layout_ci.pSetLayouts = &ds_layout;
7726
7727 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007728 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06007729 ASSERT_VK_SUCCESS(err);
7730
7731 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7732 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7733 vp_state_ci.scissorCount = 1;
7734 vp_state_ci.pScissors = NULL;
7735 vp_state_ci.viewportCount = 1;
7736 vp_state_ci.pViewports = NULL;
7737
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007738 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06007739 // Set scissor as dynamic to avoid that error
7740 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7741 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7742 dyn_state_ci.dynamicStateCount = 2;
7743 dyn_state_ci.pDynamicStates = dynamic_states;
7744
7745 VkPipelineShaderStageCreateInfo shaderStages[2];
7746 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7747
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007748 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7749 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Young7394fdd2016-03-31 14:56:43 -06007750 this); // TODO - We shouldn't need a fragment shader
7751 // but add it to be able to run on more devices
7752 shaderStages[0] = vs.GetStageCreateInfo();
7753 shaderStages[1] = fs.GetStageCreateInfo();
7754
7755 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7756 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7757 vi_ci.pNext = nullptr;
7758 vi_ci.vertexBindingDescriptionCount = 0;
7759 vi_ci.pVertexBindingDescriptions = nullptr;
7760 vi_ci.vertexAttributeDescriptionCount = 0;
7761 vi_ci.pVertexAttributeDescriptions = nullptr;
7762
7763 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7764 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7765 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7766
7767 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7768 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7769 rs_ci.pNext = nullptr;
7770
Mark Young47107952016-05-02 15:59:55 -06007771 // Check too low (line width of -1.0f).
7772 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06007773
7774 VkPipelineColorBlendAttachmentState att = {};
7775 att.blendEnable = VK_FALSE;
7776 att.colorWriteMask = 0xf;
7777
7778 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7779 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7780 cb_ci.pNext = nullptr;
7781 cb_ci.attachmentCount = 1;
7782 cb_ci.pAttachments = &att;
7783
7784 VkGraphicsPipelineCreateInfo gp_ci = {};
7785 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7786 gp_ci.stageCount = 2;
7787 gp_ci.pStages = shaderStages;
7788 gp_ci.pVertexInputState = &vi_ci;
7789 gp_ci.pInputAssemblyState = &ia_ci;
7790 gp_ci.pViewportState = &vp_state_ci;
7791 gp_ci.pRasterizationState = &rs_ci;
7792 gp_ci.pColorBlendState = &cb_ci;
7793 gp_ci.pDynamicState = &dyn_state_ci;
7794 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7795 gp_ci.layout = pipeline_layout;
7796 gp_ci.renderPass = renderPass();
7797
7798 VkPipelineCacheCreateInfo pc_ci = {};
7799 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7800
7801 VkPipeline pipeline;
7802 VkPipelineCache pipelineCache;
7803
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007804 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007805 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007806 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007807
7808 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06007809 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007810
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06007812
7813 // Check too high (line width of 65536.0f).
7814 rs_ci.lineWidth = 65536.0f;
7815
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007816 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007817 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007818 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007819
7820 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06007821 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007822
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007823 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06007824
7825 dyn_state_ci.dynamicStateCount = 3;
7826
7827 rs_ci.lineWidth = 1.0f;
7828
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007829 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007830 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007831 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007832 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007833 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007834
7835 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06007836 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06007837 m_errorMonitor->VerifyFound();
7838
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06007840
7841 // Check too high with dynamic setting.
7842 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
7843 m_errorMonitor->VerifyFound();
7844 EndCommandBuffer();
7845
7846 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7847 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7848 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7849 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007850 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007851}
7852
Karl Schultz6addd812016-02-02 17:17:23 -07007853TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007854 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7856 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007857
7858 ASSERT_NO_FATAL_FAILURE(InitState());
7859 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007860
Tony Barbourfe3351b2015-07-28 10:17:20 -06007861 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007862 // Don't care about RenderPass handle b/c error should be flagged before
7863 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007864 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007865
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007866 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007867}
7868
Karl Schultz6addd812016-02-02 17:17:23 -07007869TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007870 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7872 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007873
7874 ASSERT_NO_FATAL_FAILURE(InitState());
7875 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007876
Tony Barbourfe3351b2015-07-28 10:17:20 -06007877 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007878 // Just create a dummy Renderpass that's non-NULL so we can get to the
7879 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007880 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007881
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007882 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007883}
7884
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007885TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
7886 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
7887 "the number of renderPass attachments that use loadOp"
7888 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
7889
7890 ASSERT_NO_FATAL_FAILURE(InitState());
7891 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7892
7893 // Create a renderPass with a single attachment that uses loadOp CLEAR
7894 VkAttachmentReference attach = {};
7895 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7896 VkSubpassDescription subpass = {};
7897 subpass.inputAttachmentCount = 1;
7898 subpass.pInputAttachments = &attach;
7899 VkRenderPassCreateInfo rpci = {};
7900 rpci.subpassCount = 1;
7901 rpci.pSubpasses = &subpass;
7902 rpci.attachmentCount = 1;
7903 VkAttachmentDescription attach_desc = {};
7904 attach_desc.format = VK_FORMAT_UNDEFINED;
7905 // Set loadOp to CLEAR
7906 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7907 rpci.pAttachments = &attach_desc;
7908 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
7909 VkRenderPass rp;
7910 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7911
7912 VkCommandBufferInheritanceInfo hinfo = {};
7913 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7914 hinfo.renderPass = VK_NULL_HANDLE;
7915 hinfo.subpass = 0;
7916 hinfo.framebuffer = VK_NULL_HANDLE;
7917 hinfo.occlusionQueryEnable = VK_FALSE;
7918 hinfo.queryFlags = 0;
7919 hinfo.pipelineStatistics = 0;
7920 VkCommandBufferBeginInfo info = {};
7921 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
7922 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7923 info.pInheritanceInfo = &hinfo;
7924
7925 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
7926 VkRenderPassBeginInfo rp_begin = {};
7927 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
7928 rp_begin.pNext = NULL;
7929 rp_begin.renderPass = renderPass();
7930 rp_begin.framebuffer = framebuffer();
7931 rp_begin.clearValueCount = 0; // Should be 1
7932
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has a clearValueCount of 0 but "
7934 "there must be at least 1 entries in "
7935 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007936
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007937 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007938
7939 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06007940
7941 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007942}
7943
Slawomir Cygan0808f392016-11-28 17:53:23 +01007944TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
7945 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is greater than"
7946 "the number of renderPass attachments that use loadOp"
7947 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
7948
7949 ASSERT_NO_FATAL_FAILURE(InitState());
7950 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7951
7952 // Create a renderPass with a single attachment that uses loadOp CLEAR
7953 VkAttachmentReference attach = {};
7954 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7955 VkSubpassDescription subpass = {};
7956 subpass.inputAttachmentCount = 1;
7957 subpass.pInputAttachments = &attach;
7958 VkRenderPassCreateInfo rpci = {};
7959 rpci.subpassCount = 1;
7960 rpci.pSubpasses = &subpass;
7961 rpci.attachmentCount = 1;
7962 VkAttachmentDescription attach_desc = {};
7963 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
7964 // Set loadOp to CLEAR
7965 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7966 rpci.pAttachments = &attach_desc;
7967 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
7968 VkRenderPass rp;
7969 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7970
7971 VkCommandBufferBeginInfo info = {};
7972 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
7973 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7974
7975 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
7976 VkRenderPassBeginInfo rp_begin = {};
7977 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
7978 rp_begin.pNext = NULL;
7979 rp_begin.renderPass = renderPass();
7980 rp_begin.framebuffer = framebuffer();
7981 rp_begin.clearValueCount = 2; // Should be 1
7982
7983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " has a clearValueCount of"
7984 " 2 but only first 1 entries in pClearValues array are used");
7985
7986 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
7987
7988 m_errorMonitor->VerifyFound();
7989
7990 vkDestroyRenderPass(m_device->device(), rp, NULL);
7991}
7992
7993
Cody Northrop3bb4d962016-05-09 16:15:57 -06007994TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
7995
7996 TEST_DESCRIPTION("End a command buffer with an active render pass");
7997
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7999 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008000
8001 ASSERT_NO_FATAL_FAILURE(InitState());
8002 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8003
8004 // The framework's BeginCommandBuffer calls CreateRenderPass
8005 BeginCommandBuffer();
8006
8007 // Call directly into vkEndCommandBuffer instead of the
8008 // the framework's EndCommandBuffer, which inserts a
8009 // vkEndRenderPass
8010 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
8011
8012 m_errorMonitor->VerifyFound();
8013
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008014 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8015 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008016}
8017
Karl Schultz6addd812016-02-02 17:17:23 -07008018TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008019 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8021 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008022
8023 ASSERT_NO_FATAL_FAILURE(InitState());
8024 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008025
8026 // Renderpass is started here
8027 BeginCommandBuffer();
8028
8029 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008030 vk_testing::Buffer dstBuffer;
8031 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008032
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008033 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008034
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008035 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008036}
8037
Karl Schultz6addd812016-02-02 17:17:23 -07008038TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008039 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8041 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008042
8043 ASSERT_NO_FATAL_FAILURE(InitState());
8044 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008045
8046 // Renderpass is started here
8047 BeginCommandBuffer();
8048
8049 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008050 vk_testing::Buffer dstBuffer;
8051 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008052
Karl Schultz6addd812016-02-02 17:17:23 -07008053 VkDeviceSize dstOffset = 0;
8054 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06008055 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008056
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008057 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008058
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008059 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008060}
8061
Karl Schultz6addd812016-02-02 17:17:23 -07008062TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008063 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8065 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008066
8067 ASSERT_NO_FATAL_FAILURE(InitState());
8068 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008069
8070 // Renderpass is started here
8071 BeginCommandBuffer();
8072
Michael Lentine0a369f62016-02-03 16:51:46 -06008073 VkClearColorValue clear_color;
8074 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008075 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8076 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8077 const int32_t tex_width = 32;
8078 const int32_t tex_height = 32;
8079 VkImageCreateInfo image_create_info = {};
8080 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8081 image_create_info.pNext = NULL;
8082 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8083 image_create_info.format = tex_format;
8084 image_create_info.extent.width = tex_width;
8085 image_create_info.extent.height = tex_height;
8086 image_create_info.extent.depth = 1;
8087 image_create_info.mipLevels = 1;
8088 image_create_info.arrayLayers = 1;
8089 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8090 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8091 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008092
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008093 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008094 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008095
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008096 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008097
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008098 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008099
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008100 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008101}
8102
Karl Schultz6addd812016-02-02 17:17:23 -07008103TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008104 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008105 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8106 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008107
8108 ASSERT_NO_FATAL_FAILURE(InitState());
8109 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008110
8111 // Renderpass is started here
8112 BeginCommandBuffer();
8113
8114 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008115 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008116 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8117 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8118 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8119 image_create_info.extent.width = 64;
8120 image_create_info.extent.height = 64;
8121 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8122 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008123
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008124 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008125 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008126
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008127 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008128
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008129 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
8130 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008131
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008132 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008133}
8134
Karl Schultz6addd812016-02-02 17:17:23 -07008135TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008136 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008137 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008138
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearAttachments(): This call "
8140 "must be issued inside an active "
8141 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008142
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008143 ASSERT_NO_FATAL_FAILURE(InitState());
8144 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008145
8146 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008147 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008148 ASSERT_VK_SUCCESS(err);
8149
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008150 VkClearAttachment color_attachment;
8151 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8152 color_attachment.clearValue.color.float32[0] = 0;
8153 color_attachment.clearValue.color.float32[1] = 0;
8154 color_attachment.clearValue.color.float32[2] = 0;
8155 color_attachment.clearValue.color.float32[3] = 0;
8156 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008157 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008158 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008159
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008160 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008161}
8162
Chris Forbes3b97e932016-09-07 11:29:24 +12008163TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
8164 TEST_DESCRIPTION("Test that an error is produced when CmdNextSubpass is "
8165 "called too many times in a renderpass instance");
8166
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdNextSubpass(): Attempted to advance "
8168 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008169
8170 ASSERT_NO_FATAL_FAILURE(InitState());
8171 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8172
8173 BeginCommandBuffer();
8174
8175 // error here.
8176 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8177 m_errorMonitor->VerifyFound();
8178
8179 EndCommandBuffer();
8180}
8181
Chris Forbes6d624702016-09-07 13:57:05 +12008182TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
8183 TEST_DESCRIPTION("Test that an error is produced when CmdEndRenderPass is "
8184 "called before the final subpass has been reached");
8185
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdEndRenderPass(): Called before reaching "
8187 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008188
8189 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008190 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8191 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008192
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008193 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008194
8195 VkRenderPass rp;
8196 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8197 ASSERT_VK_SUCCESS(err);
8198
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008199 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008200
8201 VkFramebuffer fb;
8202 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8203 ASSERT_VK_SUCCESS(err);
8204
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008205 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008206
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008207 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 +12008208
8209 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8210
8211 // Error here.
8212 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8213 m_errorMonitor->VerifyFound();
8214
8215 // Clean up.
8216 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8217 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8218}
8219
Karl Schultz9e66a292016-04-21 15:57:51 -06008220TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8221 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8223 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008224
8225 ASSERT_NO_FATAL_FAILURE(InitState());
8226 BeginCommandBuffer();
8227
8228 VkBufferMemoryBarrier buf_barrier = {};
8229 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8230 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8231 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8232 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8233 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8234 buf_barrier.buffer = VK_NULL_HANDLE;
8235 buf_barrier.offset = 0;
8236 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008237 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8238 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008239
8240 m_errorMonitor->VerifyFound();
8241}
8242
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008243TEST_F(VkLayerTest, InvalidBarriers) {
8244 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8245
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008246 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008247
8248 ASSERT_NO_FATAL_FAILURE(InitState());
8249 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8250
8251 VkMemoryBarrier mem_barrier = {};
8252 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8253 mem_barrier.pNext = NULL;
8254 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8255 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8256 BeginCommandBuffer();
8257 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008258 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008259 &mem_barrier, 0, nullptr, 0, nullptr);
8260 m_errorMonitor->VerifyFound();
8261
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008263 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008264 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 -06008265 ASSERT_TRUE(image.initialized());
8266 VkImageMemoryBarrier img_barrier = {};
8267 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8268 img_barrier.pNext = NULL;
8269 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8270 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8271 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8272 // New layout can't be UNDEFINED
8273 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8274 img_barrier.image = image.handle();
8275 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8276 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8277 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8278 img_barrier.subresourceRange.baseArrayLayer = 0;
8279 img_barrier.subresourceRange.baseMipLevel = 0;
8280 img_barrier.subresourceRange.layerCount = 1;
8281 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008282 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8283 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008284 m_errorMonitor->VerifyFound();
8285 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8286
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the "
8288 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008289 // baseArrayLayer + layerCount must be <= image's arrayLayers
8290 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008291 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8292 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008293 m_errorMonitor->VerifyFound();
8294 img_barrier.subresourceRange.baseArrayLayer = 0;
8295
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008297 // baseMipLevel + levelCount must be <= image's mipLevels
8298 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008299 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8300 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008301 m_errorMonitor->VerifyFound();
8302 img_barrier.subresourceRange.baseMipLevel = 0;
8303
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008304 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 -06008305 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008306 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8307 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008308 VkBufferMemoryBarrier buf_barrier = {};
8309 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8310 buf_barrier.pNext = NULL;
8311 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8312 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8313 buf_barrier.buffer = buffer.handle();
8314 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8315 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8316 buf_barrier.offset = 0;
8317 buf_barrier.size = VK_WHOLE_SIZE;
8318 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008319 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8320 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008321 m_errorMonitor->VerifyFound();
8322 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8323
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008325 buf_barrier.offset = 257;
8326 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008327 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8328 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008329 m_errorMonitor->VerifyFound();
8330 buf_barrier.offset = 0;
8331
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008333 buf_barrier.size = 257;
8334 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008335 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8336 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008337 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008338
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008339 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008340 m_errorMonitor->SetDesiredFailureMsg(
8341 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8342 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
8343 m_errorMonitor->SetDesiredFailureMsg(
8344 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8345 "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 -06008346 VkDepthStencilObj ds_image(m_device);
8347 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
8348 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06008349 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
8350 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008351 img_barrier.image = ds_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008352 // Use of COLOR aspect on DS image is error
8353 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
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();
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008357 // Now test depth-only
8358 VkFormatProperties format_props;
8359
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008360 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
8361 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8363 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
8364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8365 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008366 VkDepthStencilObj d_image(m_device);
8367 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
8368 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008369 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008370 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008371 img_barrier.image = d_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008372 // Use of COLOR aspect on depth image is error
8373 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008374 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8375 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008376 m_errorMonitor->VerifyFound();
8377 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008378 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
8379 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008380 // Now test stencil-only
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8382 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008383 VkDepthStencilObj s_image(m_device);
8384 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
8385 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008386 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008387 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008388 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008389 // Use of COLOR aspect on depth image is error
8390 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008391 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8392 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008393 m_errorMonitor->VerifyFound();
8394 }
8395 // Finally test color
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8397 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
8398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8399 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008400 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008401 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 -06008402 ASSERT_TRUE(c_image.initialized());
8403 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8404 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
8405 img_barrier.image = c_image.handle();
8406 // Set aspect to depth (non-color)
8407 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008408 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8409 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008410 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008411
8412 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
8413
8414 // Create command pool with incompatible queueflags
8415 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
8416 uint32_t queue_family_index = UINT32_MAX;
8417 for (uint32_t i = 0; i < queue_props.size(); i++) {
8418 if ((queue_props[i].queueFlags & VK_QUEUE_COMPUTE_BIT) == 0) {
8419 queue_family_index = i;
8420 break;
8421 }
8422 }
8423 if (queue_family_index == UINT32_MAX) {
8424 printf("No non-compute queue found; skipped.\n");
8425 return;
8426 }
8427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
8428
8429 VkCommandPool command_pool;
8430 VkCommandPoolCreateInfo pool_create_info{};
8431 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
8432 pool_create_info.queueFamilyIndex = queue_family_index;
8433 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
8434 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
8435
8436 // Allocate a command buffer
8437 VkCommandBuffer bad_command_buffer;
8438 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
8439 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
8440 command_buffer_allocate_info.commandPool = command_pool;
8441 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
8442 command_buffer_allocate_info.commandBufferCount = 1;
8443 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
8444
8445 VkCommandBufferBeginInfo cbbi = {};
8446 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8447 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
8448 buf_barrier.offset = 0;
8449 buf_barrier.size = VK_WHOLE_SIZE;
8450 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
8451 &buf_barrier, 0, nullptr);
8452 m_errorMonitor->VerifyFound();
8453
8454 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
8455 vkEndCommandBuffer(bad_command_buffer);
8456 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
8457 printf("The non-compute queue does not support graphics; skipped.\n");
8458 return;
8459 }
8460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
8461 VkEvent event;
8462 VkEventCreateInfo event_create_info{};
8463 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
8464 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
8465 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
8466 nullptr, 0, nullptr);
8467 m_errorMonitor->VerifyFound();
8468
8469 vkEndCommandBuffer(bad_command_buffer);
8470 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008471}
8472
Tony Barbour18ba25c2016-09-29 13:42:40 -06008473TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
8474 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
8475
8476 m_errorMonitor->SetDesiredFailureMsg(
8477 VK_DEBUG_REPORT_WARNING_BIT_EXT,
8478 "must have required access bit");
8479 ASSERT_NO_FATAL_FAILURE(InitState());
8480 VkImageObj image(m_device);
Tony Barbour256c80a2016-10-05 13:23:46 -06008481 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 -06008482 ASSERT_TRUE(image.initialized());
8483
8484 VkImageMemoryBarrier barrier = {};
8485 VkImageSubresourceRange range;
8486 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8487 barrier.srcAccessMask = 0;
8488 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
8489 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
8490 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8491 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8492 barrier.image = image.handle();
8493 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8494 range.baseMipLevel = 0;
8495 range.levelCount = 1;
8496 range.baseArrayLayer = 0;
8497 range.layerCount = 1;
8498 barrier.subresourceRange = range;
8499 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
8500 cmdbuf.BeginCommandBuffer();
8501 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
8502 &barrier);
8503 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8504 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
8505 barrier.srcAccessMask = 0;
8506 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
8507 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
8508 &barrier);
8509
8510 m_errorMonitor->VerifyFound();
8511}
8512
Karl Schultz6addd812016-02-02 17:17:23 -07008513TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008514 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008515 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008516
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008518
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008519 ASSERT_NO_FATAL_FAILURE(InitState());
8520 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008521 uint32_t qfi = 0;
8522 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008523 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8524 buffCI.size = 1024;
8525 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8526 buffCI.queueFamilyIndexCount = 1;
8527 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008528
8529 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008530 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008531 ASSERT_VK_SUCCESS(err);
8532
8533 BeginCommandBuffer();
8534 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008535 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8536 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008537 // Should error before calling to driver so don't care about actual data
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008538 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7, VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008539
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008540 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008541
Chia-I Wuf7458c52015-10-26 21:10:41 +08008542 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008543}
8544
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008545TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
8546 // Create an out-of-range queueFamilyIndex
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8548 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
8549 "of the indices specified when the device was created, via the "
8550 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008551
8552 ASSERT_NO_FATAL_FAILURE(InitState());
8553 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8554 VkBufferCreateInfo buffCI = {};
8555 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8556 buffCI.size = 1024;
8557 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8558 buffCI.queueFamilyIndexCount = 1;
8559 // Introduce failure by specifying invalid queue_family_index
8560 uint32_t qfi = 777;
8561 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06008562 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008563
8564 VkBuffer ib;
8565 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
8566
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008567 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008568 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008569}
8570
Karl Schultz6addd812016-02-02 17:17:23 -07008571TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -06008572TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer"
Tobin Ehlis0c94db02016-07-19 10:49:32 -06008573 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008574
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008575 ASSERT_NO_FATAL_FAILURE(InitState());
8576 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008577
Chris Forbesf29a84f2016-10-06 18:39:28 +13008578 // An empty primary command buffer
8579 VkCommandBufferObj cb(m_device, m_commandPool);
8580 cb.BeginCommandBuffer();
8581 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06008582
Chris Forbesf29a84f2016-10-06 18:39:28 +13008583 m_commandBuffer->BeginCommandBuffer();
8584 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
8585 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008586
Chris Forbesf29a84f2016-10-06 18:39:28 +13008587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
8588 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008589 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008590}
8591
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008592TEST_F(VkLayerTest, DSUsageBitsErrors) {
8593 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
8594 "that do not have correct usage bits sets.");
8595 VkResult err;
8596
8597 ASSERT_NO_FATAL_FAILURE(InitState());
8598 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8599 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8600 ds_type_count[i].type = VkDescriptorType(i);
8601 ds_type_count[i].descriptorCount = 1;
8602 }
8603 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8604 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8605 ds_pool_ci.pNext = NULL;
8606 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8607 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8608 ds_pool_ci.pPoolSizes = ds_type_count;
8609
8610 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008611 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008612 ASSERT_VK_SUCCESS(err);
8613
8614 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008615 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008616 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8617 dsl_binding[i].binding = 0;
8618 dsl_binding[i].descriptorType = VkDescriptorType(i);
8619 dsl_binding[i].descriptorCount = 1;
8620 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
8621 dsl_binding[i].pImmutableSamplers = NULL;
8622 }
8623
8624 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8625 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8626 ds_layout_ci.pNext = NULL;
8627 ds_layout_ci.bindingCount = 1;
8628 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
8629 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8630 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008631 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008632 ASSERT_VK_SUCCESS(err);
8633 }
8634 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8635 VkDescriptorSetAllocateInfo alloc_info = {};
8636 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8637 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8638 alloc_info.descriptorPool = ds_pool;
8639 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008640 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008641 ASSERT_VK_SUCCESS(err);
8642
8643 // Create a buffer & bufferView to be used for invalid updates
8644 VkBufferCreateInfo buff_ci = {};
8645 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8646 // This usage is not valid for any descriptor type
8647 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
8648 buff_ci.size = 256;
8649 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8650 VkBuffer buffer;
8651 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
8652 ASSERT_VK_SUCCESS(err);
8653
8654 VkBufferViewCreateInfo buff_view_ci = {};
8655 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
8656 buff_view_ci.buffer = buffer;
8657 buff_view_ci.format = VK_FORMAT_R8_UNORM;
8658 buff_view_ci.range = VK_WHOLE_SIZE;
8659 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008660 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008661 ASSERT_VK_SUCCESS(err);
8662
8663 // Create an image to be used for invalid updates
8664 VkImageCreateInfo image_ci = {};
8665 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8666 image_ci.imageType = VK_IMAGE_TYPE_2D;
8667 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
8668 image_ci.extent.width = 64;
8669 image_ci.extent.height = 64;
8670 image_ci.extent.depth = 1;
8671 image_ci.mipLevels = 1;
8672 image_ci.arrayLayers = 1;
8673 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
8674 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
8675 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
8676 // This usage is not valid for any descriptor type
8677 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8678 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8679 VkImage image;
8680 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
8681 ASSERT_VK_SUCCESS(err);
8682 // Bind memory to image
8683 VkMemoryRequirements mem_reqs;
8684 VkDeviceMemory image_mem;
8685 bool pass;
8686 VkMemoryAllocateInfo mem_alloc = {};
8687 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8688 mem_alloc.pNext = NULL;
8689 mem_alloc.allocationSize = 0;
8690 mem_alloc.memoryTypeIndex = 0;
8691 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
8692 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008693 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008694 ASSERT_TRUE(pass);
8695 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
8696 ASSERT_VK_SUCCESS(err);
8697 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
8698 ASSERT_VK_SUCCESS(err);
8699 // Now create view for image
8700 VkImageViewCreateInfo image_view_ci = {};
8701 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8702 image_view_ci.image = image;
8703 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
8704 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
8705 image_view_ci.subresourceRange.layerCount = 1;
8706 image_view_ci.subresourceRange.baseArrayLayer = 0;
8707 image_view_ci.subresourceRange.levelCount = 1;
8708 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8709 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008710 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008711 ASSERT_VK_SUCCESS(err);
8712
8713 VkDescriptorBufferInfo buff_info = {};
8714 buff_info.buffer = buffer;
8715 VkDescriptorImageInfo img_info = {};
8716 img_info.imageView = image_view;
8717 VkWriteDescriptorSet descriptor_write = {};
8718 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8719 descriptor_write.dstBinding = 0;
8720 descriptor_write.descriptorCount = 1;
8721 descriptor_write.pTexelBufferView = &buff_view;
8722 descriptor_write.pBufferInfo = &buff_info;
8723 descriptor_write.pImageInfo = &img_info;
8724
8725 // These error messages align with VkDescriptorType struct
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008726 const char *error_msgs[] = {"", // placeholder, no error for SAMPLER descriptor
8727 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
8728 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
8729 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
8730 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
8731 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
8732 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
8733 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
8734 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
8735 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
8736 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008737 // Start loop at 1 as SAMPLER desc type has no usage bit error
8738 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8739 descriptor_write.descriptorType = VkDescriptorType(i);
8740 descriptor_write.dstSet = descriptor_sets[i];
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msgs[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008742
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008743 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008744
8745 m_errorMonitor->VerifyFound();
8746 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
8747 }
8748 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
8749 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008750 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008751 vkDestroyImageView(m_device->device(), image_view, NULL);
8752 vkDestroyBuffer(m_device->device(), buffer, NULL);
8753 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008754 vkFreeDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008755 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8756}
8757
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008758TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008759 TEST_DESCRIPTION("Attempt to update buffer descriptor set that has incorrect "
8760 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
8761 "1. offset value greater than buffer size\n"
8762 "2. range value of 0\n"
8763 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008764 VkResult err;
8765
8766 ASSERT_NO_FATAL_FAILURE(InitState());
8767 VkDescriptorPoolSize ds_type_count = {};
8768 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8769 ds_type_count.descriptorCount = 1;
8770
8771 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8772 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8773 ds_pool_ci.pNext = NULL;
8774 ds_pool_ci.maxSets = 1;
8775 ds_pool_ci.poolSizeCount = 1;
8776 ds_pool_ci.pPoolSizes = &ds_type_count;
8777
8778 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008779 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008780 ASSERT_VK_SUCCESS(err);
8781
8782 // Create layout with single uniform buffer descriptor
8783 VkDescriptorSetLayoutBinding dsl_binding = {};
8784 dsl_binding.binding = 0;
8785 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8786 dsl_binding.descriptorCount = 1;
8787 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8788 dsl_binding.pImmutableSamplers = NULL;
8789
8790 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8791 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8792 ds_layout_ci.pNext = NULL;
8793 ds_layout_ci.bindingCount = 1;
8794 ds_layout_ci.pBindings = &dsl_binding;
8795 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008796 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008797 ASSERT_VK_SUCCESS(err);
8798
8799 VkDescriptorSet descriptor_set = {};
8800 VkDescriptorSetAllocateInfo alloc_info = {};
8801 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8802 alloc_info.descriptorSetCount = 1;
8803 alloc_info.descriptorPool = ds_pool;
8804 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008805 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008806 ASSERT_VK_SUCCESS(err);
8807
8808 // Create a buffer to be used for invalid updates
8809 VkBufferCreateInfo buff_ci = {};
8810 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8811 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8812 buff_ci.size = 256;
8813 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8814 VkBuffer buffer;
8815 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
8816 ASSERT_VK_SUCCESS(err);
8817 // Have to bind memory to buffer before descriptor update
8818 VkMemoryAllocateInfo mem_alloc = {};
8819 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8820 mem_alloc.pNext = NULL;
8821 mem_alloc.allocationSize = 256;
8822 mem_alloc.memoryTypeIndex = 0;
8823
8824 VkMemoryRequirements mem_reqs;
8825 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008826 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008827 if (!pass) {
8828 vkDestroyBuffer(m_device->device(), buffer, NULL);
8829 return;
8830 }
8831
8832 VkDeviceMemory mem;
8833 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
8834 ASSERT_VK_SUCCESS(err);
8835 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
8836 ASSERT_VK_SUCCESS(err);
8837
8838 VkDescriptorBufferInfo buff_info = {};
8839 buff_info.buffer = buffer;
8840 // First make offset 1 larger than buffer size
8841 buff_info.offset = 257;
8842 buff_info.range = VK_WHOLE_SIZE;
8843 VkWriteDescriptorSet descriptor_write = {};
8844 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8845 descriptor_write.dstBinding = 0;
8846 descriptor_write.descriptorCount = 1;
8847 descriptor_write.pTexelBufferView = nullptr;
8848 descriptor_write.pBufferInfo = &buff_info;
8849 descriptor_write.pImageInfo = nullptr;
8850
8851 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8852 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " offset of 257 is greater than buffer ");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008854
8855 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8856
8857 m_errorMonitor->VerifyFound();
8858 // Now cause error due to range of 0
8859 buff_info.offset = 0;
8860 buff_info.range = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8862 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008863
8864 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8865
8866 m_errorMonitor->VerifyFound();
8867 // Now cause error due to range exceeding buffer size - offset
8868 buff_info.offset = 128;
8869 buff_info.range = 200;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008870 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 -06008871
8872 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8873
8874 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06008875 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008876 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8877 vkDestroyBuffer(m_device->device(), buffer, NULL);
8878 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
8879 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8880}
8881
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008882TEST_F(VkLayerTest, DSAspectBitsErrors) {
8883 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
8884 // are set, but could expand this test to hit more cases.
8885 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
8886 "that do not have correct aspect bits sets.");
8887 VkResult err;
8888
8889 ASSERT_NO_FATAL_FAILURE(InitState());
8890 VkDescriptorPoolSize ds_type_count = {};
8891 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8892 ds_type_count.descriptorCount = 1;
8893
8894 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8895 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8896 ds_pool_ci.pNext = NULL;
8897 ds_pool_ci.maxSets = 5;
8898 ds_pool_ci.poolSizeCount = 1;
8899 ds_pool_ci.pPoolSizes = &ds_type_count;
8900
8901 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008902 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008903 ASSERT_VK_SUCCESS(err);
8904
8905 VkDescriptorSetLayoutBinding dsl_binding = {};
8906 dsl_binding.binding = 0;
8907 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8908 dsl_binding.descriptorCount = 1;
8909 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8910 dsl_binding.pImmutableSamplers = NULL;
8911
8912 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8913 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8914 ds_layout_ci.pNext = NULL;
8915 ds_layout_ci.bindingCount = 1;
8916 ds_layout_ci.pBindings = &dsl_binding;
8917 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008918 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008919 ASSERT_VK_SUCCESS(err);
8920
8921 VkDescriptorSet descriptor_set = {};
8922 VkDescriptorSetAllocateInfo alloc_info = {};
8923 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8924 alloc_info.descriptorSetCount = 1;
8925 alloc_info.descriptorPool = ds_pool;
8926 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008927 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008928 ASSERT_VK_SUCCESS(err);
8929
8930 // Create an image to be used for invalid updates
8931 VkImageCreateInfo image_ci = {};
8932 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8933 image_ci.imageType = VK_IMAGE_TYPE_2D;
8934 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
8935 image_ci.extent.width = 64;
8936 image_ci.extent.height = 64;
8937 image_ci.extent.depth = 1;
8938 image_ci.mipLevels = 1;
8939 image_ci.arrayLayers = 1;
8940 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
8941 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
8942 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
8943 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8944 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8945 VkImage image;
8946 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
8947 ASSERT_VK_SUCCESS(err);
8948 // Bind memory to image
8949 VkMemoryRequirements mem_reqs;
8950 VkDeviceMemory image_mem;
8951 bool pass;
8952 VkMemoryAllocateInfo mem_alloc = {};
8953 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8954 mem_alloc.pNext = NULL;
8955 mem_alloc.allocationSize = 0;
8956 mem_alloc.memoryTypeIndex = 0;
8957 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
8958 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008959 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008960 ASSERT_TRUE(pass);
8961 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
8962 ASSERT_VK_SUCCESS(err);
8963 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
8964 ASSERT_VK_SUCCESS(err);
8965 // Now create view for image
8966 VkImageViewCreateInfo image_view_ci = {};
8967 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8968 image_view_ci.image = image;
8969 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
8970 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
8971 image_view_ci.subresourceRange.layerCount = 1;
8972 image_view_ci.subresourceRange.baseArrayLayer = 0;
8973 image_view_ci.subresourceRange.levelCount = 1;
8974 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008975 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008976
8977 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008978 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008979 ASSERT_VK_SUCCESS(err);
8980
8981 VkDescriptorImageInfo img_info = {};
8982 img_info.imageView = image_view;
8983 VkWriteDescriptorSet descriptor_write = {};
8984 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8985 descriptor_write.dstBinding = 0;
8986 descriptor_write.descriptorCount = 1;
8987 descriptor_write.pTexelBufferView = NULL;
8988 descriptor_write.pBufferInfo = NULL;
8989 descriptor_write.pImageInfo = &img_info;
8990 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8991 descriptor_write.dstSet = descriptor_set;
8992 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
8993 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008995
8996 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8997
8998 m_errorMonitor->VerifyFound();
8999 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9000 vkDestroyImage(m_device->device(), image, NULL);
9001 vkFreeMemory(m_device->device(), image_mem, NULL);
9002 vkDestroyImageView(m_device->device(), image_view, NULL);
9003 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9004 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9005}
9006
Karl Schultz6addd812016-02-02 17:17:23 -07009007TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009008 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07009009 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009010
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9012 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
9013 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009014
Tobin Ehlis3b780662015-05-28 12:11:26 -06009015 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009016 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009017 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009018 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9019 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009020
9021 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009022 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9023 ds_pool_ci.pNext = NULL;
9024 ds_pool_ci.maxSets = 1;
9025 ds_pool_ci.poolSizeCount = 1;
9026 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009027
Tobin Ehlis3b780662015-05-28 12:11:26 -06009028 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009029 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009030 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009031 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009032 dsl_binding.binding = 0;
9033 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9034 dsl_binding.descriptorCount = 1;
9035 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9036 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009037
Tony Barboureb254902015-07-15 12:50:33 -06009038 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009039 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9040 ds_layout_ci.pNext = NULL;
9041 ds_layout_ci.bindingCount = 1;
9042 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009043
Tobin Ehlis3b780662015-05-28 12:11:26 -06009044 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009045 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009046 ASSERT_VK_SUCCESS(err);
9047
9048 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009049 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009050 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009051 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009052 alloc_info.descriptorPool = ds_pool;
9053 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009054 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009055 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009056
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009057 VkSamplerCreateInfo sampler_ci = {};
9058 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9059 sampler_ci.pNext = NULL;
9060 sampler_ci.magFilter = VK_FILTER_NEAREST;
9061 sampler_ci.minFilter = VK_FILTER_NEAREST;
9062 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9063 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9064 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9065 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9066 sampler_ci.mipLodBias = 1.0;
9067 sampler_ci.anisotropyEnable = VK_FALSE;
9068 sampler_ci.maxAnisotropy = 1;
9069 sampler_ci.compareEnable = VK_FALSE;
9070 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9071 sampler_ci.minLod = 1.0;
9072 sampler_ci.maxLod = 1.0;
9073 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9074 sampler_ci.unnormalizedCoordinates = VK_FALSE;
9075 VkSampler sampler;
9076 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9077 ASSERT_VK_SUCCESS(err);
9078
9079 VkDescriptorImageInfo info = {};
9080 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009081
9082 VkWriteDescriptorSet descriptor_write;
9083 memset(&descriptor_write, 0, sizeof(descriptor_write));
9084 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009085 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009086 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009087 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009088 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009089 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009090
9091 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9092
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009093 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009094
Chia-I Wuf7458c52015-10-26 21:10:41 +08009095 vkDestroySampler(m_device->device(), sampler, NULL);
9096 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9097 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009098}
9099
Karl Schultz6addd812016-02-02 17:17:23 -07009100TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009101 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07009102 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009103
Tobin Ehlisf922ef82016-11-30 10:19:14 -07009104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009105
Tobin Ehlis3b780662015-05-28 12:11:26 -06009106 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009107 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009108 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009109 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9110 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009111
9112 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009113 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9114 ds_pool_ci.pNext = NULL;
9115 ds_pool_ci.maxSets = 1;
9116 ds_pool_ci.poolSizeCount = 1;
9117 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009118
Tobin Ehlis3b780662015-05-28 12:11:26 -06009119 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009120 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009121 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009122
Tony Barboureb254902015-07-15 12:50:33 -06009123 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009124 dsl_binding.binding = 0;
9125 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9126 dsl_binding.descriptorCount = 1;
9127 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9128 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009129
9130 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009131 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9132 ds_layout_ci.pNext = NULL;
9133 ds_layout_ci.bindingCount = 1;
9134 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009135
Tobin Ehlis3b780662015-05-28 12:11:26 -06009136 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009137 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009138 ASSERT_VK_SUCCESS(err);
9139
9140 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009141 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009142 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009143 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009144 alloc_info.descriptorPool = ds_pool;
9145 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009146 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009147 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009148
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009149 // Correctly update descriptor to avoid "NOT_UPDATED" error
9150 VkDescriptorBufferInfo buff_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009151 buff_info.buffer = VkBuffer(0); // Don't care about buffer handle for this test
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009152 buff_info.offset = 0;
9153 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009154
9155 VkWriteDescriptorSet descriptor_write;
9156 memset(&descriptor_write, 0, sizeof(descriptor_write));
9157 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009158 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009159 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08009160 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009161 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9162 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009163
9164 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9165
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009166 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009167
Chia-I Wuf7458c52015-10-26 21:10:41 +08009168 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, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009173 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -07009174 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009175
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
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;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -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;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009207 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009208 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009209 ASSERT_VK_SUCCESS(err);
9210
9211 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009212 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009213 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009214 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009215 alloc_info.descriptorPool = ds_pool;
9216 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009217 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009218 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009219
Tony Barboureb254902015-07-15 12:50:33 -06009220 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009221 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9222 sampler_ci.pNext = NULL;
9223 sampler_ci.magFilter = VK_FILTER_NEAREST;
9224 sampler_ci.minFilter = VK_FILTER_NEAREST;
9225 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9226 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9227 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9228 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9229 sampler_ci.mipLodBias = 1.0;
9230 sampler_ci.anisotropyEnable = VK_FALSE;
9231 sampler_ci.maxAnisotropy = 1;
9232 sampler_ci.compareEnable = VK_FALSE;
9233 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9234 sampler_ci.minLod = 1.0;
9235 sampler_ci.maxLod = 1.0;
9236 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9237 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06009238
Tobin Ehlis3b780662015-05-28 12:11:26 -06009239 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009240 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009241 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009242
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009243 VkDescriptorImageInfo info = {};
9244 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009245
9246 VkWriteDescriptorSet descriptor_write;
9247 memset(&descriptor_write, 0, sizeof(descriptor_write));
9248 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009249 descriptor_write.dstSet = descriptorSet;
9250 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009251 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009252 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009253 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009254 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009255
9256 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9257
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009258 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009259
Chia-I Wuf7458c52015-10-26 21:10:41 +08009260 vkDestroySampler(m_device->device(), sampler, NULL);
9261 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9262 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009263}
9264
Tobin Ehlise202b2d2016-11-21 10:36:16 -07009265TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
9266 // Create layout w/ empty binding and attempt to update it
9267 VkResult err;
9268
9269 ASSERT_NO_FATAL_FAILURE(InitState());
9270
9271 VkDescriptorPoolSize ds_type_count = {};
9272 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
9273 ds_type_count.descriptorCount = 1;
9274
9275 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9276 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9277 ds_pool_ci.pNext = NULL;
9278 ds_pool_ci.maxSets = 1;
9279 ds_pool_ci.poolSizeCount = 1;
9280 ds_pool_ci.pPoolSizes = &ds_type_count;
9281
9282 VkDescriptorPool ds_pool;
9283 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9284 ASSERT_VK_SUCCESS(err);
9285
9286 VkDescriptorSetLayoutBinding dsl_binding = {};
9287 dsl_binding.binding = 0;
9288 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9289 dsl_binding.descriptorCount = 0;
9290 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9291 dsl_binding.pImmutableSamplers = NULL;
9292
9293 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9294 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9295 ds_layout_ci.pNext = NULL;
9296 ds_layout_ci.bindingCount = 1;
9297 ds_layout_ci.pBindings = &dsl_binding;
9298 VkDescriptorSetLayout ds_layout;
9299 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9300 ASSERT_VK_SUCCESS(err);
9301
9302 VkDescriptorSet descriptor_set;
9303 VkDescriptorSetAllocateInfo alloc_info = {};
9304 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9305 alloc_info.descriptorSetCount = 1;
9306 alloc_info.descriptorPool = ds_pool;
9307 alloc_info.pSetLayouts = &ds_layout;
9308 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9309 ASSERT_VK_SUCCESS(err);
9310
9311 VkSamplerCreateInfo sampler_ci = {};
9312 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9313 sampler_ci.magFilter = VK_FILTER_NEAREST;
9314 sampler_ci.minFilter = VK_FILTER_NEAREST;
9315 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9316 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9317 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9318 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9319 sampler_ci.mipLodBias = 1.0;
9320 sampler_ci.maxAnisotropy = 1;
9321 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9322 sampler_ci.minLod = 1.0;
9323 sampler_ci.maxLod = 1.0;
9324 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9325
9326 VkSampler sampler;
9327 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9328 ASSERT_VK_SUCCESS(err);
9329
9330 VkDescriptorImageInfo info = {};
9331 info.sampler = sampler;
9332
9333 VkWriteDescriptorSet descriptor_write;
9334 memset(&descriptor_write, 0, sizeof(descriptor_write));
9335 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9336 descriptor_write.dstSet = descriptor_set;
9337 descriptor_write.dstBinding = 0;
9338 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
9339 // This is the wrong type, but empty binding error will be flagged first
9340 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9341 descriptor_write.pImageInfo = &info;
9342
9343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
9344 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9345 m_errorMonitor->VerifyFound();
9346
9347 vkDestroySampler(m_device->device(), sampler, NULL);
9348 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9349 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9350}
9351
Karl Schultz6addd812016-02-02 17:17:23 -07009352TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
9353 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
9354 // types
9355 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009356
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009357 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 -06009358
Tobin Ehlis3b780662015-05-28 12:11:26 -06009359 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009360
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009361 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009362 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9363 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009364
9365 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009366 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9367 ds_pool_ci.pNext = NULL;
9368 ds_pool_ci.maxSets = 1;
9369 ds_pool_ci.poolSizeCount = 1;
9370 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009371
Tobin Ehlis3b780662015-05-28 12:11:26 -06009372 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009373 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009374 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009375 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009376 dsl_binding.binding = 0;
9377 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9378 dsl_binding.descriptorCount = 1;
9379 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9380 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009381
Tony Barboureb254902015-07-15 12:50:33 -06009382 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009383 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9384 ds_layout_ci.pNext = NULL;
9385 ds_layout_ci.bindingCount = 1;
9386 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009387
Tobin Ehlis3b780662015-05-28 12:11:26 -06009388 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009389 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009390 ASSERT_VK_SUCCESS(err);
9391
9392 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009393 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009394 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009395 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009396 alloc_info.descriptorPool = ds_pool;
9397 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009398 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009399 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009400
Tony Barboureb254902015-07-15 12:50:33 -06009401 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009402 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9403 sampler_ci.pNext = NULL;
9404 sampler_ci.magFilter = VK_FILTER_NEAREST;
9405 sampler_ci.minFilter = VK_FILTER_NEAREST;
9406 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9407 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9408 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9409 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9410 sampler_ci.mipLodBias = 1.0;
9411 sampler_ci.anisotropyEnable = VK_FALSE;
9412 sampler_ci.maxAnisotropy = 1;
9413 sampler_ci.compareEnable = VK_FALSE;
9414 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9415 sampler_ci.minLod = 1.0;
9416 sampler_ci.maxLod = 1.0;
9417 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9418 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009419 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009420 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009421 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009422
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009423 VkDescriptorImageInfo info = {};
9424 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009425
9426 VkWriteDescriptorSet descriptor_write;
9427 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009428 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009429 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009430 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009431 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009432 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009433 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009434
9435 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9436
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009437 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009438
Chia-I Wuf7458c52015-10-26 21:10:41 +08009439 vkDestroySampler(m_device->device(), sampler, NULL);
9440 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9441 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009442}
9443
Karl Schultz6addd812016-02-02 17:17:23 -07009444TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009445 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07009446 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009447
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9449 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009450
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009451 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009452 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
9453 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009454 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009455 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
9456 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009457
9458 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009459 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9460 ds_pool_ci.pNext = NULL;
9461 ds_pool_ci.maxSets = 1;
9462 ds_pool_ci.poolSizeCount = 1;
9463 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009464
9465 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009466 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009467 ASSERT_VK_SUCCESS(err);
9468
9469 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009470 dsl_binding.binding = 0;
9471 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9472 dsl_binding.descriptorCount = 1;
9473 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9474 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009475
9476 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009477 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9478 ds_layout_ci.pNext = NULL;
9479 ds_layout_ci.bindingCount = 1;
9480 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009481 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009482 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009483 ASSERT_VK_SUCCESS(err);
9484
9485 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009486 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009487 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009488 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009489 alloc_info.descriptorPool = ds_pool;
9490 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009491 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009492 ASSERT_VK_SUCCESS(err);
9493
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009494 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009495
9496 VkDescriptorImageInfo descriptor_info;
9497 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
9498 descriptor_info.sampler = sampler;
9499
9500 VkWriteDescriptorSet descriptor_write;
9501 memset(&descriptor_write, 0, sizeof(descriptor_write));
9502 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009503 descriptor_write.dstSet = descriptorSet;
9504 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009505 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009506 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9507 descriptor_write.pImageInfo = &descriptor_info;
9508
9509 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9510
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009511 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009512
Chia-I Wuf7458c52015-10-26 21:10:41 +08009513 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9514 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009515}
9516
Karl Schultz6addd812016-02-02 17:17:23 -07009517TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
9518 // Create a single combined Image/Sampler descriptor and send it an invalid
9519 // imageView
9520 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009521
Karl Schultzf78bcdd2016-11-30 12:36:01 -07009522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009523
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009524 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009525 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009526 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9527 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009528
9529 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009530 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9531 ds_pool_ci.pNext = NULL;
9532 ds_pool_ci.maxSets = 1;
9533 ds_pool_ci.poolSizeCount = 1;
9534 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009535
9536 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009537 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009538 ASSERT_VK_SUCCESS(err);
9539
9540 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009541 dsl_binding.binding = 0;
9542 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9543 dsl_binding.descriptorCount = 1;
9544 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9545 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009546
9547 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009548 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9549 ds_layout_ci.pNext = NULL;
9550 ds_layout_ci.bindingCount = 1;
9551 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009552 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009553 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009554 ASSERT_VK_SUCCESS(err);
9555
9556 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009557 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009558 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009559 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009560 alloc_info.descriptorPool = ds_pool;
9561 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009562 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009563 ASSERT_VK_SUCCESS(err);
9564
9565 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009566 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9567 sampler_ci.pNext = NULL;
9568 sampler_ci.magFilter = VK_FILTER_NEAREST;
9569 sampler_ci.minFilter = VK_FILTER_NEAREST;
9570 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9571 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9572 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9573 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9574 sampler_ci.mipLodBias = 1.0;
9575 sampler_ci.anisotropyEnable = VK_FALSE;
9576 sampler_ci.maxAnisotropy = 1;
9577 sampler_ci.compareEnable = VK_FALSE;
9578 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9579 sampler_ci.minLod = 1.0;
9580 sampler_ci.maxLod = 1.0;
9581 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9582 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009583
9584 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009585 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009586 ASSERT_VK_SUCCESS(err);
9587
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009588 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009589
9590 VkDescriptorImageInfo descriptor_info;
9591 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
9592 descriptor_info.sampler = sampler;
9593 descriptor_info.imageView = view;
9594
9595 VkWriteDescriptorSet descriptor_write;
9596 memset(&descriptor_write, 0, sizeof(descriptor_write));
9597 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009598 descriptor_write.dstSet = descriptorSet;
9599 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009600 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009601 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9602 descriptor_write.pImageInfo = &descriptor_info;
9603
9604 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9605
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009606 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009607
Chia-I Wuf7458c52015-10-26 21:10:41 +08009608 vkDestroySampler(m_device->device(), sampler, NULL);
9609 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9610 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009611}
9612
Karl Schultz6addd812016-02-02 17:17:23 -07009613TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
9614 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
9615 // into the other
9616 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009617
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009618 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding #1 with type "
9619 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
9620 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009621
Tobin Ehlis04356f92015-10-27 16:35:27 -06009622 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009623 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009624 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009625 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9626 ds_type_count[0].descriptorCount = 1;
9627 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
9628 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009629
9630 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009631 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9632 ds_pool_ci.pNext = NULL;
9633 ds_pool_ci.maxSets = 1;
9634 ds_pool_ci.poolSizeCount = 2;
9635 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009636
9637 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009638 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009639 ASSERT_VK_SUCCESS(err);
9640 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009641 dsl_binding[0].binding = 0;
9642 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9643 dsl_binding[0].descriptorCount = 1;
9644 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9645 dsl_binding[0].pImmutableSamplers = NULL;
9646 dsl_binding[1].binding = 1;
9647 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9648 dsl_binding[1].descriptorCount = 1;
9649 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9650 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009651
9652 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009653 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9654 ds_layout_ci.pNext = NULL;
9655 ds_layout_ci.bindingCount = 2;
9656 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009657
9658 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009659 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009660 ASSERT_VK_SUCCESS(err);
9661
9662 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009663 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009664 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009665 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009666 alloc_info.descriptorPool = ds_pool;
9667 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009668 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009669 ASSERT_VK_SUCCESS(err);
9670
9671 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009672 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9673 sampler_ci.pNext = NULL;
9674 sampler_ci.magFilter = VK_FILTER_NEAREST;
9675 sampler_ci.minFilter = VK_FILTER_NEAREST;
9676 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9677 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9678 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9679 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9680 sampler_ci.mipLodBias = 1.0;
9681 sampler_ci.anisotropyEnable = VK_FALSE;
9682 sampler_ci.maxAnisotropy = 1;
9683 sampler_ci.compareEnable = VK_FALSE;
9684 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9685 sampler_ci.minLod = 1.0;
9686 sampler_ci.maxLod = 1.0;
9687 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9688 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009689
9690 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009691 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009692 ASSERT_VK_SUCCESS(err);
9693
9694 VkDescriptorImageInfo info = {};
9695 info.sampler = sampler;
9696
9697 VkWriteDescriptorSet descriptor_write;
9698 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
9699 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009700 descriptor_write.dstSet = descriptorSet;
9701 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08009702 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009703 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9704 descriptor_write.pImageInfo = &info;
9705 // This write update should succeed
9706 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9707 // Now perform a copy update that fails due to type mismatch
9708 VkCopyDescriptorSet copy_ds_update;
9709 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9710 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9711 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06009712 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009713 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07009714 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08009715 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06009716 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9717
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009718 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06009719 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009720 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 -06009721 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9722 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9723 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009724 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009725 copy_ds_update.dstSet = descriptorSet;
9726 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06009727 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06009728 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9729
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009730 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009731
Tobin Ehlis04356f92015-10-27 16:35:27 -06009732 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
9734 "update array offset of 0 and update of "
9735 "5 descriptors oversteps total number "
9736 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009737
Tobin Ehlis04356f92015-10-27 16:35:27 -06009738 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9739 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9740 copy_ds_update.srcSet = descriptorSet;
9741 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009742 copy_ds_update.dstSet = descriptorSet;
9743 copy_ds_update.dstBinding = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009744 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06009745 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9746
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009747 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06009748
Chia-I Wuf7458c52015-10-26 21:10:41 +08009749 vkDestroySampler(m_device->device(), sampler, NULL);
9750 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9751 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009752}
9753
Karl Schultz6addd812016-02-02 17:17:23 -07009754TEST_F(VkLayerTest, NumSamplesMismatch) {
9755 // Create CommandBuffer where MSAA samples doesn't match RenderPass
9756 // sampleCount
9757 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009758
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009760
Tobin Ehlis3b780662015-05-28 12:11:26 -06009761 ASSERT_NO_FATAL_FAILURE(InitState());
9762 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009763 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06009764 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009765 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009766
9767 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009768 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9769 ds_pool_ci.pNext = NULL;
9770 ds_pool_ci.maxSets = 1;
9771 ds_pool_ci.poolSizeCount = 1;
9772 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009773
Tobin Ehlis3b780662015-05-28 12:11:26 -06009774 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009775 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009776 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009777
Tony Barboureb254902015-07-15 12:50:33 -06009778 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08009779 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06009780 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08009781 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009782 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9783 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009784
Tony Barboureb254902015-07-15 12:50:33 -06009785 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9786 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9787 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009788 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07009789 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009790
Tobin Ehlis3b780662015-05-28 12:11:26 -06009791 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009792 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009793 ASSERT_VK_SUCCESS(err);
9794
9795 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009796 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009797 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009798 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009799 alloc_info.descriptorPool = ds_pool;
9800 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009801 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009802 ASSERT_VK_SUCCESS(err);
9803
Tony Barboureb254902015-07-15 12:50:33 -06009804 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009805 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07009806 pipe_ms_state_ci.pNext = NULL;
9807 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
9808 pipe_ms_state_ci.sampleShadingEnable = 0;
9809 pipe_ms_state_ci.minSampleShading = 1.0;
9810 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009811
Tony Barboureb254902015-07-15 12:50:33 -06009812 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009813 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9814 pipeline_layout_ci.pNext = NULL;
9815 pipeline_layout_ci.setLayoutCount = 1;
9816 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009817
9818 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009819 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009820 ASSERT_VK_SUCCESS(err);
9821
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009822 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9823 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
9824 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06009825 VkPipelineObj pipe(m_device);
9826 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06009827 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06009828 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06009829 pipe.SetMSAA(&pipe_ms_state_ci);
9830 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06009831
Tony Barbourfe3351b2015-07-28 10:17:20 -06009832 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009833 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06009834
Mark Young29927482016-05-04 14:38:51 -06009835 // Render triangle (the error should trigger on the attempt to draw).
9836 Draw(3, 1, 0, 0);
9837
9838 // Finalize recording of the command buffer
9839 EndCommandBuffer();
9840
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009841 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009842
Chia-I Wuf7458c52015-10-26 21:10:41 +08009843 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9844 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9845 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009846}
Mark Young29927482016-05-04 14:38:51 -06009847
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009848TEST_F(VkLayerTest, RenderPassIncompatible) {
9849 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
9850 "Initial case is drawing with an active renderpass that's "
Mike Weiblencce7ec72016-10-17 19:33:05 -06009851 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009852 VkResult err;
9853
9854 ASSERT_NO_FATAL_FAILURE(InitState());
9855 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9856
9857 VkDescriptorSetLayoutBinding dsl_binding = {};
9858 dsl_binding.binding = 0;
9859 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9860 dsl_binding.descriptorCount = 1;
9861 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9862 dsl_binding.pImmutableSamplers = NULL;
9863
9864 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9865 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9866 ds_layout_ci.pNext = NULL;
9867 ds_layout_ci.bindingCount = 1;
9868 ds_layout_ci.pBindings = &dsl_binding;
9869
9870 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009871 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009872 ASSERT_VK_SUCCESS(err);
9873
9874 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9875 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9876 pipeline_layout_ci.pNext = NULL;
9877 pipeline_layout_ci.setLayoutCount = 1;
9878 pipeline_layout_ci.pSetLayouts = &ds_layout;
9879
9880 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009881 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009882 ASSERT_VK_SUCCESS(err);
9883
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009884 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9885 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
9886 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009887 // Create a renderpass that will be incompatible with default renderpass
9888 VkAttachmentReference attach = {};
9889 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
9890 VkAttachmentReference color_att = {};
9891 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9892 VkSubpassDescription subpass = {};
9893 subpass.inputAttachmentCount = 1;
9894 subpass.pInputAttachments = &attach;
9895 subpass.colorAttachmentCount = 1;
9896 subpass.pColorAttachments = &color_att;
9897 VkRenderPassCreateInfo rpci = {};
9898 rpci.subpassCount = 1;
9899 rpci.pSubpasses = &subpass;
9900 rpci.attachmentCount = 1;
9901 VkAttachmentDescription attach_desc = {};
9902 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -06009903 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
9904 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009905 rpci.pAttachments = &attach_desc;
9906 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9907 VkRenderPass rp;
9908 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9909 VkPipelineObj pipe(m_device);
9910 pipe.AddShader(&vs);
9911 pipe.AddShader(&fs);
9912 pipe.AddColorAttachment();
9913 VkViewport view_port = {};
9914 m_viewports.push_back(view_port);
9915 pipe.SetViewport(m_viewports);
9916 VkRect2D rect = {};
9917 m_scissors.push_back(rect);
9918 pipe.SetScissor(m_scissors);
9919 pipe.CreateVKPipeline(pipeline_layout, renderPass());
9920
9921 VkCommandBufferInheritanceInfo cbii = {};
9922 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9923 cbii.renderPass = rp;
9924 cbii.subpass = 0;
9925 VkCommandBufferBeginInfo cbbi = {};
9926 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9927 cbbi.pInheritanceInfo = &cbii;
9928 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
9929 VkRenderPassBeginInfo rpbi = {};
9930 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9931 rpbi.framebuffer = m_framebuffer;
9932 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009933 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9934 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009935
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009937 // Render triangle (the error should trigger on the attempt to draw).
9938 Draw(3, 1, 0, 0);
9939
9940 // Finalize recording of the command buffer
9941 EndCommandBuffer();
9942
9943 m_errorMonitor->VerifyFound();
9944
9945 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9946 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9947 vkDestroyRenderPass(m_device->device(), rp, NULL);
9948}
9949
Mark Youngc89c6312016-03-31 16:03:20 -06009950TEST_F(VkLayerTest, NumBlendAttachMismatch) {
9951 // Create Pipeline where the number of blend attachments doesn't match the
9952 // number of color attachments. In this case, we don't add any color
9953 // blend attachments even though we have a color attachment.
9954 VkResult err;
9955
9956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009957 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06009958
9959 ASSERT_NO_FATAL_FAILURE(InitState());
9960 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9961 VkDescriptorPoolSize ds_type_count = {};
9962 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9963 ds_type_count.descriptorCount = 1;
9964
9965 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9966 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9967 ds_pool_ci.pNext = NULL;
9968 ds_pool_ci.maxSets = 1;
9969 ds_pool_ci.poolSizeCount = 1;
9970 ds_pool_ci.pPoolSizes = &ds_type_count;
9971
9972 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009973 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -06009974 ASSERT_VK_SUCCESS(err);
9975
9976 VkDescriptorSetLayoutBinding dsl_binding = {};
9977 dsl_binding.binding = 0;
9978 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9979 dsl_binding.descriptorCount = 1;
9980 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9981 dsl_binding.pImmutableSamplers = NULL;
9982
9983 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9984 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9985 ds_layout_ci.pNext = NULL;
9986 ds_layout_ci.bindingCount = 1;
9987 ds_layout_ci.pBindings = &dsl_binding;
9988
9989 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009990 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -06009991 ASSERT_VK_SUCCESS(err);
9992
9993 VkDescriptorSet descriptorSet;
9994 VkDescriptorSetAllocateInfo alloc_info = {};
9995 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9996 alloc_info.descriptorSetCount = 1;
9997 alloc_info.descriptorPool = ds_pool;
9998 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009999 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060010000 ASSERT_VK_SUCCESS(err);
10001
10002 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010003 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060010004 pipe_ms_state_ci.pNext = NULL;
10005 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10006 pipe_ms_state_ci.sampleShadingEnable = 0;
10007 pipe_ms_state_ci.minSampleShading = 1.0;
10008 pipe_ms_state_ci.pSampleMask = NULL;
10009
10010 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10011 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10012 pipeline_layout_ci.pNext = NULL;
10013 pipeline_layout_ci.setLayoutCount = 1;
10014 pipeline_layout_ci.pSetLayouts = &ds_layout;
10015
10016 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010017 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010018 ASSERT_VK_SUCCESS(err);
10019
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010020 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10021 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10022 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060010023 VkPipelineObj pipe(m_device);
10024 pipe.AddShader(&vs);
10025 pipe.AddShader(&fs);
10026 pipe.SetMSAA(&pipe_ms_state_ci);
10027 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10028
10029 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010030 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Youngc89c6312016-03-31 16:03:20 -060010031
Mark Young29927482016-05-04 14:38:51 -060010032 // Render triangle (the error should trigger on the attempt to draw).
10033 Draw(3, 1, 0, 0);
10034
10035 // Finalize recording of the command buffer
10036 EndCommandBuffer();
10037
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010038 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060010039
10040 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10041 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10042 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10043}
Mark Young29927482016-05-04 14:38:51 -060010044
Mark Muellerd4914412016-06-13 17:52:06 -060010045TEST_F(VkLayerTest, MissingClearAttachment) {
10046 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
10047 "structure passed to vkCmdClearAttachments");
Cody Northropc31a84f2016-08-22 10:41:47 -060010048 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesda6ae6f2016-09-09 14:36:33 +120010049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesfa79fc72016-11-01 10:18:12 +130010050 "vkCmdClearAttachments() color attachment index 1 out of range for active subpass 0");
Mark Muellerd4914412016-06-13 17:52:06 -060010051
10052 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
10053 m_errorMonitor->VerifyFound();
10054}
10055
Karl Schultz6addd812016-02-02 17:17:23 -070010056TEST_F(VkLayerTest, ClearCmdNoDraw) {
10057 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
10058 // to issuing a Draw
10059 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010060
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060010062 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010063
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010064 ASSERT_NO_FATAL_FAILURE(InitState());
10065 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010066
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010067 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010068 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10069 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010070
10071 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010072 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10073 ds_pool_ci.pNext = NULL;
10074 ds_pool_ci.maxSets = 1;
10075 ds_pool_ci.poolSizeCount = 1;
10076 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010077
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010078 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010079 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010080 ASSERT_VK_SUCCESS(err);
10081
Tony Barboureb254902015-07-15 12:50:33 -060010082 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010083 dsl_binding.binding = 0;
10084 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10085 dsl_binding.descriptorCount = 1;
10086 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10087 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010088
Tony Barboureb254902015-07-15 12:50:33 -060010089 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010090 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10091 ds_layout_ci.pNext = NULL;
10092 ds_layout_ci.bindingCount = 1;
10093 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010094
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010095 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010096 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010097 ASSERT_VK_SUCCESS(err);
10098
10099 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010100 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010101 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010102 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010103 alloc_info.descriptorPool = ds_pool;
10104 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010105 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010106 ASSERT_VK_SUCCESS(err);
10107
Tony Barboureb254902015-07-15 12:50:33 -060010108 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010109 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010110 pipe_ms_state_ci.pNext = NULL;
10111 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10112 pipe_ms_state_ci.sampleShadingEnable = 0;
10113 pipe_ms_state_ci.minSampleShading = 1.0;
10114 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010115
Tony Barboureb254902015-07-15 12:50:33 -060010116 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010117 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10118 pipeline_layout_ci.pNext = NULL;
10119 pipeline_layout_ci.setLayoutCount = 1;
10120 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010121
10122 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010123 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010124 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010125
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010126 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060010127 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070010128 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010129 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010130
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010131 VkPipelineObj pipe(m_device);
10132 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010133 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010134 pipe.SetMSAA(&pipe_ms_state_ci);
10135 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010136
10137 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010138
Karl Schultz6addd812016-02-02 17:17:23 -070010139 // Main thing we care about for this test is that the VkImage obj we're
10140 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010141 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010142 VkClearAttachment color_attachment;
10143 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10144 color_attachment.clearValue.color.float32[0] = 1.0;
10145 color_attachment.clearValue.color.float32[1] = 1.0;
10146 color_attachment.clearValue.color.float32[2] = 1.0;
10147 color_attachment.clearValue.color.float32[3] = 1.0;
10148 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010149 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010150
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010151 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010152
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010153 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010154
Chia-I Wuf7458c52015-10-26 21:10:41 +080010155 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10156 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10157 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010158}
10159
Karl Schultz6addd812016-02-02 17:17:23 -070010160TEST_F(VkLayerTest, VtxBufferBadIndex) {
10161 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010162
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10164 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010165
Tobin Ehlis502480b2015-06-24 15:53:07 -060010166 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060010167 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060010168 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010169
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010170 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010171 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10172 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010173
10174 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010175 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10176 ds_pool_ci.pNext = NULL;
10177 ds_pool_ci.maxSets = 1;
10178 ds_pool_ci.poolSizeCount = 1;
10179 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010180
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010181 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010182 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010183 ASSERT_VK_SUCCESS(err);
10184
Tony Barboureb254902015-07-15 12:50:33 -060010185 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010186 dsl_binding.binding = 0;
10187 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10188 dsl_binding.descriptorCount = 1;
10189 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10190 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010191
Tony Barboureb254902015-07-15 12:50:33 -060010192 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010193 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10194 ds_layout_ci.pNext = NULL;
10195 ds_layout_ci.bindingCount = 1;
10196 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010197
Tobin Ehlis502480b2015-06-24 15:53:07 -060010198 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010199 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010200 ASSERT_VK_SUCCESS(err);
10201
10202 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010203 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010204 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010205 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010206 alloc_info.descriptorPool = ds_pool;
10207 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010208 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010209 ASSERT_VK_SUCCESS(err);
10210
Tony Barboureb254902015-07-15 12:50:33 -060010211 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010212 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010213 pipe_ms_state_ci.pNext = NULL;
10214 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10215 pipe_ms_state_ci.sampleShadingEnable = 0;
10216 pipe_ms_state_ci.minSampleShading = 1.0;
10217 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010218
Tony Barboureb254902015-07-15 12:50:33 -060010219 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010220 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10221 pipeline_layout_ci.pNext = NULL;
10222 pipeline_layout_ci.setLayoutCount = 1;
10223 pipeline_layout_ci.pSetLayouts = &ds_layout;
10224 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010225
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010226 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010227 ASSERT_VK_SUCCESS(err);
10228
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010229 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10230 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10231 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010232 VkPipelineObj pipe(m_device);
10233 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010234 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010235 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010236 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060010237 pipe.SetViewport(m_viewports);
10238 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010239 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010240
10241 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010242 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060010243 // Don't care about actual data, just need to get to draw to flag error
10244 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010245 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060010246 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060010247 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010248
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010249 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010250
Chia-I Wuf7458c52015-10-26 21:10:41 +080010251 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10252 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10253 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010254}
Mark Muellerdfe37552016-07-07 14:47:42 -060010255
Mark Mueller2ee294f2016-08-04 12:59:48 -060010256TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
10257 TEST_DESCRIPTION("Use an invalid count in a vkEnumeratePhysicalDevices call."
10258 "Use invalid Queue Family Index in vkCreateDevice");
Cody Northropc31a84f2016-08-22 10:41:47 -060010259 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Mueller2ee294f2016-08-04 12:59:48 -060010260
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010261 const char *mismatch_count_message = "Call to vkEnumeratePhysicalDevices() "
10262 "w/ pPhysicalDeviceCount value ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010263
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010264 const char *invalid_queueFamilyIndex_message = "Invalid queue create request in vkCreateDevice(). Invalid "
10265 "queueFamilyIndex ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010266
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010267 const char *unavailable_feature_message = "While calling vkCreateDevice(), requesting feature #";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010268
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, mismatch_count_message);
Mark Mueller880fce52016-08-17 15:23:23 -060010270 // The following test fails with recent NVidia drivers.
10271 // By the time core_validation is reached, the NVidia
10272 // driver has sanitized the invalid condition and core_validation
10273 // is not introduced to the failure condition. This is not the case
10274 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010275 // uint32_t count = static_cast<uint32_t>(~0);
10276 // VkPhysicalDevice physical_device;
10277 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
10278 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060010279
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queueFamilyIndex_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010281 float queue_priority = 0.0;
10282
10283 VkDeviceQueueCreateInfo queue_create_info = {};
10284 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
10285 queue_create_info.queueCount = 1;
10286 queue_create_info.pQueuePriorities = &queue_priority;
10287 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
10288
10289 VkPhysicalDeviceFeatures features = m_device->phy().features();
10290 VkDevice testDevice;
10291 VkDeviceCreateInfo device_create_info = {};
10292 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
10293 device_create_info.queueCreateInfoCount = 1;
10294 device_create_info.pQueueCreateInfos = &queue_create_info;
10295 device_create_info.pEnabledFeatures = &features;
10296 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
10297 m_errorMonitor->VerifyFound();
10298
10299 queue_create_info.queueFamilyIndex = 1;
10300
10301 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
10302 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
10303 for (unsigned i = 0; i < feature_count; i++) {
10304 if (VK_FALSE == feature_array[i]) {
10305 feature_array[i] = VK_TRUE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, unavailable_feature_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010307 device_create_info.pEnabledFeatures = &features;
10308 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
10309 m_errorMonitor->VerifyFound();
10310 break;
10311 }
10312 }
10313}
10314
Tobin Ehlis16edf082016-11-21 12:33:49 -070010315TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
10316 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
10317
10318 ASSERT_NO_FATAL_FAILURE(InitState());
10319
10320 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
10321 std::vector<VkDeviceQueueCreateInfo> queue_info;
10322 queue_info.reserve(queue_props.size());
10323 std::vector<std::vector<float>> queue_priorities;
10324 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
10325 VkDeviceQueueCreateInfo qi{};
10326 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
10327 qi.queueFamilyIndex = i;
10328 qi.queueCount = queue_props[i].queueCount;
10329 queue_priorities.emplace_back(qi.queueCount, 0.0f);
10330 qi.pQueuePriorities = queue_priorities[i].data();
10331 queue_info.push_back(qi);
10332 }
10333
10334 std::vector<const char *> device_extension_names;
10335
10336 VkDevice local_device;
10337 VkDeviceCreateInfo device_create_info = {};
10338 auto features = m_device->phy().features();
10339 // Intentionally disable pipeline stats
10340 features.pipelineStatisticsQuery = VK_FALSE;
10341 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
10342 device_create_info.pNext = NULL;
10343 device_create_info.queueCreateInfoCount = queue_info.size();
10344 device_create_info.pQueueCreateInfos = queue_info.data();
10345 device_create_info.enabledLayerCount = 0;
10346 device_create_info.ppEnabledLayerNames = NULL;
10347 device_create_info.pEnabledFeatures = &features;
10348 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
10349 ASSERT_VK_SUCCESS(err);
10350
10351 VkQueryPoolCreateInfo qpci{};
10352 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
10353 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
10354 qpci.queryCount = 1;
10355 VkQueryPool query_pool;
10356
10357 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
10358 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
10359 m_errorMonitor->VerifyFound();
10360
10361 vkDestroyDevice(local_device, nullptr);
10362}
10363
Mark Mueller2ee294f2016-08-04 12:59:48 -060010364TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
10365 TEST_DESCRIPTION("Use an invalid queue index in a vkCmdWaitEvents call."
10366 "End a command buffer with a query still in progress.");
10367
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010368 const char *invalid_queue_index = "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
10369 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
10370 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010371
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010372 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010373
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010375
10376 ASSERT_NO_FATAL_FAILURE(InitState());
10377
10378 VkEvent event;
10379 VkEventCreateInfo event_create_info{};
10380 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
10381 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
10382
Mark Mueller2ee294f2016-08-04 12:59:48 -060010383 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010384 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010385
10386 BeginCommandBuffer();
10387
10388 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010389 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 -060010390 ASSERT_TRUE(image.initialized());
10391 VkImageMemoryBarrier img_barrier = {};
10392 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10393 img_barrier.pNext = NULL;
10394 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10395 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10396 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10397 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10398 img_barrier.image = image.handle();
10399 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060010400
10401 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
10402 // that layer validation catches the case when it is not.
10403 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060010404 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10405 img_barrier.subresourceRange.baseArrayLayer = 0;
10406 img_barrier.subresourceRange.baseMipLevel = 0;
10407 img_barrier.subresourceRange.layerCount = 1;
10408 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010409 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
10410 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010411 m_errorMonitor->VerifyFound();
10412
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010413 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010414
10415 VkQueryPool query_pool;
10416 VkQueryPoolCreateInfo query_pool_create_info = {};
10417 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
10418 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
10419 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010420 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010421
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010422 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010423 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
10424
10425 vkEndCommandBuffer(m_commandBuffer->handle());
10426 m_errorMonitor->VerifyFound();
10427
10428 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
10429 vkDestroyEvent(m_device->device(), event, nullptr);
10430}
10431
Mark Muellerdfe37552016-07-07 14:47:42 -060010432TEST_F(VkLayerTest, VertexBufferInvalid) {
10433 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
10434 "delete a buffer twice, use an invalid offset for each "
10435 "buffer type, and attempt to bind a null buffer");
10436
10437 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
10438 "using deleted buffer ";
Mark Muellerdfe37552016-07-07 14:47:42 -060010439 const char *invalid_offset_message = "vkBindBufferMemory(): "
10440 "memoryOffset is 0x";
10441 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
10442 "storage memoryOffset "
10443 "is 0x";
10444 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
10445 "texel memoryOffset "
10446 "is 0x";
10447 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
10448 "uniform memoryOffset "
10449 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060010450
10451 ASSERT_NO_FATAL_FAILURE(InitState());
10452 ASSERT_NO_FATAL_FAILURE(InitViewport());
10453 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10454
10455 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010456 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060010457 pipe_ms_state_ci.pNext = NULL;
10458 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10459 pipe_ms_state_ci.sampleShadingEnable = 0;
10460 pipe_ms_state_ci.minSampleShading = 1.0;
10461 pipe_ms_state_ci.pSampleMask = nullptr;
10462
10463 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10464 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10465 VkPipelineLayout pipeline_layout;
10466
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010467 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060010468 ASSERT_VK_SUCCESS(err);
10469
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010470 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10471 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060010472 VkPipelineObj pipe(m_device);
10473 pipe.AddShader(&vs);
10474 pipe.AddShader(&fs);
10475 pipe.AddColorAttachment();
10476 pipe.SetMSAA(&pipe_ms_state_ci);
10477 pipe.SetViewport(m_viewports);
10478 pipe.SetScissor(m_scissors);
10479 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10480
10481 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010482 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060010483
10484 {
10485 // Create and bind a vertex buffer in a reduced scope, which will cause
10486 // it to be deleted upon leaving this scope
10487 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010488 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060010489 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
10490 draw_verticies.AddVertexInputToPipe(pipe);
10491 }
10492
10493 Draw(1, 0, 0, 0);
10494
10495 EndCommandBuffer();
10496
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060010498 QueueCommandBuffer(false);
10499 m_errorMonitor->VerifyFound();
10500
10501 {
10502 // Create and bind a vertex buffer in a reduced scope, and delete it
10503 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010504 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060010506 buffer_test.TestDoubleDestroy();
10507 }
10508 m_errorMonitor->VerifyFound();
10509
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010510 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010511 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
10513 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
10514 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010515 m_errorMonitor->VerifyFound();
10516 }
10517
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010518 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
10519 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010520 // Create and bind a memory buffer with an invalid offset again,
10521 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
10523 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10524 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010525 m_errorMonitor->VerifyFound();
10526 }
10527
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010528 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010529 // Create and bind a memory buffer with an invalid offset again, but
10530 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010531 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
10532 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10533 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010534 m_errorMonitor->VerifyFound();
10535 }
10536
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010537 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010538 // Create and bind a memory buffer with an invalid offset again, but
10539 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
10541 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10542 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010543 m_errorMonitor->VerifyFound();
10544 }
10545
10546 {
10547 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010549 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
10550 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010551 m_errorMonitor->VerifyFound();
10552 }
10553
10554 {
10555 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010557 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
10558 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010559 }
10560 m_errorMonitor->VerifyFound();
10561
10562 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10563}
10564
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010565// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
10566TEST_F(VkLayerTest, InvalidImageLayout) {
10567 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010568 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
10569 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010570 // 3 in ValidateCmdBufImageLayouts
10571 // * -1 Attempt to submit cmd buf w/ deleted image
10572 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
10573 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010574
10575 ASSERT_NO_FATAL_FAILURE(InitState());
10576 // Create src & dst images to use for copy operations
10577 VkImage src_image;
10578 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080010579 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010580
10581 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
10582 const int32_t tex_width = 32;
10583 const int32_t tex_height = 32;
10584
10585 VkImageCreateInfo image_create_info = {};
10586 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10587 image_create_info.pNext = NULL;
10588 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10589 image_create_info.format = tex_format;
10590 image_create_info.extent.width = tex_width;
10591 image_create_info.extent.height = tex_height;
10592 image_create_info.extent.depth = 1;
10593 image_create_info.mipLevels = 1;
10594 image_create_info.arrayLayers = 4;
10595 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10596 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10597 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080010598 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010599 image_create_info.flags = 0;
10600
10601 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
10602 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080010603 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010604 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
10605 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080010606 image_create_info.format = VK_FORMAT_D32_SFLOAT;
10607 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
10608 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
10609 ASSERT_VK_SUCCESS(err);
10610
10611 // Allocate memory
10612 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080010613 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080010614 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080010615 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10616 mem_alloc.pNext = NULL;
10617 mem_alloc.allocationSize = 0;
10618 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080010619
10620 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010621 mem_alloc.allocationSize = img_mem_reqs.size;
10622 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010623 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080010624 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080010625 ASSERT_VK_SUCCESS(err);
10626
10627 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010628 mem_alloc.allocationSize = img_mem_reqs.size;
10629 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010630 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080010631 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080010632 ASSERT_VK_SUCCESS(err);
10633
10634 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010635 mem_alloc.allocationSize = img_mem_reqs.size;
10636 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010637 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080010638 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080010639 ASSERT_VK_SUCCESS(err);
10640
10641 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
10642 ASSERT_VK_SUCCESS(err);
10643 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
10644 ASSERT_VK_SUCCESS(err);
10645 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
10646 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010647
10648 BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080010649 VkImageCopy copy_region;
10650 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10651 copy_region.srcSubresource.mipLevel = 0;
10652 copy_region.srcSubresource.baseArrayLayer = 0;
10653 copy_region.srcSubresource.layerCount = 1;
10654 copy_region.srcOffset.x = 0;
10655 copy_region.srcOffset.y = 0;
10656 copy_region.srcOffset.z = 0;
10657 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10658 copy_region.dstSubresource.mipLevel = 0;
10659 copy_region.dstSubresource.baseArrayLayer = 0;
10660 copy_region.dstSubresource.layerCount = 1;
10661 copy_region.dstOffset.x = 0;
10662 copy_region.dstOffset.y = 0;
10663 copy_region.dstOffset.z = 0;
10664 copy_region.extent.width = 1;
10665 copy_region.extent.height = 1;
10666 copy_region.extent.depth = 1;
10667
10668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10669 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
10670 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 -060010671 m_errorMonitor->VerifyFound();
10672 // Now cause error due to src image layout changing
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot copy from an image whose source layout is "
10674 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
10675 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010676 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 -060010677 m_errorMonitor->VerifyFound();
10678 // Final src error is due to bad layout type
10679 m_errorMonitor->SetDesiredFailureMsg(
10680 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10681 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010682 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 -060010683 m_errorMonitor->VerifyFound();
10684 // Now verify same checks for dst
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010685 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10686 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010687 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 -060010688 m_errorMonitor->VerifyFound();
10689 // Now cause error due to src image layout changing
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot copy from an image whose dest layout is "
10691 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
10692 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010693 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 -060010694 m_errorMonitor->VerifyFound();
10695 m_errorMonitor->SetDesiredFailureMsg(
10696 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10697 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010698 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 -060010699 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010700
Cort3b021012016-12-07 12:00:57 -080010701 // Convert dst and depth images to TRANSFER_DST for subsequent tests
10702 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
10703 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10704 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10705 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10706 transfer_dst_image_barrier[0].srcAccessMask = 0;
10707 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
10708 transfer_dst_image_barrier[0].image = dst_image;
10709 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
10710 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
10711 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10712 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10713 NULL, 0, NULL, 1, transfer_dst_image_barrier);
10714 transfer_dst_image_barrier[0].image = depth_image;
10715 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
10716 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10717 NULL, 0, NULL, 1, transfer_dst_image_barrier);
10718
10719 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080010720 VkClearColorValue color_clear_value = {};
10721 VkImageSubresourceRange clear_range;
10722 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10723 clear_range.baseMipLevel = 0;
10724 clear_range.baseArrayLayer = 0;
10725 clear_range.layerCount = 1;
10726 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010727
Cort3b021012016-12-07 12:00:57 -080010728 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
10729 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
10730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
10731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080010732 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010733 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080010734 // Fail due to provided layout not matching actual current layout for color clear.
10735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080010736 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010737 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080010738
Cort530cf382016-12-08 09:59:47 -080010739 VkClearDepthStencilValue depth_clear_value = {};
10740 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080010741
10742 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
10743 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
10744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
10745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080010746 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080010747 m_errorMonitor->VerifyFound();
10748 // Fail due to provided layout not matching actual current layout for depth clear.
10749 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080010750 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080010751 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010752
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010753 // Now cause error due to bad image layout transition in PipelineBarrier
10754 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080010755 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010756 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080010757 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010758 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080010759 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
10760 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010761 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You cannot transition the layout from "
10763 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when "
10764 "current layout is VK_IMAGE_LAYOUT_GENERAL.");
10765 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10766 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010767 m_errorMonitor->VerifyFound();
10768
10769 // Finally some layout errors at RenderPass create time
10770 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
10771 VkAttachmentReference attach = {};
10772 // perf warning for GENERAL layout w/ non-DS input attachment
10773 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10774 VkSubpassDescription subpass = {};
10775 subpass.inputAttachmentCount = 1;
10776 subpass.pInputAttachments = &attach;
10777 VkRenderPassCreateInfo rpci = {};
10778 rpci.subpassCount = 1;
10779 rpci.pSubpasses = &subpass;
10780 rpci.attachmentCount = 1;
10781 VkAttachmentDescription attach_desc = {};
10782 attach_desc.format = VK_FORMAT_UNDEFINED;
10783 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060010784 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010785 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10787 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010788 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10789 m_errorMonitor->VerifyFound();
10790 // error w/ non-general layout
10791 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10792
10793 m_errorMonitor->SetDesiredFailureMsg(
10794 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10795 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
10796 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10797 m_errorMonitor->VerifyFound();
10798 subpass.inputAttachmentCount = 0;
10799 subpass.colorAttachmentCount = 1;
10800 subpass.pColorAttachments = &attach;
10801 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10802 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10804 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010805 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10806 m_errorMonitor->VerifyFound();
10807 // error w/ non-color opt or GENERAL layout for color attachment
10808 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10809 m_errorMonitor->SetDesiredFailureMsg(
10810 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10811 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
10812 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10813 m_errorMonitor->VerifyFound();
10814 subpass.colorAttachmentCount = 0;
10815 subpass.pDepthStencilAttachment = &attach;
10816 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10817 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010818 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10819 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010820 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10821 m_errorMonitor->VerifyFound();
10822 // error w/ non-ds opt or GENERAL layout for color attachment
10823 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10825 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
10826 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010827 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10828 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060010829 // For this error we need a valid renderpass so create default one
10830 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
10831 attach.attachment = 0;
10832 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
10833 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
10834 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
10835 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
10836 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
10837 // Can't do a CLEAR load on READ_ONLY initialLayout
10838 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
10839 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
10840 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " with invalid first layout "
10842 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
10843 "ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060010844 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10845 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010846
Cort3b021012016-12-07 12:00:57 -080010847 vkFreeMemory(m_device->device(), src_image_mem, NULL);
10848 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
10849 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010850 vkDestroyImage(m_device->device(), src_image, NULL);
10851 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080010852 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010853}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060010854
Tobin Ehlise0936662016-10-11 08:10:51 -060010855TEST_F(VkLayerTest, InvalidStorageImageLayout) {
10856 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
10857 VkResult err;
10858
10859 ASSERT_NO_FATAL_FAILURE(InitState());
10860
10861 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
10862 VkImageTiling tiling;
10863 VkFormatProperties format_properties;
10864 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
10865 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
10866 tiling = VK_IMAGE_TILING_LINEAR;
10867 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
10868 tiling = VK_IMAGE_TILING_OPTIMAL;
10869 } else {
10870 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
10871 "skipped.\n");
10872 return;
10873 }
10874
10875 VkDescriptorPoolSize ds_type = {};
10876 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
10877 ds_type.descriptorCount = 1;
10878
10879 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10880 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10881 ds_pool_ci.maxSets = 1;
10882 ds_pool_ci.poolSizeCount = 1;
10883 ds_pool_ci.pPoolSizes = &ds_type;
10884 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
10885
10886 VkDescriptorPool ds_pool;
10887 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10888 ASSERT_VK_SUCCESS(err);
10889
10890 VkDescriptorSetLayoutBinding dsl_binding = {};
10891 dsl_binding.binding = 0;
10892 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
10893 dsl_binding.descriptorCount = 1;
10894 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
10895 dsl_binding.pImmutableSamplers = NULL;
10896
10897 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10898 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10899 ds_layout_ci.pNext = NULL;
10900 ds_layout_ci.bindingCount = 1;
10901 ds_layout_ci.pBindings = &dsl_binding;
10902
10903 VkDescriptorSetLayout ds_layout;
10904 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10905 ASSERT_VK_SUCCESS(err);
10906
10907 VkDescriptorSetAllocateInfo alloc_info = {};
10908 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10909 alloc_info.descriptorSetCount = 1;
10910 alloc_info.descriptorPool = ds_pool;
10911 alloc_info.pSetLayouts = &ds_layout;
10912 VkDescriptorSet descriptor_set;
10913 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10914 ASSERT_VK_SUCCESS(err);
10915
10916 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10917 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10918 pipeline_layout_ci.pNext = NULL;
10919 pipeline_layout_ci.setLayoutCount = 1;
10920 pipeline_layout_ci.pSetLayouts = &ds_layout;
10921 VkPipelineLayout pipeline_layout;
10922 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
10923 ASSERT_VK_SUCCESS(err);
10924
10925 VkImageObj image(m_device);
10926 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
10927 ASSERT_TRUE(image.initialized());
10928 VkImageView view = image.targetView(tex_format);
10929
10930 VkDescriptorImageInfo image_info = {};
10931 image_info.imageView = view;
10932 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
10933
10934 VkWriteDescriptorSet descriptor_write = {};
10935 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10936 descriptor_write.dstSet = descriptor_set;
10937 descriptor_write.dstBinding = 0;
10938 descriptor_write.descriptorCount = 1;
10939 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
10940 descriptor_write.pImageInfo = &image_info;
10941
10942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10943 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
10944 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
10945 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10946 m_errorMonitor->VerifyFound();
10947
10948 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10949 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10950 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10951 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10952}
10953
Mark Mueller93b938f2016-08-18 10:27:40 -060010954TEST_F(VkLayerTest, SimultaneousUse) {
10955 TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
10956 "in primary and secondary command buffers.");
10957
10958 ASSERT_NO_FATAL_FAILURE(InitState());
10959 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10960
Mike Weiblen95dd0f92016-10-19 12:28:27 -060010961 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010962 const char *simultaneous_use_message2 = "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
10963 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060010964
10965 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010966 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060010967 command_buffer_allocate_info.commandPool = m_commandPool;
10968 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
10969 command_buffer_allocate_info.commandBufferCount = 1;
10970
10971 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010972 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060010973 VkCommandBufferBeginInfo command_buffer_begin_info = {};
10974 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010975 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060010976 command_buffer_inheritance_info.renderPass = m_renderPass;
10977 command_buffer_inheritance_info.framebuffer = m_framebuffer;
10978 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010979 command_buffer_begin_info.flags =
10980 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060010981 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
10982
10983 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010984 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
10985 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller4042b652016-09-05 22:52:21 -060010986 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
Mark Mueller93b938f2016-08-18 10:27:40 -060010987 vkEndCommandBuffer(secondary_command_buffer);
10988
Mark Mueller93b938f2016-08-18 10:27:40 -060010989 VkSubmitInfo submit_info = {};
10990 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
10991 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010992 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller4042b652016-09-05 22:52:21 -060010993 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Mueller93b938f2016-08-18 10:27:40 -060010994
Mark Mueller4042b652016-09-05 22:52:21 -060010995 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010996 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
10997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
10998 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060010999 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011000 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11001 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060011002
11003 m_errorMonitor->SetDesiredFailureMsg(0, "");
Mark Mueller93b938f2016-08-18 10:27:40 -060011004 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11005
Mark Mueller4042b652016-09-05 22:52:21 -060011006 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011007 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011008 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060011009
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
11011 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011012 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011013 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11014 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060011015}
11016
Mark Mueller917f6bc2016-08-30 10:57:19 -060011017TEST_F(VkLayerTest, InUseDestroyedSignaled) {
11018 TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
11019 "in primary and secondary command buffers. "
Mark Muellerc8d441e2016-08-23 17:36:00 -060011020 "Delete objects that are inuse. Call VkQueueSubmit "
11021 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060011022
11023 ASSERT_NO_FATAL_FAILURE(InitState());
11024 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11025
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011026 const char *submit_with_deleted_event_message = "Cannot submit cmd buffer using deleted event 0x";
11027 const char *cannot_delete_event_message = "Cannot delete event 0x";
11028 const char *cannot_delete_semaphore_message = "Cannot delete semaphore 0x";
11029 const char *cannot_destroy_fence_message = "Fence 0x";
Mark Mueller917f6bc2016-08-30 10:57:19 -060011030
11031 BeginCommandBuffer();
11032
11033 VkEvent event;
11034 VkEventCreateInfo event_create_info = {};
11035 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11036 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011037 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011038
Mark Muellerc8d441e2016-08-23 17:36:00 -060011039 EndCommandBuffer();
11040 vkDestroyEvent(m_device->device(), event, nullptr);
11041
11042 VkSubmitInfo submit_info = {};
11043 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11044 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011045 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, submit_with_deleted_event_message);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011047 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11048 m_errorMonitor->VerifyFound();
11049
11050 m_errorMonitor->SetDesiredFailureMsg(0, "");
11051 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
11052
11053 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11054
Mark Mueller917f6bc2016-08-30 10:57:19 -060011055 VkSemaphoreCreateInfo semaphore_create_info = {};
11056 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
11057 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011058 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011059 VkFenceCreateInfo fence_create_info = {};
11060 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
11061 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011062 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011063
11064 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011065 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011066 descriptor_pool_type_count.descriptorCount = 1;
11067
11068 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
11069 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11070 descriptor_pool_create_info.maxSets = 1;
11071 descriptor_pool_create_info.poolSizeCount = 1;
11072 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011073 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011074
11075 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011076 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011077
11078 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011079 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011080 descriptorset_layout_binding.descriptorCount = 1;
11081 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
11082
11083 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011084 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011085 descriptorset_layout_create_info.bindingCount = 1;
11086 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
11087
11088 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011089 ASSERT_VK_SUCCESS(
11090 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011091
11092 VkDescriptorSet descriptorset;
11093 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011094 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011095 descriptorset_allocate_info.descriptorSetCount = 1;
11096 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
11097 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011098 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011099
Mark Mueller4042b652016-09-05 22:52:21 -060011100 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
11101
11102 VkDescriptorBufferInfo buffer_info = {};
11103 buffer_info.buffer = buffer_test.GetBuffer();
11104 buffer_info.offset = 0;
11105 buffer_info.range = 1024;
11106
11107 VkWriteDescriptorSet write_descriptor_set = {};
11108 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11109 write_descriptor_set.dstSet = descriptorset;
11110 write_descriptor_set.descriptorCount = 1;
11111 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11112 write_descriptor_set.pBufferInfo = &buffer_info;
11113
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011114 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060011115
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011116 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11117 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011118
11119 VkPipelineObj pipe(m_device);
11120 pipe.AddColorAttachment();
11121 pipe.AddShader(&vs);
11122 pipe.AddShader(&fs);
11123
11124 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011125 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011126 pipeline_layout_create_info.setLayoutCount = 1;
11127 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
11128
11129 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011130 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011131
11132 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
11133
Mark Muellerc8d441e2016-08-23 17:36:00 -060011134 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011135 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011136
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011137 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11138 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11139 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011140
Mark Muellerc8d441e2016-08-23 17:36:00 -060011141 EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060011142
Mark Mueller917f6bc2016-08-30 10:57:19 -060011143 submit_info.signalSemaphoreCount = 1;
11144 submit_info.pSignalSemaphores = &semaphore;
11145 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011146
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_delete_event_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011148 vkDestroyEvent(m_device->device(), event, nullptr);
11149 m_errorMonitor->VerifyFound();
11150
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_delete_semaphore_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011152 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11153 m_errorMonitor->VerifyFound();
11154
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_destroy_fence_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011156 vkDestroyFence(m_device->device(), fence, nullptr);
11157 m_errorMonitor->VerifyFound();
11158
Tobin Ehlis122207b2016-09-01 08:50:06 -070011159 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011160 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11161 vkDestroyFence(m_device->device(), fence, nullptr);
11162 vkDestroyEvent(m_device->device(), event, nullptr);
11163 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011164 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011165 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
11166}
11167
Tobin Ehlis2adda372016-09-01 08:51:06 -070011168TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
11169 TEST_DESCRIPTION("Delete in-use query pool.");
11170
11171 ASSERT_NO_FATAL_FAILURE(InitState());
11172 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11173
11174 VkQueryPool query_pool;
11175 VkQueryPoolCreateInfo query_pool_ci{};
11176 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11177 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
11178 query_pool_ci.queryCount = 1;
11179 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
11180 BeginCommandBuffer();
11181 // Reset query pool to create binding with cmd buffer
11182 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
11183
11184 EndCommandBuffer();
11185
11186 VkSubmitInfo submit_info = {};
11187 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11188 submit_info.commandBufferCount = 1;
11189 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11190 // Submit cmd buffer and then destroy query pool while in-flight
11191 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11192
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete query pool 0x");
Tobin Ehlis2adda372016-09-01 08:51:06 -070011194 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
11195 m_errorMonitor->VerifyFound();
11196
11197 vkQueueWaitIdle(m_device->m_queue);
11198 // Now that cmd buffer done we can safely destroy query_pool
11199 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
11200}
11201
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011202TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
11203 TEST_DESCRIPTION("Delete in-use pipeline.");
11204
11205 ASSERT_NO_FATAL_FAILURE(InitState());
11206 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11207
11208 // Empty pipeline layout used for binding PSO
11209 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11210 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11211 pipeline_layout_ci.setLayoutCount = 0;
11212 pipeline_layout_ci.pSetLayouts = NULL;
11213
11214 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011215 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011216 ASSERT_VK_SUCCESS(err);
11217
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete pipeline 0x");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011219 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011220 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11221 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011222 // Store pipeline handle so we can actually delete it before test finishes
11223 VkPipeline delete_this_pipeline;
11224 { // Scope pipeline so it will be auto-deleted
11225 VkPipelineObj pipe(m_device);
11226 pipe.AddShader(&vs);
11227 pipe.AddShader(&fs);
11228 pipe.AddColorAttachment();
11229 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11230 delete_this_pipeline = pipe.handle();
11231
11232 BeginCommandBuffer();
11233 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011234 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011235
11236 EndCommandBuffer();
11237
11238 VkSubmitInfo submit_info = {};
11239 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11240 submit_info.commandBufferCount = 1;
11241 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11242 // Submit cmd buffer and then pipeline destroyed while in-flight
11243 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11244 } // Pipeline deletion triggered here
11245 m_errorMonitor->VerifyFound();
11246 // Make sure queue finished and then actually delete pipeline
11247 vkQueueWaitIdle(m_device->m_queue);
11248 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
11249 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
11250}
11251
Tobin Ehlis7d965da2016-09-19 16:15:45 -060011252TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
11253 TEST_DESCRIPTION("Delete in-use imageView.");
11254
11255 ASSERT_NO_FATAL_FAILURE(InitState());
11256 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11257
11258 VkDescriptorPoolSize ds_type_count;
11259 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11260 ds_type_count.descriptorCount = 1;
11261
11262 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11263 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11264 ds_pool_ci.maxSets = 1;
11265 ds_pool_ci.poolSizeCount = 1;
11266 ds_pool_ci.pPoolSizes = &ds_type_count;
11267
11268 VkDescriptorPool ds_pool;
11269 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11270 ASSERT_VK_SUCCESS(err);
11271
11272 VkSamplerCreateInfo sampler_ci = {};
11273 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11274 sampler_ci.pNext = NULL;
11275 sampler_ci.magFilter = VK_FILTER_NEAREST;
11276 sampler_ci.minFilter = VK_FILTER_NEAREST;
11277 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11278 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11279 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11280 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11281 sampler_ci.mipLodBias = 1.0;
11282 sampler_ci.anisotropyEnable = VK_FALSE;
11283 sampler_ci.maxAnisotropy = 1;
11284 sampler_ci.compareEnable = VK_FALSE;
11285 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11286 sampler_ci.minLod = 1.0;
11287 sampler_ci.maxLod = 1.0;
11288 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11289 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11290 VkSampler sampler;
11291
11292 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11293 ASSERT_VK_SUCCESS(err);
11294
11295 VkDescriptorSetLayoutBinding layout_binding;
11296 layout_binding.binding = 0;
11297 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11298 layout_binding.descriptorCount = 1;
11299 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11300 layout_binding.pImmutableSamplers = NULL;
11301
11302 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11303 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11304 ds_layout_ci.bindingCount = 1;
11305 ds_layout_ci.pBindings = &layout_binding;
11306 VkDescriptorSetLayout ds_layout;
11307 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11308 ASSERT_VK_SUCCESS(err);
11309
11310 VkDescriptorSetAllocateInfo alloc_info = {};
11311 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11312 alloc_info.descriptorSetCount = 1;
11313 alloc_info.descriptorPool = ds_pool;
11314 alloc_info.pSetLayouts = &ds_layout;
11315 VkDescriptorSet descriptor_set;
11316 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11317 ASSERT_VK_SUCCESS(err);
11318
11319 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11320 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11321 pipeline_layout_ci.pNext = NULL;
11322 pipeline_layout_ci.setLayoutCount = 1;
11323 pipeline_layout_ci.pSetLayouts = &ds_layout;
11324
11325 VkPipelineLayout pipeline_layout;
11326 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11327 ASSERT_VK_SUCCESS(err);
11328
11329 VkImageObj image(m_device);
11330 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
11331 ASSERT_TRUE(image.initialized());
11332
11333 VkImageView view;
11334 VkImageViewCreateInfo ivci = {};
11335 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
11336 ivci.image = image.handle();
11337 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
11338 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
11339 ivci.subresourceRange.layerCount = 1;
11340 ivci.subresourceRange.baseMipLevel = 0;
11341 ivci.subresourceRange.levelCount = 1;
11342 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11343
11344 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
11345 ASSERT_VK_SUCCESS(err);
11346
11347 VkDescriptorImageInfo image_info{};
11348 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11349 image_info.imageView = view;
11350 image_info.sampler = sampler;
11351
11352 VkWriteDescriptorSet descriptor_write = {};
11353 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11354 descriptor_write.dstSet = descriptor_set;
11355 descriptor_write.dstBinding = 0;
11356 descriptor_write.descriptorCount = 1;
11357 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11358 descriptor_write.pImageInfo = &image_info;
11359
11360 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11361
11362 // Create PSO to use the sampler
11363 char const *vsSource = "#version 450\n"
11364 "\n"
11365 "out gl_PerVertex { \n"
11366 " vec4 gl_Position;\n"
11367 "};\n"
11368 "void main(){\n"
11369 " gl_Position = vec4(1);\n"
11370 "}\n";
11371 char const *fsSource = "#version 450\n"
11372 "\n"
11373 "layout(set=0, binding=0) uniform sampler2D s;\n"
11374 "layout(location=0) out vec4 x;\n"
11375 "void main(){\n"
11376 " x = texture(s, vec2(1));\n"
11377 "}\n";
11378 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11379 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11380 VkPipelineObj pipe(m_device);
11381 pipe.AddShader(&vs);
11382 pipe.AddShader(&fs);
11383 pipe.AddColorAttachment();
11384 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11385
11386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete image view 0x");
11387
11388 BeginCommandBuffer();
11389 // Bind pipeline to cmd buffer
11390 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11391 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11392 &descriptor_set, 0, nullptr);
11393 Draw(1, 0, 0, 0);
11394 EndCommandBuffer();
11395 // Submit cmd buffer then destroy sampler
11396 VkSubmitInfo submit_info = {};
11397 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11398 submit_info.commandBufferCount = 1;
11399 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11400 // Submit cmd buffer and then destroy imageView while in-flight
11401 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11402
11403 vkDestroyImageView(m_device->device(), view, nullptr);
11404 m_errorMonitor->VerifyFound();
11405 vkQueueWaitIdle(m_device->m_queue);
11406 // Now we can actually destroy imageView
11407 vkDestroyImageView(m_device->device(), view, NULL);
11408 vkDestroySampler(m_device->device(), sampler, nullptr);
11409 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11410 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11411 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11412}
11413
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060011414TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
11415 TEST_DESCRIPTION("Delete in-use bufferView.");
11416
11417 ASSERT_NO_FATAL_FAILURE(InitState());
11418 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11419
11420 VkDescriptorPoolSize ds_type_count;
11421 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11422 ds_type_count.descriptorCount = 1;
11423
11424 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11425 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11426 ds_pool_ci.maxSets = 1;
11427 ds_pool_ci.poolSizeCount = 1;
11428 ds_pool_ci.pPoolSizes = &ds_type_count;
11429
11430 VkDescriptorPool ds_pool;
11431 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11432 ASSERT_VK_SUCCESS(err);
11433
11434 VkDescriptorSetLayoutBinding layout_binding;
11435 layout_binding.binding = 0;
11436 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11437 layout_binding.descriptorCount = 1;
11438 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11439 layout_binding.pImmutableSamplers = NULL;
11440
11441 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11442 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11443 ds_layout_ci.bindingCount = 1;
11444 ds_layout_ci.pBindings = &layout_binding;
11445 VkDescriptorSetLayout ds_layout;
11446 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11447 ASSERT_VK_SUCCESS(err);
11448
11449 VkDescriptorSetAllocateInfo alloc_info = {};
11450 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11451 alloc_info.descriptorSetCount = 1;
11452 alloc_info.descriptorPool = ds_pool;
11453 alloc_info.pSetLayouts = &ds_layout;
11454 VkDescriptorSet descriptor_set;
11455 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11456 ASSERT_VK_SUCCESS(err);
11457
11458 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11459 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11460 pipeline_layout_ci.pNext = NULL;
11461 pipeline_layout_ci.setLayoutCount = 1;
11462 pipeline_layout_ci.pSetLayouts = &ds_layout;
11463
11464 VkPipelineLayout pipeline_layout;
11465 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11466 ASSERT_VK_SUCCESS(err);
11467
11468 VkBuffer buffer;
11469 uint32_t queue_family_index = 0;
11470 VkBufferCreateInfo buffer_create_info = {};
11471 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
11472 buffer_create_info.size = 1024;
11473 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
11474 buffer_create_info.queueFamilyIndexCount = 1;
11475 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
11476
11477 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
11478 ASSERT_VK_SUCCESS(err);
11479
11480 VkMemoryRequirements memory_reqs;
11481 VkDeviceMemory buffer_memory;
11482
11483 VkMemoryAllocateInfo memory_info = {};
11484 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11485 memory_info.allocationSize = 0;
11486 memory_info.memoryTypeIndex = 0;
11487
11488 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
11489 memory_info.allocationSize = memory_reqs.size;
11490 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
11491 ASSERT_TRUE(pass);
11492
11493 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
11494 ASSERT_VK_SUCCESS(err);
11495 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
11496 ASSERT_VK_SUCCESS(err);
11497
11498 VkBufferView view;
11499 VkBufferViewCreateInfo bvci = {};
11500 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
11501 bvci.buffer = buffer;
11502 bvci.format = VK_FORMAT_R8_UNORM;
11503 bvci.range = VK_WHOLE_SIZE;
11504
11505 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
11506 ASSERT_VK_SUCCESS(err);
11507
11508 VkWriteDescriptorSet descriptor_write = {};
11509 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11510 descriptor_write.dstSet = descriptor_set;
11511 descriptor_write.dstBinding = 0;
11512 descriptor_write.descriptorCount = 1;
11513 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11514 descriptor_write.pTexelBufferView = &view;
11515
11516 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11517
11518 char const *vsSource = "#version 450\n"
11519 "\n"
11520 "out gl_PerVertex { \n"
11521 " vec4 gl_Position;\n"
11522 "};\n"
11523 "void main(){\n"
11524 " gl_Position = vec4(1);\n"
11525 "}\n";
11526 char const *fsSource = "#version 450\n"
11527 "\n"
11528 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
11529 "layout(location=0) out vec4 x;\n"
11530 "void main(){\n"
11531 " x = imageLoad(s, 0);\n"
11532 "}\n";
11533 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11534 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11535 VkPipelineObj pipe(m_device);
11536 pipe.AddShader(&vs);
11537 pipe.AddShader(&fs);
11538 pipe.AddColorAttachment();
11539 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11540
11541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete buffer view 0x");
11542
11543 BeginCommandBuffer();
11544 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11545 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11546 VkRect2D scissor = {{0, 0}, {16, 16}};
11547 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11548 // Bind pipeline to cmd buffer
11549 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11550 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11551 &descriptor_set, 0, nullptr);
11552 Draw(1, 0, 0, 0);
11553 EndCommandBuffer();
11554
11555 VkSubmitInfo submit_info = {};
11556 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11557 submit_info.commandBufferCount = 1;
11558 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11559 // Submit cmd buffer and then destroy bufferView while in-flight
11560 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11561
11562 vkDestroyBufferView(m_device->device(), view, nullptr);
11563 m_errorMonitor->VerifyFound();
11564 vkQueueWaitIdle(m_device->m_queue);
11565 // Now we can actually destroy bufferView
11566 vkDestroyBufferView(m_device->device(), view, NULL);
11567 vkDestroyBuffer(m_device->device(), buffer, NULL);
11568 vkFreeMemory(m_device->device(), buffer_memory, NULL);
11569 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11570 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11571 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11572}
11573
Tobin Ehlis209532e2016-09-07 13:52:18 -060011574TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
11575 TEST_DESCRIPTION("Delete in-use sampler.");
11576
11577 ASSERT_NO_FATAL_FAILURE(InitState());
11578 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11579
11580 VkDescriptorPoolSize ds_type_count;
11581 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11582 ds_type_count.descriptorCount = 1;
11583
11584 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11585 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11586 ds_pool_ci.maxSets = 1;
11587 ds_pool_ci.poolSizeCount = 1;
11588 ds_pool_ci.pPoolSizes = &ds_type_count;
11589
11590 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011591 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011592 ASSERT_VK_SUCCESS(err);
11593
11594 VkSamplerCreateInfo sampler_ci = {};
11595 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11596 sampler_ci.pNext = NULL;
11597 sampler_ci.magFilter = VK_FILTER_NEAREST;
11598 sampler_ci.minFilter = VK_FILTER_NEAREST;
11599 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11600 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11601 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11602 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11603 sampler_ci.mipLodBias = 1.0;
11604 sampler_ci.anisotropyEnable = VK_FALSE;
11605 sampler_ci.maxAnisotropy = 1;
11606 sampler_ci.compareEnable = VK_FALSE;
11607 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11608 sampler_ci.minLod = 1.0;
11609 sampler_ci.maxLod = 1.0;
11610 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11611 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11612 VkSampler sampler;
11613
11614 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11615 ASSERT_VK_SUCCESS(err);
11616
11617 VkDescriptorSetLayoutBinding layout_binding;
11618 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060011619 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060011620 layout_binding.descriptorCount = 1;
11621 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11622 layout_binding.pImmutableSamplers = NULL;
11623
11624 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11625 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11626 ds_layout_ci.bindingCount = 1;
11627 ds_layout_ci.pBindings = &layout_binding;
11628 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011629 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011630 ASSERT_VK_SUCCESS(err);
11631
11632 VkDescriptorSetAllocateInfo alloc_info = {};
11633 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11634 alloc_info.descriptorSetCount = 1;
11635 alloc_info.descriptorPool = ds_pool;
11636 alloc_info.pSetLayouts = &ds_layout;
11637 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011638 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011639 ASSERT_VK_SUCCESS(err);
11640
11641 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11642 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11643 pipeline_layout_ci.pNext = NULL;
11644 pipeline_layout_ci.setLayoutCount = 1;
11645 pipeline_layout_ci.pSetLayouts = &ds_layout;
11646
11647 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011648 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011649 ASSERT_VK_SUCCESS(err);
11650
11651 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011652 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 -060011653 ASSERT_TRUE(image.initialized());
11654
11655 VkImageView view;
11656 VkImageViewCreateInfo ivci = {};
11657 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
11658 ivci.image = image.handle();
11659 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
11660 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
11661 ivci.subresourceRange.layerCount = 1;
11662 ivci.subresourceRange.baseMipLevel = 0;
11663 ivci.subresourceRange.levelCount = 1;
11664 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11665
11666 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
11667 ASSERT_VK_SUCCESS(err);
11668
11669 VkDescriptorImageInfo image_info{};
11670 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11671 image_info.imageView = view;
11672 image_info.sampler = sampler;
11673
11674 VkWriteDescriptorSet descriptor_write = {};
11675 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11676 descriptor_write.dstSet = descriptor_set;
11677 descriptor_write.dstBinding = 0;
11678 descriptor_write.descriptorCount = 1;
11679 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11680 descriptor_write.pImageInfo = &image_info;
11681
11682 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11683
11684 // Create PSO to use the sampler
11685 char const *vsSource = "#version 450\n"
11686 "\n"
11687 "out gl_PerVertex { \n"
11688 " vec4 gl_Position;\n"
11689 "};\n"
11690 "void main(){\n"
11691 " gl_Position = vec4(1);\n"
11692 "}\n";
11693 char const *fsSource = "#version 450\n"
11694 "\n"
11695 "layout(set=0, binding=0) uniform sampler2D s;\n"
11696 "layout(location=0) out vec4 x;\n"
11697 "void main(){\n"
11698 " x = texture(s, vec2(1));\n"
11699 "}\n";
11700 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11701 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11702 VkPipelineObj pipe(m_device);
11703 pipe.AddShader(&vs);
11704 pipe.AddShader(&fs);
11705 pipe.AddColorAttachment();
11706 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11707
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete sampler 0x");
Tobin Ehlis209532e2016-09-07 13:52:18 -060011709
11710 BeginCommandBuffer();
11711 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011712 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11713 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11714 &descriptor_set, 0, nullptr);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011715 Draw(1, 0, 0, 0);
11716 EndCommandBuffer();
11717 // Submit cmd buffer then destroy sampler
11718 VkSubmitInfo submit_info = {};
11719 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11720 submit_info.commandBufferCount = 1;
11721 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11722 // Submit cmd buffer and then destroy sampler while in-flight
11723 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11724
11725 vkDestroySampler(m_device->device(), sampler, nullptr);
11726 m_errorMonitor->VerifyFound();
11727 vkQueueWaitIdle(m_device->m_queue);
11728 // Now we can actually destroy sampler
11729 vkDestroySampler(m_device->device(), sampler, nullptr);
11730 vkDestroyImageView(m_device->device(), view, NULL);
11731 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11732 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11733 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11734}
11735
Mark Mueller1cd9f412016-08-25 13:23:52 -060011736TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Mueller96a56d52016-08-24 10:28:05 -060011737 TEST_DESCRIPTION("Call VkQueueSubmit with a semaphore that is already "
Mark Mueller1cd9f412016-08-25 13:23:52 -060011738 "signaled but not waited on by the queue. Wait on a "
11739 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060011740
11741 ASSERT_NO_FATAL_FAILURE(InitState());
11742 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11743
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011744 const char *queue_forward_progress_message = " that has already been signaled but not waited on by queue 0x";
11745 const char *invalid_fence_wait_message = " which has not been submitted on a Queue or during "
11746 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060011747
11748 BeginCommandBuffer();
11749 EndCommandBuffer();
11750
11751 VkSemaphoreCreateInfo semaphore_create_info = {};
11752 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
11753 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011754 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060011755 VkSubmitInfo submit_info = {};
11756 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11757 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011758 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060011759 submit_info.signalSemaphoreCount = 1;
11760 submit_info.pSignalSemaphores = &semaphore;
11761 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11762 m_errorMonitor->SetDesiredFailureMsg(0, "");
11763 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
11764 BeginCommandBuffer();
11765 EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060011767 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11768 m_errorMonitor->VerifyFound();
11769
Mark Mueller1cd9f412016-08-25 13:23:52 -060011770 VkFenceCreateInfo fence_create_info = {};
11771 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
11772 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011773 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060011774
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011775 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060011776 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
11777 m_errorMonitor->VerifyFound();
11778
Mark Mueller4042b652016-09-05 22:52:21 -060011779 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060011780 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060011781 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11782}
11783
Tobin Ehlis4af23302016-07-19 10:50:30 -060011784TEST_F(VkLayerTest, FramebufferIncompatible) {
11785 TEST_DESCRIPTION("Bind a secondary command buffer with with a framebuffer "
11786 "that does not match the framebuffer for the active "
11787 "renderpass.");
11788 ASSERT_NO_FATAL_FAILURE(InitState());
11789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11790
11791 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011792 VkAttachmentDescription attachment = {0,
11793 VK_FORMAT_B8G8R8A8_UNORM,
11794 VK_SAMPLE_COUNT_1_BIT,
11795 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
11796 VK_ATTACHMENT_STORE_OP_STORE,
11797 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
11798 VK_ATTACHMENT_STORE_OP_DONT_CARE,
11799 VK_IMAGE_LAYOUT_UNDEFINED,
11800 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011801
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011802 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011803
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011804 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011805
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011806 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011807
11808 VkRenderPass rp;
11809 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
11810 ASSERT_VK_SUCCESS(err);
11811
11812 // A compatible framebuffer.
11813 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011814 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 -060011815 ASSERT_TRUE(image.initialized());
11816
11817 VkImageViewCreateInfo ivci = {
11818 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
11819 nullptr,
11820 0,
11821 image.handle(),
11822 VK_IMAGE_VIEW_TYPE_2D,
11823 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011824 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
11825 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060011826 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
11827 };
11828 VkImageView view;
11829 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
11830 ASSERT_VK_SUCCESS(err);
11831
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011832 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011833 VkFramebuffer fb;
11834 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
11835 ASSERT_VK_SUCCESS(err);
11836
11837 VkCommandBufferAllocateInfo cbai = {};
11838 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
11839 cbai.commandPool = m_commandPool;
11840 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
11841 cbai.commandBufferCount = 1;
11842
11843 VkCommandBuffer sec_cb;
11844 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
11845 ASSERT_VK_SUCCESS(err);
11846 VkCommandBufferBeginInfo cbbi = {};
11847 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130011848 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060011849 cbii.renderPass = renderPass();
11850 cbii.framebuffer = fb;
11851 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11852 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011853 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 -060011854 cbbi.pInheritanceInfo = &cbii;
11855 vkBeginCommandBuffer(sec_cb, &cbbi);
11856 vkEndCommandBuffer(sec_cb);
11857
Chris Forbes3400bc52016-09-13 18:10:34 +120011858 VkCommandBufferBeginInfo cbbi2 = {
11859 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
11860 0, nullptr
11861 };
11862 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
11863 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060011864
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060011866 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060011867 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
11868 m_errorMonitor->VerifyFound();
11869 // Cleanup
11870 vkDestroyImageView(m_device->device(), view, NULL);
11871 vkDestroyRenderPass(m_device->device(), rp, NULL);
11872 vkDestroyFramebuffer(m_device->device(), fb, NULL);
11873}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011874
11875TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
11876 TEST_DESCRIPTION("If logicOp is available on the device, set it to an "
11877 "invalid value. If logicOp is not available, attempt to "
11878 "use it and verify that we see the correct error.");
11879 ASSERT_NO_FATAL_FAILURE(InitState());
11880 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11881
11882 auto features = m_device->phy().features();
11883 // Set the expected error depending on whether or not logicOp available
11884 if (VK_FALSE == features.logicOp) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "If logic operations feature not "
11886 "enabled, logicOpEnable must be "
11887 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011888 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130011889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011890 }
11891 // Create a pipeline using logicOp
11892 VkResult err;
11893
11894 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11895 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11896
11897 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011898 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011899 ASSERT_VK_SUCCESS(err);
11900
11901 VkPipelineViewportStateCreateInfo vp_state_ci = {};
11902 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
11903 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011904 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011905 vp_state_ci.pViewports = &vp;
11906 vp_state_ci.scissorCount = 1;
11907 VkRect2D scissors = {}; // Dummy scissors to point to
11908 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011909
11910 VkPipelineShaderStageCreateInfo shaderStages[2];
11911 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
11912
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011913 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11914 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011915 shaderStages[0] = vs.GetStageCreateInfo();
11916 shaderStages[1] = fs.GetStageCreateInfo();
11917
11918 VkPipelineVertexInputStateCreateInfo vi_ci = {};
11919 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
11920
11921 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
11922 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
11923 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
11924
11925 VkPipelineRasterizationStateCreateInfo rs_ci = {};
11926 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130011927 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011928
11929 VkPipelineColorBlendAttachmentState att = {};
11930 att.blendEnable = VK_FALSE;
11931 att.colorWriteMask = 0xf;
11932
11933 VkPipelineColorBlendStateCreateInfo cb_ci = {};
11934 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
11935 // Enable logicOp & set logicOp to value 1 beyond allowed entries
11936 cb_ci.logicOpEnable = VK_TRUE;
11937 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
11938 cb_ci.attachmentCount = 1;
11939 cb_ci.pAttachments = &att;
11940
Chris Forbes8aeacbf2016-10-03 14:25:08 +130011941 VkPipelineMultisampleStateCreateInfo ms_ci = {};
11942 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11943 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11944
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011945 VkGraphicsPipelineCreateInfo gp_ci = {};
11946 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
11947 gp_ci.stageCount = 2;
11948 gp_ci.pStages = shaderStages;
11949 gp_ci.pVertexInputState = &vi_ci;
11950 gp_ci.pInputAssemblyState = &ia_ci;
11951 gp_ci.pViewportState = &vp_state_ci;
11952 gp_ci.pRasterizationState = &rs_ci;
11953 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130011954 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011955 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
11956 gp_ci.layout = pipeline_layout;
11957 gp_ci.renderPass = renderPass();
11958
11959 VkPipelineCacheCreateInfo pc_ci = {};
11960 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
11961
11962 VkPipeline pipeline;
11963 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011964 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011965 ASSERT_VK_SUCCESS(err);
11966
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011967 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011968 m_errorMonitor->VerifyFound();
11969 if (VK_SUCCESS == err) {
11970 vkDestroyPipeline(m_device->device(), pipeline, NULL);
11971 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011972 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
11973 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11974}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011975#endif // DRAW_STATE_TESTS
11976
Tobin Ehlis0788f522015-05-26 16:11:58 -060011977#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060011978#if GTEST_IS_THREADSAFE
11979struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011980 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011981 VkEvent event;
11982 bool bailout;
11983};
11984
Karl Schultz6addd812016-02-02 17:17:23 -070011985extern "C" void *AddToCommandBuffer(void *arg) {
11986 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011987
Mike Stroyana6d14942016-07-13 15:10:05 -060011988 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011989 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011990 if (data->bailout) {
11991 break;
11992 }
11993 }
11994 return NULL;
11995}
11996
Karl Schultz6addd812016-02-02 17:17:23 -070011997TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011998 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011999
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012001
Mike Stroyanaccf7692015-05-12 16:00:45 -060012002 ASSERT_NO_FATAL_FAILURE(InitState());
12003 ASSERT_NO_FATAL_FAILURE(InitViewport());
12004 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12005
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012006 // Calls AllocateCommandBuffers
12007 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012008
12009 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012010 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012011
12012 VkEventCreateInfo event_info;
12013 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012014 VkResult err;
12015
12016 memset(&event_info, 0, sizeof(event_info));
12017 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12018
Chia-I Wuf7458c52015-10-26 21:10:41 +080012019 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012020 ASSERT_VK_SUCCESS(err);
12021
Mike Stroyanaccf7692015-05-12 16:00:45 -060012022 err = vkResetEvent(device(), event);
12023 ASSERT_VK_SUCCESS(err);
12024
12025 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012026 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012027 data.event = event;
12028 data.bailout = false;
12029 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060012030
12031 // First do some correct operations using multiple threads.
12032 // Add many entries to command buffer from another thread.
12033 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
12034 // Make non-conflicting calls from this thread at the same time.
12035 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060012036 uint32_t count;
12037 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060012038 }
12039 test_platform_thread_join(thread, NULL);
12040
12041 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060012042 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012043 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012044 // Add many entries to command buffer from this thread at the same time.
12045 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012046
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012047 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012048 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012049
Mike Stroyan10b8cb72016-01-22 15:22:03 -070012050 m_errorMonitor->SetBailout(NULL);
12051
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012052 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012053
Chia-I Wuf7458c52015-10-26 21:10:41 +080012054 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012055}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012056#endif // GTEST_IS_THREADSAFE
12057#endif // THREADING_TESTS
12058
Chris Forbes9f7ff632015-05-25 11:13:08 +120012059#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070012060TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012061 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12062 "with an impossible code size");
12063
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012065
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012066 ASSERT_NO_FATAL_FAILURE(InitState());
12067 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12068
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012069 VkShaderModule module;
12070 VkShaderModuleCreateInfo moduleCreateInfo;
12071 struct icd_spv_header spv;
12072
12073 spv.magic = ICD_SPV_MAGIC;
12074 spv.version = ICD_SPV_VERSION;
12075 spv.gen_magic = 0;
12076
12077 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12078 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012079 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012080 moduleCreateInfo.codeSize = 4;
12081 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012082 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012083
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012084 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012085}
12086
Karl Schultz6addd812016-02-02 17:17:23 -070012087TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012088 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12089 "with a bad magic number");
12090
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012091 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012092
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012093 ASSERT_NO_FATAL_FAILURE(InitState());
12094 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12095
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012096 VkShaderModule module;
12097 VkShaderModuleCreateInfo moduleCreateInfo;
12098 struct icd_spv_header spv;
12099
12100 spv.magic = ~ICD_SPV_MAGIC;
12101 spv.version = ICD_SPV_VERSION;
12102 spv.gen_magic = 0;
12103
12104 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12105 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012106 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012107 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12108 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012109 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012110
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012111 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012112}
12113
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012114#if 0
12115// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070012116TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012118 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012119
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012120 ASSERT_NO_FATAL_FAILURE(InitState());
12121 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12122
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012123 VkShaderModule module;
12124 VkShaderModuleCreateInfo moduleCreateInfo;
12125 struct icd_spv_header spv;
12126
12127 spv.magic = ICD_SPV_MAGIC;
12128 spv.version = ~ICD_SPV_VERSION;
12129 spv.gen_magic = 0;
12130
12131 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12132 moduleCreateInfo.pNext = NULL;
12133
Karl Schultz6addd812016-02-02 17:17:23 -070012134 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012135 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12136 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012137 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012138
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012139 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012140}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012141#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012142
Karl Schultz6addd812016-02-02 17:17:23 -070012143TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012144 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
12145 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012147
Chris Forbes9f7ff632015-05-25 11:13:08 +120012148 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012149 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012150
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012151 char const *vsSource = "#version 450\n"
12152 "\n"
12153 "layout(location=0) out float x;\n"
12154 "out gl_PerVertex {\n"
12155 " vec4 gl_Position;\n"
12156 "};\n"
12157 "void main(){\n"
12158 " gl_Position = vec4(1);\n"
12159 " x = 0;\n"
12160 "}\n";
12161 char const *fsSource = "#version 450\n"
12162 "\n"
12163 "layout(location=0) out vec4 color;\n"
12164 "void main(){\n"
12165 " color = vec4(1);\n"
12166 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120012167
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012168 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12169 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012170
12171 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012172 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012173 pipe.AddShader(&vs);
12174 pipe.AddShader(&fs);
12175
Chris Forbes9f7ff632015-05-25 11:13:08 +120012176 VkDescriptorSetObj descriptorSet(m_device);
12177 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012178 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012179
Tony Barbour5781e8f2015-08-04 16:23:11 -060012180 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012181
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012182 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012183}
Chris Forbes9f7ff632015-05-25 11:13:08 +120012184
Mark Mueller098c9cb2016-09-08 09:01:57 -060012185TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
12186 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
12187
12188 ASSERT_NO_FATAL_FAILURE(InitState());
12189 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12190
12191 const char *bad_specialization_message =
12192 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
12193
12194 char const *vsSource =
12195 "#version 450\n"
12196 "\n"
12197 "out gl_PerVertex {\n"
12198 " vec4 gl_Position;\n"
12199 "};\n"
12200 "void main(){\n"
12201 " gl_Position = vec4(1);\n"
12202 "}\n";
12203
12204 char const *fsSource =
12205 "#version 450\n"
12206 "\n"
12207 "layout (constant_id = 0) const float r = 0.0f;\n"
12208 "layout(location = 0) out vec4 uFragColor;\n"
12209 "void main(){\n"
12210 " uFragColor = vec4(r,1,0,1);\n"
12211 "}\n";
12212
12213 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12214 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12215
12216 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12217 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12218
12219 VkPipelineLayout pipeline_layout;
12220 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12221
12222 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
12223 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12224 vp_state_create_info.viewportCount = 1;
12225 VkViewport viewport = {};
12226 vp_state_create_info.pViewports = &viewport;
12227 vp_state_create_info.scissorCount = 1;
12228 VkRect2D scissors = {};
12229 vp_state_create_info.pScissors = &scissors;
12230
12231 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
12232
12233 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
12234 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
12235 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
12236 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
12237
12238 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {
12239 vs.GetStageCreateInfo(),
12240 fs.GetStageCreateInfo()
12241 };
12242
12243 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
12244 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12245
12246 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
12247 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12248 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12249
12250 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
12251 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
12252 rasterization_state_create_info.pNext = nullptr;
12253 rasterization_state_create_info.lineWidth = 1.0f;
12254 rasterization_state_create_info.rasterizerDiscardEnable = true;
12255
12256 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
12257 color_blend_attachment_state.blendEnable = VK_FALSE;
12258 color_blend_attachment_state.colorWriteMask = 0xf;
12259
12260 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
12261 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12262 color_blend_state_create_info.attachmentCount = 1;
12263 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
12264
12265 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
12266 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12267 graphicspipe_create_info.stageCount = 2;
12268 graphicspipe_create_info.pStages = shader_stage_create_info;
12269 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
12270 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
12271 graphicspipe_create_info.pViewportState = &vp_state_create_info;
12272 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
12273 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
12274 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
12275 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12276 graphicspipe_create_info.layout = pipeline_layout;
12277 graphicspipe_create_info.renderPass = renderPass();
12278
12279 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
12280 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12281
12282 VkPipelineCache pipelineCache;
12283 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
12284
12285 // This structure maps constant ids to data locations.
12286 const VkSpecializationMapEntry entry =
12287 // id, offset, size
12288 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
12289
12290 uint32_t data = 1;
12291
12292 // Set up the info describing spec map and data
12293 const VkSpecializationInfo specialization_info = {
12294 1,
12295 &entry,
12296 1 * sizeof(float),
12297 &data,
12298 };
12299 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
12300
12301 VkPipeline pipeline;
12302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
12303 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
12304 m_errorMonitor->VerifyFound();
12305
12306 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
12307 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12308}
12309
12310TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
12311 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
12312
12313 ASSERT_NO_FATAL_FAILURE(InitState());
12314 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12315
12316 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
12317
12318 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
12319 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12320 descriptor_pool_type_count[0].descriptorCount = 1;
12321 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
12322 descriptor_pool_type_count[1].descriptorCount = 1;
12323
12324 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12325 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12326 descriptor_pool_create_info.maxSets = 1;
12327 descriptor_pool_create_info.poolSizeCount = 2;
12328 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
12329 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12330
12331 VkDescriptorPool descriptorset_pool;
12332 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
12333
12334 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
12335 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
12336 descriptorset_layout_binding.descriptorCount = 1;
12337 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12338
12339 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
12340 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12341 descriptorset_layout_create_info.bindingCount = 1;
12342 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12343
12344 VkDescriptorSetLayout descriptorset_layout;
12345 ASSERT_VK_SUCCESS(vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
12346
12347 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
12348 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12349 descriptorset_allocate_info.descriptorSetCount = 1;
12350 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12351 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
12352 VkDescriptorSet descriptorset;
12353 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
12354
12355 // Challenge core_validation with a non uniform buffer type.
12356 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
12357
Mark Mueller098c9cb2016-09-08 09:01:57 -060012358 char const *vsSource =
12359 "#version 450\n"
12360 "\n"
12361 "layout (std140, set = 0, binding = 0) uniform buf {\n"
12362 " mat4 mvp;\n"
12363 "} ubuf;\n"
12364 "out gl_PerVertex {\n"
12365 " vec4 gl_Position;\n"
12366 "};\n"
12367 "void main(){\n"
12368 " gl_Position = ubuf.mvp * vec4(1);\n"
12369 "}\n";
12370
12371 char const *fsSource =
12372 "#version 450\n"
12373 "\n"
12374 "layout(location = 0) out vec4 uFragColor;\n"
12375 "void main(){\n"
12376 " uFragColor = vec4(0,1,0,1);\n"
12377 "}\n";
12378
12379 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12380 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12381
12382 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12383 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12384 pipeline_layout_create_info.setLayoutCount = 1;
12385 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12386
12387 VkPipelineLayout pipeline_layout;
12388 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12389
12390 VkPipelineObj pipe(m_device);
12391 pipe.AddColorAttachment();
12392 pipe.AddShader(&vs);
12393 pipe.AddShader(&fs);
12394
12395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
12396 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12397 m_errorMonitor->VerifyFound();
12398
12399 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12400 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
12401 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
12402}
12403
12404TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
12405 TEST_DESCRIPTION(
12406 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
12407
12408 ASSERT_NO_FATAL_FAILURE(InitState());
12409 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12410
12411 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
12412
12413 VkDescriptorPoolSize descriptor_pool_type_count = {};
12414 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12415 descriptor_pool_type_count.descriptorCount = 1;
12416
12417 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12418 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12419 descriptor_pool_create_info.maxSets = 1;
12420 descriptor_pool_create_info.poolSizeCount = 1;
12421 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
12422 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12423
12424 VkDescriptorPool descriptorset_pool;
12425 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
12426
12427 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
12428 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12429 descriptorset_layout_binding.descriptorCount = 1;
12430 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
12431 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12432
12433 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
12434 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12435 descriptorset_layout_create_info.bindingCount = 1;
12436 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12437
12438 VkDescriptorSetLayout descriptorset_layout;
12439 ASSERT_VK_SUCCESS(vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info,
12440 nullptr, &descriptorset_layout));
12441
12442 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
12443 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12444 descriptorset_allocate_info.descriptorSetCount = 1;
12445 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12446 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
12447 VkDescriptorSet descriptorset;
12448 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
12449
12450 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12451
Mark Mueller098c9cb2016-09-08 09:01:57 -060012452 char const *vsSource =
12453 "#version 450\n"
12454 "\n"
12455 "layout (std140, set = 0, binding = 0) uniform buf {\n"
12456 " mat4 mvp;\n"
12457 "} ubuf;\n"
12458 "out gl_PerVertex {\n"
12459 " vec4 gl_Position;\n"
12460 "};\n"
12461 "void main(){\n"
12462 " gl_Position = ubuf.mvp * vec4(1);\n"
12463 "}\n";
12464
12465 char const *fsSource =
12466 "#version 450\n"
12467 "\n"
12468 "layout(location = 0) out vec4 uFragColor;\n"
12469 "void main(){\n"
12470 " uFragColor = vec4(0,1,0,1);\n"
12471 "}\n";
12472
12473 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12474 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12475
12476 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12477 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12478 pipeline_layout_create_info.setLayoutCount = 1;
12479 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12480
12481 VkPipelineLayout pipeline_layout;
12482 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12483
12484 VkPipelineObj pipe(m_device);
12485 pipe.AddColorAttachment();
12486 pipe.AddShader(&vs);
12487 pipe.AddShader(&fs);
12488
12489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
12490 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12491 m_errorMonitor->VerifyFound();
12492
12493 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12494 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
12495 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
12496}
12497
12498TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
12499 TEST_DESCRIPTION("Create a graphics pipleine in which a push constant range containing a push constant block member is not "
12500 "accessible from the current shader stage.");
12501
12502 ASSERT_NO_FATAL_FAILURE(InitState());
12503 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12504
12505 const char *push_constant_not_accessible_message =
12506 "Push constant range covering variable starting at offset 0 not accessible from stage VK_SHADER_STAGE_VERTEX_BIT";
12507
12508 char const *vsSource =
12509 "#version 450\n"
12510 "\n"
12511 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
12512 "out gl_PerVertex {\n"
12513 " vec4 gl_Position;\n"
12514 "};\n"
12515 "void main(){\n"
12516 " gl_Position = vec4(consts.x);\n"
12517 "}\n";
12518
12519 char const *fsSource =
12520 "#version 450\n"
12521 "\n"
12522 "layout(location = 0) out vec4 uFragColor;\n"
12523 "void main(){\n"
12524 " uFragColor = vec4(0,1,0,1);\n"
12525 "}\n";
12526
12527 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12528 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12529
12530 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12531 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12532
12533 // Set up a push constant range
12534 VkPushConstantRange push_constant_ranges = {};
12535 // Set to the wrong stage to challenge core_validation
12536 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12537 push_constant_ranges.size = 4;
12538
12539 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
12540 pipeline_layout_create_info.pushConstantRangeCount = 1;
12541
12542 VkPipelineLayout pipeline_layout;
12543 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12544
12545 VkPipelineObj pipe(m_device);
12546 pipe.AddColorAttachment();
12547 pipe.AddShader(&vs);
12548 pipe.AddShader(&fs);
12549
12550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
12551 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12552 m_errorMonitor->VerifyFound();
12553
12554 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12555}
12556
12557TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
12558 TEST_DESCRIPTION(
12559 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
12560
12561 ASSERT_NO_FATAL_FAILURE(InitState());
12562 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12563
12564 const char *feature_not_enabled_message =
12565 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
12566
12567 // Some awkward steps are required to test with custom device features.
12568 std::vector<const char *> device_extension_names;
12569 auto features = m_device->phy().features();
12570 // Disable support for 64 bit floats
12571 features.shaderFloat64 = false;
12572 // The sacrificial device object
12573 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12574
12575 char const *vsSource = "#version 450\n"
12576 "\n"
12577 "out gl_PerVertex {\n"
12578 " vec4 gl_Position;\n"
12579 "};\n"
12580 "void main(){\n"
12581 " gl_Position = vec4(1);\n"
12582 "}\n";
12583 char const *fsSource = "#version 450\n"
12584 "\n"
12585 "layout(location=0) out vec4 color;\n"
12586 "void main(){\n"
12587 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
12588 " color = vec4(green);\n"
12589 "}\n";
12590
12591 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12592 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12593
12594 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060012595
12596 VkPipelineObj pipe(&test_device);
12597 pipe.AddColorAttachment();
12598 pipe.AddShader(&vs);
12599 pipe.AddShader(&fs);
12600
12601 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12602 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12603 VkPipelineLayout pipeline_layout;
12604 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12605
12606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
12607 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
12608 m_errorMonitor->VerifyFound();
12609
12610 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
12611}
12612
12613TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
12614 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
12615
12616 ASSERT_NO_FATAL_FAILURE(InitState());
12617 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12618
12619 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
12620
12621 char const *vsSource = "#version 450\n"
12622 "\n"
12623 "out gl_PerVertex {\n"
12624 " vec4 gl_Position;\n"
12625 "};\n"
12626 "layout(xfb_buffer = 1) out;"
12627 "void main(){\n"
12628 " gl_Position = vec4(1);\n"
12629 "}\n";
12630 char const *fsSource = "#version 450\n"
12631 "\n"
12632 "layout(location=0) out vec4 color;\n"
12633 "void main(){\n"
12634 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
12635 " color = vec4(green);\n"
12636 "}\n";
12637
12638 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12639 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12640
12641 VkPipelineObj pipe(m_device);
12642 pipe.AddColorAttachment();
12643 pipe.AddShader(&vs);
12644 pipe.AddShader(&fs);
12645
12646 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12647 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12648 VkPipelineLayout pipeline_layout;
12649 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12650
12651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
12652 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12653 m_errorMonitor->VerifyFound();
12654
12655 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12656}
12657
Karl Schultz6addd812016-02-02 17:17:23 -070012658TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012659 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12660 "which is not present in the outputs of the previous stage");
12661
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012663
Chris Forbes59cb88d2015-05-25 11:13:13 +120012664 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012665 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012666
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012667 char const *vsSource = "#version 450\n"
12668 "\n"
12669 "out gl_PerVertex {\n"
12670 " vec4 gl_Position;\n"
12671 "};\n"
12672 "void main(){\n"
12673 " gl_Position = vec4(1);\n"
12674 "}\n";
12675 char const *fsSource = "#version 450\n"
12676 "\n"
12677 "layout(location=0) in float x;\n"
12678 "layout(location=0) out vec4 color;\n"
12679 "void main(){\n"
12680 " color = vec4(x);\n"
12681 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120012682
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012683 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12684 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012685
12686 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012687 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012688 pipe.AddShader(&vs);
12689 pipe.AddShader(&fs);
12690
Chris Forbes59cb88d2015-05-25 11:13:13 +120012691 VkDescriptorSetObj descriptorSet(m_device);
12692 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012693 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012694
Tony Barbour5781e8f2015-08-04 16:23:11 -060012695 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012696
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012697 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012698}
12699
Karl Schultz6addd812016-02-02 17:17:23 -070012700TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012701 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12702 "within an interace block, which is not present in the outputs "
12703 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012705
12706 ASSERT_NO_FATAL_FAILURE(InitState());
12707 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12708
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012709 char const *vsSource = "#version 450\n"
12710 "\n"
12711 "out gl_PerVertex {\n"
12712 " vec4 gl_Position;\n"
12713 "};\n"
12714 "void main(){\n"
12715 " gl_Position = vec4(1);\n"
12716 "}\n";
12717 char const *fsSource = "#version 450\n"
12718 "\n"
12719 "in block { layout(location=0) float x; } ins;\n"
12720 "layout(location=0) out vec4 color;\n"
12721 "void main(){\n"
12722 " color = vec4(ins.x);\n"
12723 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130012724
12725 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12726 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12727
12728 VkPipelineObj pipe(m_device);
12729 pipe.AddColorAttachment();
12730 pipe.AddShader(&vs);
12731 pipe.AddShader(&fs);
12732
12733 VkDescriptorSetObj descriptorSet(m_device);
12734 descriptorSet.AppendDummy();
12735 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12736
12737 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12738
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012739 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012740}
12741
Karl Schultz6addd812016-02-02 17:17:23 -070012742TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012743 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012744 "across the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0.0: 'ptr to "
12746 "output arr[2] of float32' vs 'ptr to "
12747 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130012748
12749 ASSERT_NO_FATAL_FAILURE(InitState());
12750 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12751
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012752 char const *vsSource = "#version 450\n"
12753 "\n"
12754 "layout(location=0) out float x[2];\n"
12755 "out gl_PerVertex {\n"
12756 " vec4 gl_Position;\n"
12757 "};\n"
12758 "void main(){\n"
12759 " x[0] = 0; x[1] = 0;\n"
12760 " gl_Position = vec4(1);\n"
12761 "}\n";
12762 char const *fsSource = "#version 450\n"
12763 "\n"
12764 "layout(location=0) in float x[3];\n"
12765 "layout(location=0) out vec4 color;\n"
12766 "void main(){\n"
12767 " color = vec4(x[0] + x[1] + x[2]);\n"
12768 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130012769
12770 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12771 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12772
12773 VkPipelineObj pipe(m_device);
12774 pipe.AddColorAttachment();
12775 pipe.AddShader(&vs);
12776 pipe.AddShader(&fs);
12777
12778 VkDescriptorSetObj descriptorSet(m_device);
12779 descriptorSet.AppendDummy();
12780 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12781
12782 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12783
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012784 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130012785}
12786
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060012787
Karl Schultz6addd812016-02-02 17:17:23 -070012788TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012789 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012790 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012792
Chris Forbesb56af562015-05-25 11:13:17 +120012793 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012794 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120012795
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012796 char const *vsSource = "#version 450\n"
12797 "\n"
12798 "layout(location=0) out int x;\n"
12799 "out gl_PerVertex {\n"
12800 " vec4 gl_Position;\n"
12801 "};\n"
12802 "void main(){\n"
12803 " x = 0;\n"
12804 " gl_Position = vec4(1);\n"
12805 "}\n";
12806 char const *fsSource = "#version 450\n"
12807 "\n"
12808 "layout(location=0) in float x;\n" /* VS writes int */
12809 "layout(location=0) out vec4 color;\n"
12810 "void main(){\n"
12811 " color = vec4(x);\n"
12812 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120012813
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012814 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12815 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120012816
12817 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012818 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120012819 pipe.AddShader(&vs);
12820 pipe.AddShader(&fs);
12821
Chris Forbesb56af562015-05-25 11:13:17 +120012822 VkDescriptorSetObj descriptorSet(m_device);
12823 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012824 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120012825
Tony Barbour5781e8f2015-08-04 16:23:11 -060012826 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120012827
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012828 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120012829}
12830
Karl Schultz6addd812016-02-02 17:17:23 -070012831TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012832 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012833 "the vertex->fragment shader interface, when the variable is contained within "
Chris Forbes1cc79542016-07-20 11:13:44 +120012834 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012836
12837 ASSERT_NO_FATAL_FAILURE(InitState());
12838 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12839
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012840 char const *vsSource = "#version 450\n"
12841 "\n"
12842 "out block { layout(location=0) int x; } outs;\n"
12843 "out gl_PerVertex {\n"
12844 " vec4 gl_Position;\n"
12845 "};\n"
12846 "void main(){\n"
12847 " outs.x = 0;\n"
12848 " gl_Position = vec4(1);\n"
12849 "}\n";
12850 char const *fsSource = "#version 450\n"
12851 "\n"
12852 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
12853 "layout(location=0) out vec4 color;\n"
12854 "void main(){\n"
12855 " color = vec4(ins.x);\n"
12856 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130012857
12858 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12859 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12860
12861 VkPipelineObj pipe(m_device);
12862 pipe.AddColorAttachment();
12863 pipe.AddShader(&vs);
12864 pipe.AddShader(&fs);
12865
12866 VkDescriptorSetObj descriptorSet(m_device);
12867 descriptorSet.AppendDummy();
12868 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12869
12870 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12871
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012872 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012873}
12874
12875TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012876 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012877 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
Chris Forbes1cc79542016-07-20 11:13:44 +120012878 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012879 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 +130012880
12881 ASSERT_NO_FATAL_FAILURE(InitState());
12882 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12883
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012884 char const *vsSource = "#version 450\n"
12885 "\n"
12886 "out block { layout(location=1) float x; } outs;\n"
12887 "out gl_PerVertex {\n"
12888 " vec4 gl_Position;\n"
12889 "};\n"
12890 "void main(){\n"
12891 " outs.x = 0;\n"
12892 " gl_Position = vec4(1);\n"
12893 "}\n";
12894 char const *fsSource = "#version 450\n"
12895 "\n"
12896 "in block { layout(location=0) float x; } ins;\n"
12897 "layout(location=0) out vec4 color;\n"
12898 "void main(){\n"
12899 " color = vec4(ins.x);\n"
12900 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130012901
12902 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12903 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12904
12905 VkPipelineObj pipe(m_device);
12906 pipe.AddColorAttachment();
12907 pipe.AddShader(&vs);
12908 pipe.AddShader(&fs);
12909
12910 VkDescriptorSetObj descriptorSet(m_device);
12911 descriptorSet.AppendDummy();
12912 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12913
12914 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12915
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012916 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012917}
12918
12919TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012920 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012921 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
Chris Forbes1cc79542016-07-20 11:13:44 +120012922 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012923 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 +130012924
12925 ASSERT_NO_FATAL_FAILURE(InitState());
12926 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12927
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012928 char const *vsSource = "#version 450\n"
12929 "\n"
12930 "out block { layout(location=0, component=0) float x; } outs;\n"
12931 "out gl_PerVertex {\n"
12932 " vec4 gl_Position;\n"
12933 "};\n"
12934 "void main(){\n"
12935 " outs.x = 0;\n"
12936 " gl_Position = vec4(1);\n"
12937 "}\n";
12938 char const *fsSource = "#version 450\n"
12939 "\n"
12940 "in block { layout(location=0, component=1) float x; } ins;\n"
12941 "layout(location=0) out vec4 color;\n"
12942 "void main(){\n"
12943 " color = vec4(ins.x);\n"
12944 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130012945
12946 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12947 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12948
12949 VkPipelineObj pipe(m_device);
12950 pipe.AddColorAttachment();
12951 pipe.AddShader(&vs);
12952 pipe.AddShader(&fs);
12953
12954 VkDescriptorSetObj descriptorSet(m_device);
12955 descriptorSet.AppendDummy();
12956 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12957
12958 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12959
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012960 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012961}
12962
Chris Forbes1f3b0152016-11-30 12:48:40 +130012963TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
12964 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
12965
12966 ASSERT_NO_FATAL_FAILURE(InitState());
12967 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12968
12969 char const *vsSource = "#version 450\n"
12970 "layout(location=0) out mediump float x;\n"
12971 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
12972 char const *fsSource = "#version 450\n"
12973 "layout(location=0) in highp float x;\n"
12974 "layout(location=0) out vec4 color;\n"
12975 "void main() { color = vec4(x); }\n";
12976
12977 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12978 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12979
12980 VkPipelineObj pipe(m_device);
12981 pipe.AddColorAttachment();
12982 pipe.AddShader(&vs);
12983 pipe.AddShader(&fs);
12984
12985 VkDescriptorSetObj descriptorSet(m_device);
12986 descriptorSet.AppendDummy();
12987 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12988
12989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
12990
12991 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12992
12993 m_errorMonitor->VerifyFound();
12994}
12995
Chris Forbes870a39e2016-11-30 12:55:56 +130012996TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
12997 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
12998
12999 ASSERT_NO_FATAL_FAILURE(InitState());
13000 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13001
13002 char const *vsSource = "#version 450\n"
13003 "out block { layout(location=0) mediump float x; };\n"
13004 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13005 char const *fsSource = "#version 450\n"
13006 "in block { layout(location=0) highp float x; };\n"
13007 "layout(location=0) out vec4 color;\n"
13008 "void main() { color = vec4(x); }\n";
13009
13010 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13011 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13012
13013 VkPipelineObj pipe(m_device);
13014 pipe.AddColorAttachment();
13015 pipe.AddShader(&vs);
13016 pipe.AddShader(&fs);
13017
13018 VkDescriptorSetObj descriptorSet(m_device);
13019 descriptorSet.AppendDummy();
13020 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13021
13022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
13023
13024 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13025
13026 m_errorMonitor->VerifyFound();
13027}
13028
Karl Schultz6addd812016-02-02 17:17:23 -070013029TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013030 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
13031 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013033
Chris Forbesde136e02015-05-25 11:13:28 +120013034 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013035 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120013036
13037 VkVertexInputBindingDescription input_binding;
13038 memset(&input_binding, 0, sizeof(input_binding));
13039
13040 VkVertexInputAttributeDescription input_attrib;
13041 memset(&input_attrib, 0, sizeof(input_attrib));
13042 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13043
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013044 char const *vsSource = "#version 450\n"
13045 "\n"
13046 "out gl_PerVertex {\n"
13047 " vec4 gl_Position;\n"
13048 "};\n"
13049 "void main(){\n"
13050 " gl_Position = vec4(1);\n"
13051 "}\n";
13052 char const *fsSource = "#version 450\n"
13053 "\n"
13054 "layout(location=0) out vec4 color;\n"
13055 "void main(){\n"
13056 " color = vec4(1);\n"
13057 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120013058
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013059 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13060 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120013061
13062 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013063 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120013064 pipe.AddShader(&vs);
13065 pipe.AddShader(&fs);
13066
13067 pipe.AddVertexInputBindings(&input_binding, 1);
13068 pipe.AddVertexInputAttribs(&input_attrib, 1);
13069
Chris Forbesde136e02015-05-25 11:13:28 +120013070 VkDescriptorSetObj descriptorSet(m_device);
13071 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013072 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120013073
Tony Barbour5781e8f2015-08-04 16:23:11 -060013074 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120013075
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013076 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120013077}
13078
Karl Schultz6addd812016-02-02 17:17:23 -070013079TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013080 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
13081 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130013083
13084 ASSERT_NO_FATAL_FAILURE(InitState());
13085 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13086
13087 VkVertexInputBindingDescription input_binding;
13088 memset(&input_binding, 0, sizeof(input_binding));
13089
13090 VkVertexInputAttributeDescription input_attrib;
13091 memset(&input_attrib, 0, sizeof(input_attrib));
13092 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13093
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013094 char const *vsSource = "#version 450\n"
13095 "\n"
13096 "layout(location=1) in float x;\n"
13097 "out gl_PerVertex {\n"
13098 " vec4 gl_Position;\n"
13099 "};\n"
13100 "void main(){\n"
13101 " gl_Position = vec4(x);\n"
13102 "}\n";
13103 char const *fsSource = "#version 450\n"
13104 "\n"
13105 "layout(location=0) out vec4 color;\n"
13106 "void main(){\n"
13107 " color = vec4(1);\n"
13108 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130013109
13110 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13111 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13112
13113 VkPipelineObj pipe(m_device);
13114 pipe.AddColorAttachment();
13115 pipe.AddShader(&vs);
13116 pipe.AddShader(&fs);
13117
13118 pipe.AddVertexInputBindings(&input_binding, 1);
13119 pipe.AddVertexInputAttribs(&input_attrib, 1);
13120
13121 VkDescriptorSetObj descriptorSet(m_device);
13122 descriptorSet.AppendDummy();
13123 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13124
13125 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13126
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013127 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130013128}
13129
Karl Schultz6addd812016-02-02 17:17:23 -070013130TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013131 TEST_DESCRIPTION("Test that an error is produced for a vertex shader input which is not "
Chris Forbes1cc79542016-07-20 11:13:44 +120013132 "provided by a vertex attribute");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013133 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 -060013134
Chris Forbes62e8e502015-05-25 11:13:29 +120013135 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013136 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120013137
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013138 char const *vsSource = "#version 450\n"
13139 "\n"
13140 "layout(location=0) in vec4 x;\n" /* not provided */
13141 "out gl_PerVertex {\n"
13142 " vec4 gl_Position;\n"
13143 "};\n"
13144 "void main(){\n"
13145 " gl_Position = x;\n"
13146 "}\n";
13147 char const *fsSource = "#version 450\n"
13148 "\n"
13149 "layout(location=0) out vec4 color;\n"
13150 "void main(){\n"
13151 " color = vec4(1);\n"
13152 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120013153
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013154 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13155 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120013156
13157 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013158 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120013159 pipe.AddShader(&vs);
13160 pipe.AddShader(&fs);
13161
Chris Forbes62e8e502015-05-25 11:13:29 +120013162 VkDescriptorSetObj descriptorSet(m_device);
13163 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013164 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120013165
Tony Barbour5781e8f2015-08-04 16:23:11 -060013166 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120013167
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013168 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120013169}
13170
Karl Schultz6addd812016-02-02 17:17:23 -070013171TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013172 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
13173 "fundamental type (float/int/uint) of an attribute and the "
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013174 "vertex shader input that consumes it");
13175 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 -060013176
Chris Forbesc97d98e2015-05-25 11:13:31 +120013177 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013178 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013179
13180 VkVertexInputBindingDescription input_binding;
13181 memset(&input_binding, 0, sizeof(input_binding));
13182
13183 VkVertexInputAttributeDescription input_attrib;
13184 memset(&input_attrib, 0, sizeof(input_attrib));
13185 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13186
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013187 char const *vsSource = "#version 450\n"
13188 "\n"
13189 "layout(location=0) in int x;\n" /* attrib provided float */
13190 "out gl_PerVertex {\n"
13191 " vec4 gl_Position;\n"
13192 "};\n"
13193 "void main(){\n"
13194 " gl_Position = vec4(x);\n"
13195 "}\n";
13196 char const *fsSource = "#version 450\n"
13197 "\n"
13198 "layout(location=0) out vec4 color;\n"
13199 "void main(){\n"
13200 " color = vec4(1);\n"
13201 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120013202
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013203 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13204 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013205
13206 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013207 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013208 pipe.AddShader(&vs);
13209 pipe.AddShader(&fs);
13210
13211 pipe.AddVertexInputBindings(&input_binding, 1);
13212 pipe.AddVertexInputAttribs(&input_attrib, 1);
13213
Chris Forbesc97d98e2015-05-25 11:13:31 +120013214 VkDescriptorSetObj descriptorSet(m_device);
13215 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013216 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013217
Tony Barbour5781e8f2015-08-04 16:23:11 -060013218 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013219
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013220 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013221}
13222
Chris Forbesc68b43c2016-04-06 11:18:47 +120013223TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013224 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
13225 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13227 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120013228
13229 ASSERT_NO_FATAL_FAILURE(InitState());
13230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13231
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013232 char const *vsSource = "#version 450\n"
13233 "\n"
13234 "out gl_PerVertex {\n"
13235 " vec4 gl_Position;\n"
13236 "};\n"
13237 "void main(){\n"
13238 " gl_Position = vec4(1);\n"
13239 "}\n";
13240 char const *fsSource = "#version 450\n"
13241 "\n"
13242 "layout(location=0) out vec4 color;\n"
13243 "void main(){\n"
13244 " color = vec4(1);\n"
13245 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120013246
13247 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13248 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13249
13250 VkPipelineObj pipe(m_device);
13251 pipe.AddColorAttachment();
13252 pipe.AddShader(&vs);
Mike Weiblencce7ec72016-10-17 19:33:05 -060013253 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120013254 pipe.AddShader(&fs);
13255
13256 VkDescriptorSetObj descriptorSet(m_device);
13257 descriptorSet.AppendDummy();
13258 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13259
13260 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13261
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013262 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120013263}
13264
Chris Forbes82ff92a2016-09-09 10:50:24 +120013265TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
13266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13267 "No entrypoint found named `foo`");
13268
13269 ASSERT_NO_FATAL_FAILURE(InitState());
13270 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13271
13272 char const *vsSource = "#version 450\n"
13273 "out gl_PerVertex {\n"
13274 " vec4 gl_Position;\n"
13275 "};\n"
13276 "void main(){\n"
13277 " gl_Position = vec4(0);\n"
13278 "}\n";
13279 char const *fsSource = "#version 450\n"
13280 "\n"
13281 "layout(location=0) out vec4 color;\n"
13282 "void main(){\n"
13283 " color = vec4(1);\n"
13284 "}\n";
13285
13286 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13287 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
13288
13289 VkPipelineObj pipe(m_device);
13290 pipe.AddColorAttachment();
13291 pipe.AddShader(&vs);
13292 pipe.AddShader(&fs);
13293
13294 VkDescriptorSetObj descriptorSet(m_device);
13295 descriptorSet.AppendDummy();
13296 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13297
13298 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13299
13300 m_errorMonitor->VerifyFound();
13301}
13302
Chris Forbesae9d8cd2016-09-13 16:32:57 +120013303TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
13304 m_errorMonitor->SetDesiredFailureMsg(
13305 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13306 "pDepthStencilState is NULL when rasterization is enabled and subpass "
13307 "uses a depth/stencil attachment");
13308
13309 ASSERT_NO_FATAL_FAILURE(InitState());
13310 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13311
13312 char const *vsSource = "#version 450\n"
13313 "void main(){ gl_Position = vec4(0); }\n";
13314 char const *fsSource = "#version 450\n"
13315 "\n"
13316 "layout(location=0) out vec4 color;\n"
13317 "void main(){\n"
13318 " color = vec4(1);\n"
13319 "}\n";
13320
13321 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13322 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13323
13324 VkPipelineObj pipe(m_device);
13325 pipe.AddColorAttachment();
13326 pipe.AddShader(&vs);
13327 pipe.AddShader(&fs);
13328
13329 VkDescriptorSetObj descriptorSet(m_device);
13330 descriptorSet.AppendDummy();
13331 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13332
13333 VkAttachmentDescription attachments[] = {
13334 { 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
13335 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13336 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13337 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
13338 },
13339 { 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT,
13340 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13341 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13342 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
13343 },
13344 };
13345 VkAttachmentReference refs[] = {
13346 { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL },
13347 { 1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL },
13348 };
13349 VkSubpassDescription subpass = {
13350 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
13351 1, &refs[0], nullptr, &refs[1],
13352 0, nullptr
13353 };
13354 VkRenderPassCreateInfo rpci = {
13355 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
13356 0, 2, attachments, 1, &subpass, 0, nullptr
13357 };
13358 VkRenderPass rp;
13359 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13360 ASSERT_VK_SUCCESS(err);
13361
13362 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
13363
13364 m_errorMonitor->VerifyFound();
13365
13366 vkDestroyRenderPass(m_device->device(), rp, nullptr);
13367}
13368
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013369TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013370 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
13371 "the TCS without the patch decoration, but consumed in the TES "
13372 "with the decoration.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is per-vertex in tessellation control shader stage "
13374 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120013375
13376 ASSERT_NO_FATAL_FAILURE(InitState());
13377 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13378
Chris Forbesc1e852d2016-04-04 19:26:42 +120013379 if (!m_device->phy().features().tessellationShader) {
13380 printf("Device does not support tessellation shaders; skipped.\n");
13381 return;
13382 }
13383
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013384 char const *vsSource = "#version 450\n"
13385 "void main(){}\n";
13386 char const *tcsSource = "#version 450\n"
13387 "layout(location=0) out int x[];\n"
13388 "layout(vertices=3) out;\n"
13389 "void main(){\n"
13390 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13391 " gl_TessLevelInner[0] = 1;\n"
13392 " x[gl_InvocationID] = gl_InvocationID;\n"
13393 "}\n";
13394 char const *tesSource = "#version 450\n"
13395 "layout(triangles, equal_spacing, cw) in;\n"
13396 "layout(location=0) patch in int x;\n"
13397 "out gl_PerVertex { vec4 gl_Position; };\n"
13398 "void main(){\n"
13399 " gl_Position.xyz = gl_TessCoord;\n"
13400 " gl_Position.w = x;\n"
13401 "}\n";
13402 char const *fsSource = "#version 450\n"
13403 "layout(location=0) out vec4 color;\n"
13404 "void main(){\n"
13405 " color = vec4(1);\n"
13406 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120013407
13408 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13409 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13410 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13411 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13412
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013413 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
13414 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120013415
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013416 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120013417
13418 VkPipelineObj pipe(m_device);
13419 pipe.SetInputAssembly(&iasci);
13420 pipe.SetTessellation(&tsci);
13421 pipe.AddColorAttachment();
13422 pipe.AddShader(&vs);
13423 pipe.AddShader(&tcs);
13424 pipe.AddShader(&tes);
13425 pipe.AddShader(&fs);
13426
13427 VkDescriptorSetObj descriptorSet(m_device);
13428 descriptorSet.AppendDummy();
13429 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13430
13431 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13432
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013433 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120013434}
13435
Karl Schultz6addd812016-02-02 17:17:23 -070013436TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013437 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
13438 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13440 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013441
Chris Forbes280ba2c2015-06-12 11:16:41 +120013442 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013443 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013444
13445 /* Two binding descriptions for binding 0 */
13446 VkVertexInputBindingDescription input_bindings[2];
13447 memset(input_bindings, 0, sizeof(input_bindings));
13448
13449 VkVertexInputAttributeDescription input_attrib;
13450 memset(&input_attrib, 0, sizeof(input_attrib));
13451 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13452
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013453 char const *vsSource = "#version 450\n"
13454 "\n"
13455 "layout(location=0) in float x;\n" /* attrib provided float */
13456 "out gl_PerVertex {\n"
13457 " vec4 gl_Position;\n"
13458 "};\n"
13459 "void main(){\n"
13460 " gl_Position = vec4(x);\n"
13461 "}\n";
13462 char const *fsSource = "#version 450\n"
13463 "\n"
13464 "layout(location=0) out vec4 color;\n"
13465 "void main(){\n"
13466 " color = vec4(1);\n"
13467 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120013468
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013469 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13470 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013471
13472 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013473 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013474 pipe.AddShader(&vs);
13475 pipe.AddShader(&fs);
13476
13477 pipe.AddVertexInputBindings(input_bindings, 2);
13478 pipe.AddVertexInputAttribs(&input_attrib, 1);
13479
Chris Forbes280ba2c2015-06-12 11:16:41 +120013480 VkDescriptorSetObj descriptorSet(m_device);
13481 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013482 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013483
Tony Barbour5781e8f2015-08-04 16:23:11 -060013484 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013485
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013486 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013487}
Chris Forbes8f68b562015-05-25 11:13:32 +120013488
Karl Schultz6addd812016-02-02 17:17:23 -070013489TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mike Weiblencce7ec72016-10-17 19:33:05 -060013490 TEST_DESCRIPTION("Test that an error is produced for a fragment shader which does not "
Chris Forbes1cc79542016-07-20 11:13:44 +120013491 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013493
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013494 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013495
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013496 char const *vsSource = "#version 450\n"
13497 "\n"
13498 "out gl_PerVertex {\n"
13499 " vec4 gl_Position;\n"
13500 "};\n"
13501 "void main(){\n"
13502 " gl_Position = vec4(1);\n"
13503 "}\n";
13504 char const *fsSource = "#version 450\n"
13505 "\n"
13506 "void main(){\n"
13507 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013508
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013509 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13510 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013511
13512 VkPipelineObj pipe(m_device);
13513 pipe.AddShader(&vs);
13514 pipe.AddShader(&fs);
13515
Chia-I Wu08accc62015-07-07 11:50:03 +080013516 /* set up CB 0, not written */
13517 pipe.AddColorAttachment();
13518 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013519
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013520 VkDescriptorSetObj descriptorSet(m_device);
13521 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013522 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013523
Tony Barbour5781e8f2015-08-04 16:23:11 -060013524 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013525
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013526 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013527}
13528
Karl Schultz6addd812016-02-02 17:17:23 -070013529TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mike Weiblencce7ec72016-10-17 19:33:05 -060013530 TEST_DESCRIPTION("Test that a warning is produced for a fragment shader which provides a spurious "
Chris Forbes1cc79542016-07-20 11:13:44 +120013531 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013533 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013534
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013535 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013536
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013537 char const *vsSource = "#version 450\n"
13538 "\n"
13539 "out gl_PerVertex {\n"
13540 " vec4 gl_Position;\n"
13541 "};\n"
13542 "void main(){\n"
13543 " gl_Position = vec4(1);\n"
13544 "}\n";
13545 char const *fsSource = "#version 450\n"
13546 "\n"
13547 "layout(location=0) out vec4 x;\n"
13548 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
13549 "void main(){\n"
13550 " x = vec4(1);\n"
13551 " y = vec4(1);\n"
13552 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013553
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013554 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13555 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013556
13557 VkPipelineObj pipe(m_device);
13558 pipe.AddShader(&vs);
13559 pipe.AddShader(&fs);
13560
Chia-I Wu08accc62015-07-07 11:50:03 +080013561 /* set up CB 0, not written */
13562 pipe.AddColorAttachment();
13563 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013564 /* FS writes CB 1, but we don't configure it */
13565
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013566 VkDescriptorSetObj descriptorSet(m_device);
13567 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013568 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013569
Tony Barbour5781e8f2015-08-04 16:23:11 -060013570 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013571
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013572 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013573}
13574
Karl Schultz6addd812016-02-02 17:17:23 -070013575TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013576 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
Mike Weiblencce7ec72016-10-17 19:33:05 -060013577 "type of an fragment shader output variable, and the format of the corresponding attachment");
13578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013579
Chris Forbesa36d69e2015-05-25 11:13:44 +120013580 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013581
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013582 char const *vsSource = "#version 450\n"
13583 "\n"
13584 "out gl_PerVertex {\n"
13585 " vec4 gl_Position;\n"
13586 "};\n"
13587 "void main(){\n"
13588 " gl_Position = vec4(1);\n"
13589 "}\n";
13590 char const *fsSource = "#version 450\n"
13591 "\n"
13592 "layout(location=0) out ivec4 x;\n" /* not UNORM */
13593 "void main(){\n"
13594 " x = ivec4(1);\n"
13595 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120013596
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013597 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13598 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013599
13600 VkPipelineObj pipe(m_device);
13601 pipe.AddShader(&vs);
13602 pipe.AddShader(&fs);
13603
Chia-I Wu08accc62015-07-07 11:50:03 +080013604 /* set up CB 0; type is UNORM by default */
13605 pipe.AddColorAttachment();
13606 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013607
Chris Forbesa36d69e2015-05-25 11:13:44 +120013608 VkDescriptorSetObj descriptorSet(m_device);
13609 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013610 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013611
Tony Barbour5781e8f2015-08-04 16:23:11 -060013612 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013613
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013614 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120013615}
Chris Forbes7b1b8932015-06-05 14:43:36 +120013616
Karl Schultz6addd812016-02-02 17:17:23 -070013617TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013618 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
13619 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013621
Chris Forbes556c76c2015-08-14 12:04:59 +120013622 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120013623
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013624 char const *vsSource = "#version 450\n"
13625 "\n"
13626 "out gl_PerVertex {\n"
13627 " vec4 gl_Position;\n"
13628 "};\n"
13629 "void main(){\n"
13630 " gl_Position = vec4(1);\n"
13631 "}\n";
13632 char const *fsSource = "#version 450\n"
13633 "\n"
13634 "layout(location=0) out vec4 x;\n"
13635 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
13636 "void main(){\n"
13637 " x = vec4(bar.y);\n"
13638 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120013639
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013640 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13641 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120013642
Chris Forbes556c76c2015-08-14 12:04:59 +120013643 VkPipelineObj pipe(m_device);
13644 pipe.AddShader(&vs);
13645 pipe.AddShader(&fs);
13646
13647 /* set up CB 0; type is UNORM by default */
13648 pipe.AddColorAttachment();
13649 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13650
13651 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013652 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120013653
13654 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13655
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013656 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120013657}
13658
Chris Forbes5c59e902016-02-26 16:56:09 +130013659TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013660 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
13661 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130013663
13664 ASSERT_NO_FATAL_FAILURE(InitState());
13665
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013666 char const *vsSource = "#version 450\n"
13667 "\n"
13668 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13669 "out gl_PerVertex {\n"
13670 " vec4 gl_Position;\n"
13671 "};\n"
13672 "void main(){\n"
13673 " gl_Position = vec4(consts.x);\n"
13674 "}\n";
13675 char const *fsSource = "#version 450\n"
13676 "\n"
13677 "layout(location=0) out vec4 x;\n"
13678 "void main(){\n"
13679 " x = vec4(1);\n"
13680 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130013681
13682 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13683 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13684
13685 VkPipelineObj pipe(m_device);
13686 pipe.AddShader(&vs);
13687 pipe.AddShader(&fs);
13688
13689 /* set up CB 0; type is UNORM by default */
13690 pipe.AddColorAttachment();
13691 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13692
13693 VkDescriptorSetObj descriptorSet(m_device);
13694 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13695
13696 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13697
13698 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013699 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130013700}
13701
Chris Forbes3fb17902016-08-22 14:57:55 +120013702TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
13703 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
13704 "which is not included in the subpass description");
13705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13706 "consumes input attachment index 0 but not provided in subpass");
13707
13708 ASSERT_NO_FATAL_FAILURE(InitState());
13709
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013710 char const *vsSource = "#version 450\n"
13711 "\n"
13712 "out gl_PerVertex {\n"
13713 " vec4 gl_Position;\n"
13714 "};\n"
13715 "void main(){\n"
13716 " gl_Position = vec4(1);\n"
13717 "}\n";
13718 char const *fsSource = "#version 450\n"
13719 "\n"
13720 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
13721 "layout(location=0) out vec4 color;\n"
13722 "void main() {\n"
13723 " color = subpassLoad(x);\n"
13724 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120013725
13726 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13727 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13728
13729 VkPipelineObj pipe(m_device);
13730 pipe.AddShader(&vs);
13731 pipe.AddShader(&fs);
13732 pipe.AddColorAttachment();
13733 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13734
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013735 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
13736 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120013737 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013738 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120013739 ASSERT_VK_SUCCESS(err);
13740
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013741 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120013742 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013743 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120013744 ASSERT_VK_SUCCESS(err);
13745
13746 // error here.
13747 pipe.CreateVKPipeline(pl, renderPass());
13748
13749 m_errorMonitor->VerifyFound();
13750
13751 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13752 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13753}
13754
Chris Forbes5a9a0472016-08-22 16:02:09 +120013755TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
13756 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
13757 "with a format having a different fundamental type");
13758 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13759 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
13760
13761 ASSERT_NO_FATAL_FAILURE(InitState());
13762
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013763 char const *vsSource = "#version 450\n"
13764 "\n"
13765 "out gl_PerVertex {\n"
13766 " vec4 gl_Position;\n"
13767 "};\n"
13768 "void main(){\n"
13769 " gl_Position = vec4(1);\n"
13770 "}\n";
13771 char const *fsSource = "#version 450\n"
13772 "\n"
13773 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
13774 "layout(location=0) out vec4 color;\n"
13775 "void main() {\n"
13776 " color = subpassLoad(x);\n"
13777 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120013778
13779 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13780 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13781
13782 VkPipelineObj pipe(m_device);
13783 pipe.AddShader(&vs);
13784 pipe.AddShader(&fs);
13785 pipe.AddColorAttachment();
13786 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13787
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013788 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
13789 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013790 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013791 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120013792 ASSERT_VK_SUCCESS(err);
13793
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013794 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013795 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013796 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120013797 ASSERT_VK_SUCCESS(err);
13798
13799 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013800 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
13801 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
13802 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
13803 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
13804 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 +120013805 };
13806 VkAttachmentReference color = {
13807 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
13808 };
13809 VkAttachmentReference input = {
13810 1, VK_IMAGE_LAYOUT_GENERAL,
13811 };
13812
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013813 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013814
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013815 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013816 VkRenderPass rp;
13817 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13818 ASSERT_VK_SUCCESS(err);
13819
13820 // error here.
13821 pipe.CreateVKPipeline(pl, rp);
13822
13823 m_errorMonitor->VerifyFound();
13824
13825 vkDestroyRenderPass(m_device->device(), rp, nullptr);
13826 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13827 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13828}
13829
Chris Forbes541f7b02016-08-22 15:30:27 +120013830TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
13831 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
13832 "which is not included in the subpass description -- array case");
13833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13834 "consumes input attachment index 1 but not provided in subpass");
13835
13836 ASSERT_NO_FATAL_FAILURE(InitState());
13837
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013838 char const *vsSource = "#version 450\n"
13839 "\n"
13840 "out gl_PerVertex {\n"
13841 " vec4 gl_Position;\n"
13842 "};\n"
13843 "void main(){\n"
13844 " gl_Position = vec4(1);\n"
13845 "}\n";
13846 char const *fsSource = "#version 450\n"
13847 "\n"
13848 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[2];\n"
13849 "layout(location=0) out vec4 color;\n"
13850 "void main() {\n"
13851 " color = subpassLoad(xs[1]);\n"
13852 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120013853
13854 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13855 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13856
13857 VkPipelineObj pipe(m_device);
13858 pipe.AddShader(&vs);
13859 pipe.AddShader(&fs);
13860 pipe.AddColorAttachment();
13861 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13862
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013863 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
13864 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120013865 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013866 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120013867 ASSERT_VK_SUCCESS(err);
13868
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013869 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120013870 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013871 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120013872 ASSERT_VK_SUCCESS(err);
13873
13874 // error here.
13875 pipe.CreateVKPipeline(pl, renderPass());
13876
13877 m_errorMonitor->VerifyFound();
13878
13879 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13880 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13881}
13882
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013883TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013884 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
13885 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013887
13888 ASSERT_NO_FATAL_FAILURE(InitState());
13889
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013890 char const *csSource = "#version 450\n"
13891 "\n"
13892 "layout(local_size_x=1) in;\n"
13893 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13894 "void main(){\n"
13895 " x = vec4(1);\n"
13896 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013897
13898 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13899
13900 VkDescriptorSetObj descriptorSet(m_device);
13901 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13902
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013903 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13904 nullptr,
13905 0,
13906 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
13907 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
13908 descriptorSet.GetPipelineLayout(),
13909 VK_NULL_HANDLE,
13910 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013911
13912 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013913 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013914
13915 m_errorMonitor->VerifyFound();
13916
13917 if (err == VK_SUCCESS) {
13918 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13919 }
13920}
13921
Chris Forbes22a9b092016-07-19 14:34:05 +120013922TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013923 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
13924 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13926 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120013927
13928 ASSERT_NO_FATAL_FAILURE(InitState());
13929
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013930 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
13931 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120013932 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013933 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120013934 ASSERT_VK_SUCCESS(err);
13935
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013936 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120013937 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013938 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120013939 ASSERT_VK_SUCCESS(err);
13940
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013941 char const *csSource = "#version 450\n"
13942 "\n"
13943 "layout(local_size_x=1) in;\n"
13944 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13945 "void main() {\n"
13946 " x.x = 1.0f;\n"
13947 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120013948 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13949
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013950 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13951 nullptr,
13952 0,
13953 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
13954 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
13955 pl,
13956 VK_NULL_HANDLE,
13957 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120013958
13959 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013960 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120013961
13962 m_errorMonitor->VerifyFound();
13963
13964 if (err == VK_SUCCESS) {
13965 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13966 }
13967
13968 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13969 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13970}
13971
Chris Forbes50020592016-07-27 13:52:41 +120013972TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
13973 TEST_DESCRIPTION("Test that an error is produced when an image view type "
13974 "does not match the dimensionality declared in the shader");
13975
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013976 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 +120013977
13978 ASSERT_NO_FATAL_FAILURE(InitState());
13979 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13980
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013981 char const *vsSource = "#version 450\n"
13982 "\n"
13983 "out gl_PerVertex { vec4 gl_Position; };\n"
13984 "void main() { gl_Position = vec4(0); }\n";
13985 char const *fsSource = "#version 450\n"
13986 "\n"
13987 "layout(set=0, binding=0) uniform sampler3D s;\n"
13988 "layout(location=0) out vec4 color;\n"
13989 "void main() {\n"
13990 " color = texture(s, vec3(0));\n"
13991 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120013992 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13993 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13994
13995 VkPipelineObj pipe(m_device);
13996 pipe.AddShader(&vs);
13997 pipe.AddShader(&fs);
13998 pipe.AddColorAttachment();
13999
14000 VkTextureObj texture(m_device, nullptr);
14001 VkSamplerObj sampler(m_device);
14002
14003 VkDescriptorSetObj descriptorSet(m_device);
14004 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14005 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14006
14007 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14008 ASSERT_VK_SUCCESS(err);
14009
14010 BeginCommandBuffer();
14011
14012 m_commandBuffer->BindPipeline(pipe);
14013 m_commandBuffer->BindDescriptorSet(descriptorSet);
14014
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014015 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120014016 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014017 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120014018 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14019
14020 // error produced here.
14021 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14022
14023 m_errorMonitor->VerifyFound();
14024
14025 EndCommandBuffer();
14026}
14027
Chris Forbes5533bfc2016-07-27 14:12:34 +120014028TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
14029 TEST_DESCRIPTION("Test that an error is produced when a multisampled images "
14030 "are consumed via singlesample images types in the shader, or vice versa.");
14031
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120014033
14034 ASSERT_NO_FATAL_FAILURE(InitState());
14035 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14036
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014037 char const *vsSource = "#version 450\n"
14038 "\n"
14039 "out gl_PerVertex { vec4 gl_Position; };\n"
14040 "void main() { gl_Position = vec4(0); }\n";
14041 char const *fsSource = "#version 450\n"
14042 "\n"
14043 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
14044 "layout(location=0) out vec4 color;\n"
14045 "void main() {\n"
14046 " color = texelFetch(s, ivec2(0), 0);\n"
14047 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120014048 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14049 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14050
14051 VkPipelineObj pipe(m_device);
14052 pipe.AddShader(&vs);
14053 pipe.AddShader(&fs);
14054 pipe.AddColorAttachment();
14055
14056 VkTextureObj texture(m_device, nullptr);
14057 VkSamplerObj sampler(m_device);
14058
14059 VkDescriptorSetObj descriptorSet(m_device);
14060 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14061 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14062
14063 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14064 ASSERT_VK_SUCCESS(err);
14065
14066 BeginCommandBuffer();
14067
14068 m_commandBuffer->BindPipeline(pipe);
14069 m_commandBuffer->BindDescriptorSet(descriptorSet);
14070
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014071 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120014072 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014073 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120014074 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14075
14076 // error produced here.
14077 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14078
14079 m_errorMonitor->VerifyFound();
14080
14081 EndCommandBuffer();
14082}
14083
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014084#endif // SHADER_CHECKER_TESTS
14085
14086#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060014087TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014089
14090 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014091
14092 // Create an image
14093 VkImage image;
14094
Karl Schultz6addd812016-02-02 17:17:23 -070014095 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14096 const int32_t tex_width = 32;
14097 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014098
14099 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014100 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14101 image_create_info.pNext = NULL;
14102 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14103 image_create_info.format = tex_format;
14104 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014105 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070014106 image_create_info.extent.depth = 1;
14107 image_create_info.mipLevels = 1;
14108 image_create_info.arrayLayers = 1;
14109 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14110 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14111 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14112 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014113
14114 // Introduce error by sending down a bogus width extent
14115 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014116 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014117
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014118 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014119}
14120
Mark Youngc48c4c12016-04-11 14:26:49 -060014121TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014122 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14123 "CreateImage extents is 0 for at least one required dimension");
Mark Youngc48c4c12016-04-11 14:26:49 -060014124
14125 ASSERT_NO_FATAL_FAILURE(InitState());
14126
14127 // Create an image
14128 VkImage image;
14129
14130 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14131 const int32_t tex_width = 32;
14132 const int32_t tex_height = 32;
14133
14134 VkImageCreateInfo image_create_info = {};
14135 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14136 image_create_info.pNext = NULL;
14137 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14138 image_create_info.format = tex_format;
14139 image_create_info.extent.width = tex_width;
14140 image_create_info.extent.height = tex_height;
14141 image_create_info.extent.depth = 1;
14142 image_create_info.mipLevels = 1;
14143 image_create_info.arrayLayers = 1;
14144 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14145 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14146 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14147 image_create_info.flags = 0;
14148
14149 // Introduce error by sending down a bogus width extent
14150 image_create_info.extent.width = 0;
14151 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14152
14153 m_errorMonitor->VerifyFound();
14154}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014155#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120014156
Tobin Ehliscde08892015-09-22 10:11:37 -060014157#if IMAGE_TESTS
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070014158
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014159TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
14160 TEST_DESCRIPTION("Create a render pass with an attachment description "
14161 "format set to VK_FORMAT_UNDEFINED");
14162
14163 ASSERT_NO_FATAL_FAILURE(InitState());
14164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14165
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014167
14168 VkAttachmentReference color_attach = {};
14169 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
14170 color_attach.attachment = 0;
14171 VkSubpassDescription subpass = {};
14172 subpass.colorAttachmentCount = 1;
14173 subpass.pColorAttachments = &color_attach;
14174
14175 VkRenderPassCreateInfo rpci = {};
14176 rpci.subpassCount = 1;
14177 rpci.pSubpasses = &subpass;
14178 rpci.attachmentCount = 1;
14179 VkAttachmentDescription attach_desc = {};
14180 attach_desc.format = VK_FORMAT_UNDEFINED;
14181 rpci.pAttachments = &attach_desc;
14182 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
14183 VkRenderPass rp;
14184 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
14185
14186 m_errorMonitor->VerifyFound();
14187
14188 if (result == VK_SUCCESS) {
14189 vkDestroyRenderPass(m_device->device(), rp, NULL);
14190 }
14191}
14192
Karl Schultz6addd812016-02-02 17:17:23 -070014193TEST_F(VkLayerTest, InvalidImageView) {
14194 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060014195
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseMipLevel 10 ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014197
Tobin Ehliscde08892015-09-22 10:11:37 -060014198 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060014199
Mike Stroyana3082432015-09-25 13:39:21 -060014200 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070014201 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060014202
Karl Schultz6addd812016-02-02 17:17:23 -070014203 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14204 const int32_t tex_width = 32;
14205 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060014206
14207 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014208 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14209 image_create_info.pNext = NULL;
14210 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14211 image_create_info.format = tex_format;
14212 image_create_info.extent.width = tex_width;
14213 image_create_info.extent.height = tex_height;
14214 image_create_info.extent.depth = 1;
14215 image_create_info.mipLevels = 1;
14216 image_create_info.arrayLayers = 1;
14217 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14218 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14219 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14220 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060014221
Chia-I Wuf7458c52015-10-26 21:10:41 +080014222 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060014223 ASSERT_VK_SUCCESS(err);
14224
14225 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130014226 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070014227 image_view_create_info.image = image;
14228 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14229 image_view_create_info.format = tex_format;
14230 image_view_create_info.subresourceRange.layerCount = 1;
14231 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
14232 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014233 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060014234
14235 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014236 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060014237
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014238 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060014239 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060014240}
Mike Stroyana3082432015-09-25 13:39:21 -060014241
Mark Youngd339ba32016-05-30 13:28:35 -060014242TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
14243 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060014244 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060014245 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060014246
14247 ASSERT_NO_FATAL_FAILURE(InitState());
14248
14249 // Create an image and try to create a view with no memory backing the image
14250 VkImage image;
14251
14252 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14253 const int32_t tex_width = 32;
14254 const int32_t tex_height = 32;
14255
14256 VkImageCreateInfo image_create_info = {};
14257 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14258 image_create_info.pNext = NULL;
14259 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14260 image_create_info.format = tex_format;
14261 image_create_info.extent.width = tex_width;
14262 image_create_info.extent.height = tex_height;
14263 image_create_info.extent.depth = 1;
14264 image_create_info.mipLevels = 1;
14265 image_create_info.arrayLayers = 1;
14266 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14267 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14268 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14269 image_create_info.flags = 0;
14270
14271 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14272 ASSERT_VK_SUCCESS(err);
14273
14274 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130014275 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060014276 image_view_create_info.image = image;
14277 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14278 image_view_create_info.format = tex_format;
14279 image_view_create_info.subresourceRange.layerCount = 1;
14280 image_view_create_info.subresourceRange.baseMipLevel = 0;
14281 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014282 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060014283
14284 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014285 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060014286
14287 m_errorMonitor->VerifyFound();
14288 vkDestroyImage(m_device->device(), image, NULL);
14289 // If last error is success, it still created the view, so delete it.
14290 if (err == VK_SUCCESS) {
14291 vkDestroyImageView(m_device->device(), view, NULL);
14292 }
Mark Youngd339ba32016-05-30 13:28:35 -060014293}
14294
Karl Schultz6addd812016-02-02 17:17:23 -070014295TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014296 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014297 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView(): Color image "
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014298 "formats must have ONLY the "
14299 "VK_IMAGE_ASPECT_COLOR_BIT set");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14301 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014302
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014303 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014304
Karl Schultz6addd812016-02-02 17:17:23 -070014305 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014306 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014307 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014308 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014309
14310 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014311 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014312 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070014313 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14314 image_view_create_info.format = tex_format;
14315 image_view_create_info.subresourceRange.baseMipLevel = 0;
14316 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014317 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014318 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014319 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014320
14321 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014322 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014323
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014324 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014325}
14326
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014327TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070014328 VkResult err;
14329 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014330
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14332 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014333
Mike Stroyana3082432015-09-25 13:39:21 -060014334 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014335
14336 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014337 VkImage srcImage;
14338 VkImage dstImage;
14339 VkDeviceMemory srcMem;
14340 VkDeviceMemory destMem;
14341 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014342
14343 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014344 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14345 image_create_info.pNext = NULL;
14346 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14347 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14348 image_create_info.extent.width = 32;
14349 image_create_info.extent.height = 32;
14350 image_create_info.extent.depth = 1;
14351 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014352 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070014353 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14354 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14355 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14356 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014357
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014358 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014359 ASSERT_VK_SUCCESS(err);
14360
Mark Lobodzinski867787a2016-10-14 11:49:55 -060014361 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014362 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014363 ASSERT_VK_SUCCESS(err);
14364
14365 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014366 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014367 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14368 memAlloc.pNext = NULL;
14369 memAlloc.allocationSize = 0;
14370 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014371
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014372 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014373 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014374 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014375 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014376 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014377 ASSERT_VK_SUCCESS(err);
14378
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014379 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014380 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014381 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014382 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014383 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014384 ASSERT_VK_SUCCESS(err);
14385
14386 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14387 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014388 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014389 ASSERT_VK_SUCCESS(err);
14390
14391 BeginCommandBuffer();
14392 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014393 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014394 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014395 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014396 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060014397 copyRegion.srcOffset.x = 0;
14398 copyRegion.srcOffset.y = 0;
14399 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014400 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014401 copyRegion.dstSubresource.mipLevel = 0;
14402 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014403 // Introduce failure by forcing the dst layerCount to differ from src
14404 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014405 copyRegion.dstOffset.x = 0;
14406 copyRegion.dstOffset.y = 0;
14407 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014408 copyRegion.extent.width = 1;
14409 copyRegion.extent.height = 1;
14410 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014411 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014412 EndCommandBuffer();
14413
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014414 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014415
Chia-I Wuf7458c52015-10-26 21:10:41 +080014416 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014417 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014418 vkFreeMemory(m_device->device(), srcMem, NULL);
14419 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014420}
14421
Tony Barbourd6673642016-05-05 14:46:39 -060014422TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
14423
14424 TEST_DESCRIPTION("Creating images with unsuported formats ");
14425
14426 ASSERT_NO_FATAL_FAILURE(InitState());
14427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14428 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014429 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 -060014430 VK_IMAGE_TILING_OPTIMAL, 0);
14431 ASSERT_TRUE(image.initialized());
14432
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014433 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130014434 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014435 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014436 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14437 image_create_info.format = VK_FORMAT_UNDEFINED;
14438 image_create_info.extent.width = 32;
14439 image_create_info.extent.height = 32;
14440 image_create_info.extent.depth = 1;
14441 image_create_info.mipLevels = 1;
14442 image_create_info.arrayLayers = 1;
14443 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14444 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14445 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014446
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14448 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014449
14450 VkImage localImage;
14451 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
14452 m_errorMonitor->VerifyFound();
14453
Tony Barbourd6673642016-05-05 14:46:39 -060014454 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014455 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060014456 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
14457 VkFormat format = static_cast<VkFormat>(f);
14458 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014459 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060014460 unsupported = format;
14461 break;
14462 }
14463 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014464
Tony Barbourd6673642016-05-05 14:46:39 -060014465 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060014466 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060014468
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014469 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060014470 m_errorMonitor->VerifyFound();
14471 }
14472}
14473
14474TEST_F(VkLayerTest, ImageLayerViewTests) {
14475 VkResult ret;
14476 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
14477
14478 ASSERT_NO_FATAL_FAILURE(InitState());
14479
14480 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014481 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 -060014482 VK_IMAGE_TILING_OPTIMAL, 0);
14483 ASSERT_TRUE(image.initialized());
14484
14485 VkImageView imgView;
14486 VkImageViewCreateInfo imgViewInfo = {};
14487 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
14488 imgViewInfo.image = image.handle();
14489 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
14490 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14491 imgViewInfo.subresourceRange.layerCount = 1;
14492 imgViewInfo.subresourceRange.baseMipLevel = 0;
14493 imgViewInfo.subresourceRange.levelCount = 1;
14494 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14495
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseMipLevel");
Tony Barbourd6673642016-05-05 14:46:39 -060014497 // View can't have baseMipLevel >= image's mipLevels - Expect
14498 // VIEW_CREATE_ERROR
14499 imgViewInfo.subresourceRange.baseMipLevel = 1;
14500 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14501 m_errorMonitor->VerifyFound();
14502 imgViewInfo.subresourceRange.baseMipLevel = 0;
14503
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014504 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseArrayLayer");
Tony Barbourd6673642016-05-05 14:46:39 -060014505 // View can't have baseArrayLayer >= image's arraySize - Expect
14506 // VIEW_CREATE_ERROR
14507 imgViewInfo.subresourceRange.baseArrayLayer = 1;
14508 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14509 m_errorMonitor->VerifyFound();
14510 imgViewInfo.subresourceRange.baseArrayLayer = 0;
14511
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with 0 in "
14513 "pCreateInfo->subresourceRange."
14514 "levelCount");
Tony Barbourd6673642016-05-05 14:46:39 -060014515 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
14516 imgViewInfo.subresourceRange.levelCount = 0;
14517 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14518 m_errorMonitor->VerifyFound();
14519 imgViewInfo.subresourceRange.levelCount = 1;
14520
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with 0 in "
14522 "pCreateInfo->subresourceRange."
14523 "layerCount");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014524 m_errorMonitor->SetDesiredFailureMsg(
14525 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14526 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060014527 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
14528 imgViewInfo.subresourceRange.layerCount = 0;
14529 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14530 m_errorMonitor->VerifyFound();
14531 imgViewInfo.subresourceRange.layerCount = 1;
14532
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "but both must be color formats");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Formats MUST be IDENTICAL unless "
14535 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
14536 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060014537 // Can't use depth format for view into color image - Expect INVALID_FORMAT
14538 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
14539 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14540 m_errorMonitor->VerifyFound();
14541 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14542
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014543 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Formats MUST be IDENTICAL unless "
14544 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
14545 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060014546 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
14547 // VIEW_CREATE_ERROR
14548 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
14549 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14550 m_errorMonitor->VerifyFound();
14551 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14552
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014553 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "can support ImageViews with "
14554 "differing formats but they must be "
14555 "in the same compatibility class.");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014556 // TODO: Update framework to easily passing mutable flag into ImageObj init
14557 // For now just allowing image for this one test to not have memory bound
14558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14559 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060014560 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
14561 // VIEW_CREATE_ERROR
14562 VkImageCreateInfo mutImgInfo = image.create_info();
14563 VkImage mutImage;
14564 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014565 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060014566 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
14567 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14568 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
14569 ASSERT_VK_SUCCESS(ret);
14570 imgViewInfo.image = mutImage;
14571 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14572 m_errorMonitor->VerifyFound();
14573 imgViewInfo.image = image.handle();
14574 vkDestroyImage(m_device->handle(), mutImage, NULL);
14575}
14576
14577TEST_F(VkLayerTest, MiscImageLayerTests) {
14578
14579 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
14580
14581 ASSERT_NO_FATAL_FAILURE(InitState());
14582
14583 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014584 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 -060014585 VK_IMAGE_TILING_OPTIMAL, 0);
14586 ASSERT_TRUE(image.initialized());
14587
Tony Barbourd6673642016-05-05 14:46:39 -060014588 vk_testing::Buffer buffer;
14589 VkMemoryPropertyFlags reqs = 0;
14590 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
14591 VkBufferImageCopy region = {};
14592 region.bufferRowLength = 128;
14593 region.bufferImageHeight = 128;
14594 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14595 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070014596 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060014597 region.imageExtent.height = 4;
14598 region.imageExtent.width = 4;
14599 region.imageExtent.depth = 1;
14600 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060014601
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070014602 // Image must have offset.z of 0 and extent.depth of 1
14603 // Introduce failure by setting imageExtent.depth to 0
14604 region.imageExtent.depth = 0;
14605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
14606 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14607 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
14608 m_errorMonitor->VerifyFound();
14609
14610 region.imageExtent.depth = 1;
14611
14612 // Image must have offset.z of 0 and extent.depth of 1
14613 // Introduce failure by setting imageOffset.z to 4
14614 region.imageOffset.z = 4;
14615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
14616 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14617 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
14618 m_errorMonitor->VerifyFound();
14619
14620 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014621 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
14622 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
14623 region.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014625 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14626 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014627 m_errorMonitor->VerifyFound();
14628
14629 // BufferOffset must be a multiple of 4
14630 // Introduce failure by setting bufferOffset to a value not divisible by 4
14631 region.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014633 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14634 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014635 m_errorMonitor->VerifyFound();
14636
14637 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
14638 region.bufferOffset = 0;
14639 region.imageExtent.height = 128;
14640 region.imageExtent.width = 128;
14641 // Introduce failure by setting bufferRowLength > 0 but less than width
14642 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014644 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14645 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014646 m_errorMonitor->VerifyFound();
14647
14648 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
14649 region.bufferRowLength = 128;
14650 // Introduce failure by setting bufferRowHeight > 0 but less than height
14651 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014653 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14654 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014655 m_errorMonitor->VerifyFound();
14656
14657 region.bufferImageHeight = 128;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14659 "If the format of srcImage is a depth, stencil, depth stencil or "
14660 "integer-based format then filter must be VK_FILTER_NEAREST");
Tony Barbourd6673642016-05-05 14:46:39 -060014661 // Expect INVALID_FILTER
14662 VkImageObj intImage1(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014663 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 -060014664 VkImageObj intImage2(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014665 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 -060014666 VkImageBlit blitRegion = {};
14667 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14668 blitRegion.srcSubresource.baseArrayLayer = 0;
14669 blitRegion.srcSubresource.layerCount = 1;
14670 blitRegion.srcSubresource.mipLevel = 0;
14671 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14672 blitRegion.dstSubresource.baseArrayLayer = 0;
14673 blitRegion.dstSubresource.layerCount = 1;
14674 blitRegion.dstSubresource.mipLevel = 0;
14675
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014676 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
14677 intImage2.layout(), 16, &blitRegion, VK_FILTER_LINEAR);
Tony Barbourd6673642016-05-05 14:46:39 -060014678 m_errorMonitor->VerifyFound();
14679
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060014680 // Look for NULL-blit warning
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "Offsets specify a zero-volume area.");
14682 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
14683 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060014684 m_errorMonitor->VerifyFound();
14685
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with 0 in ppMemoryBarriers");
Tony Barbourd6673642016-05-05 14:46:39 -060014687 VkImageMemoryBarrier img_barrier;
14688 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
14689 img_barrier.pNext = NULL;
14690 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
14691 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
14692 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14693 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14694 img_barrier.image = image.handle();
14695 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14696 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14697 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14698 img_barrier.subresourceRange.baseArrayLayer = 0;
14699 img_barrier.subresourceRange.baseMipLevel = 0;
14700 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
14701 img_barrier.subresourceRange.layerCount = 0;
14702 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014703 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
14704 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060014705 m_errorMonitor->VerifyFound();
14706 img_barrier.subresourceRange.layerCount = 1;
14707}
14708
14709TEST_F(VkLayerTest, ImageFormatLimits) {
14710
14711 TEST_DESCRIPTION("Exceed the limits of image format ");
14712
Cody Northropc31a84f2016-08-22 10:41:47 -060014713 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060014715 VkImageCreateInfo image_create_info = {};
14716 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14717 image_create_info.pNext = NULL;
14718 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14719 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14720 image_create_info.extent.width = 32;
14721 image_create_info.extent.height = 32;
14722 image_create_info.extent.depth = 1;
14723 image_create_info.mipLevels = 1;
14724 image_create_info.arrayLayers = 1;
14725 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14726 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14727 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14728 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14729 image_create_info.flags = 0;
14730
14731 VkImage nullImg;
14732 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014733 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
14734 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Tony Barbourd6673642016-05-05 14:46:39 -060014735 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
14736 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14737 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14738 m_errorMonitor->VerifyFound();
14739 image_create_info.extent.depth = 1;
14740
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060014742 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
14743 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14744 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14745 m_errorMonitor->VerifyFound();
14746 image_create_info.mipLevels = 1;
14747
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060014749 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
14750 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14751 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14752 m_errorMonitor->VerifyFound();
14753 image_create_info.arrayLayers = 1;
14754
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060014756 int samples = imgFmtProps.sampleCounts >> 1;
14757 image_create_info.samples = (VkSampleCountFlagBits)samples;
14758 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14759 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14760 m_errorMonitor->VerifyFound();
14761 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14762
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pCreateInfo->initialLayout, must be "
14764 "VK_IMAGE_LAYOUT_UNDEFINED or "
14765 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060014766 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14767 // Expect INVALID_LAYOUT
14768 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14769 m_errorMonitor->VerifyFound();
14770 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14771}
14772
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014773TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
14774
14775 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060014776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014777
14778 ASSERT_NO_FATAL_FAILURE(InitState());
14779
14780 VkImageObj src_image(m_device);
14781 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
14782 VkImageObj dst_image(m_device);
14783 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
14784
14785 BeginCommandBuffer();
14786 VkImageCopy copy_region;
14787 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14788 copy_region.srcSubresource.mipLevel = 0;
14789 copy_region.srcSubresource.baseArrayLayer = 0;
14790 copy_region.srcSubresource.layerCount = 0;
14791 copy_region.srcOffset.x = 0;
14792 copy_region.srcOffset.y = 0;
14793 copy_region.srcOffset.z = 0;
14794 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14795 copy_region.dstSubresource.mipLevel = 0;
14796 copy_region.dstSubresource.baseArrayLayer = 0;
14797 copy_region.dstSubresource.layerCount = 0;
14798 copy_region.dstOffset.x = 0;
14799 copy_region.dstOffset.y = 0;
14800 copy_region.dstOffset.z = 0;
14801 copy_region.extent.width = 64;
14802 copy_region.extent.height = 64;
14803 copy_region.extent.depth = 1;
14804 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
14805 &copy_region);
14806 EndCommandBuffer();
14807
14808 m_errorMonitor->VerifyFound();
14809}
14810
14811TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
14812
14813 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060014814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014815
14816 ASSERT_NO_FATAL_FAILURE(InitState());
14817
14818 VkImageObj src_image(m_device);
14819 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
14820 VkImageObj dst_image(m_device);
14821 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
14822
14823 BeginCommandBuffer();
14824 VkImageCopy copy_region;
14825 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14826 copy_region.srcSubresource.mipLevel = 0;
14827 copy_region.srcSubresource.baseArrayLayer = 0;
14828 copy_region.srcSubresource.layerCount = 0;
14829 copy_region.srcOffset.x = 0;
14830 copy_region.srcOffset.y = 0;
14831 copy_region.srcOffset.z = 0;
14832 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14833 copy_region.dstSubresource.mipLevel = 0;
14834 copy_region.dstSubresource.baseArrayLayer = 0;
14835 copy_region.dstSubresource.layerCount = 0;
14836 copy_region.dstOffset.x = 0;
14837 copy_region.dstOffset.y = 0;
14838 copy_region.dstOffset.z = 0;
14839 copy_region.extent.width = 64;
14840 copy_region.extent.height = 64;
14841 copy_region.extent.depth = 1;
14842 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
14843 &copy_region);
14844 EndCommandBuffer();
14845
14846 m_errorMonitor->VerifyFound();
14847}
14848
Karl Schultz6addd812016-02-02 17:17:23 -070014849TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060014850 VkResult err;
14851 bool pass;
14852
14853 // Create color images with different format sizes and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14855 "vkCmdCopyImage called with unmatched source and dest image format sizes");
Karl Schultzbdb75952016-04-19 11:36:49 -060014856
14857 ASSERT_NO_FATAL_FAILURE(InitState());
14858
14859 // Create two images of different types and try to copy between them
14860 VkImage srcImage;
14861 VkImage dstImage;
14862 VkDeviceMemory srcMem;
14863 VkDeviceMemory destMem;
14864 VkMemoryRequirements memReqs;
14865
14866 VkImageCreateInfo image_create_info = {};
14867 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14868 image_create_info.pNext = NULL;
14869 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14870 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14871 image_create_info.extent.width = 32;
14872 image_create_info.extent.height = 32;
14873 image_create_info.extent.depth = 1;
14874 image_create_info.mipLevels = 1;
14875 image_create_info.arrayLayers = 1;
14876 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14877 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14878 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14879 image_create_info.flags = 0;
14880
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014881 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060014882 ASSERT_VK_SUCCESS(err);
14883
14884 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14885 // Introduce failure by creating second image with a different-sized format.
14886 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
14887
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014888 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060014889 ASSERT_VK_SUCCESS(err);
14890
14891 // Allocate memory
14892 VkMemoryAllocateInfo memAlloc = {};
14893 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14894 memAlloc.pNext = NULL;
14895 memAlloc.allocationSize = 0;
14896 memAlloc.memoryTypeIndex = 0;
14897
14898 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
14899 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014900 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060014901 ASSERT_TRUE(pass);
14902 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
14903 ASSERT_VK_SUCCESS(err);
14904
14905 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
14906 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014907 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060014908 ASSERT_TRUE(pass);
14909 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
14910 ASSERT_VK_SUCCESS(err);
14911
14912 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14913 ASSERT_VK_SUCCESS(err);
14914 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
14915 ASSERT_VK_SUCCESS(err);
14916
14917 BeginCommandBuffer();
14918 VkImageCopy copyRegion;
14919 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14920 copyRegion.srcSubresource.mipLevel = 0;
14921 copyRegion.srcSubresource.baseArrayLayer = 0;
14922 copyRegion.srcSubresource.layerCount = 0;
14923 copyRegion.srcOffset.x = 0;
14924 copyRegion.srcOffset.y = 0;
14925 copyRegion.srcOffset.z = 0;
14926 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14927 copyRegion.dstSubresource.mipLevel = 0;
14928 copyRegion.dstSubresource.baseArrayLayer = 0;
14929 copyRegion.dstSubresource.layerCount = 0;
14930 copyRegion.dstOffset.x = 0;
14931 copyRegion.dstOffset.y = 0;
14932 copyRegion.dstOffset.z = 0;
14933 copyRegion.extent.width = 1;
14934 copyRegion.extent.height = 1;
14935 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014936 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Karl Schultzbdb75952016-04-19 11:36:49 -060014937 EndCommandBuffer();
14938
14939 m_errorMonitor->VerifyFound();
14940
14941 vkDestroyImage(m_device->device(), srcImage, NULL);
14942 vkDestroyImage(m_device->device(), dstImage, NULL);
14943 vkFreeMemory(m_device->device(), srcMem, NULL);
14944 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014945}
14946
Karl Schultz6addd812016-02-02 17:17:23 -070014947TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
14948 VkResult err;
14949 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014950
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014951 // Create a color image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14953 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014954
Mike Stroyana3082432015-09-25 13:39:21 -060014955 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014956
14957 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014958 VkImage srcImage;
14959 VkImage dstImage;
14960 VkDeviceMemory srcMem;
14961 VkDeviceMemory destMem;
14962 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014963
14964 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014965 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14966 image_create_info.pNext = NULL;
14967 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14968 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14969 image_create_info.extent.width = 32;
14970 image_create_info.extent.height = 32;
14971 image_create_info.extent.depth = 1;
14972 image_create_info.mipLevels = 1;
14973 image_create_info.arrayLayers = 1;
14974 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14975 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14976 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14977 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014978
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014979 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014980 ASSERT_VK_SUCCESS(err);
14981
Karl Schultzbdb75952016-04-19 11:36:49 -060014982 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14983
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014984 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070014985 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014986 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060014987 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014988
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014989 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014990 ASSERT_VK_SUCCESS(err);
14991
14992 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014993 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014994 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14995 memAlloc.pNext = NULL;
14996 memAlloc.allocationSize = 0;
14997 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014998
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014999 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015000 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015001 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015002 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015003 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015004 ASSERT_VK_SUCCESS(err);
15005
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015006 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015007 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015008 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015009 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015010 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015011 ASSERT_VK_SUCCESS(err);
15012
15013 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15014 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015015 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015016 ASSERT_VK_SUCCESS(err);
15017
15018 BeginCommandBuffer();
15019 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015020 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015021 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015022 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015023 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015024 copyRegion.srcOffset.x = 0;
15025 copyRegion.srcOffset.y = 0;
15026 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015027 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015028 copyRegion.dstSubresource.mipLevel = 0;
15029 copyRegion.dstSubresource.baseArrayLayer = 0;
15030 copyRegion.dstSubresource.layerCount = 0;
15031 copyRegion.dstOffset.x = 0;
15032 copyRegion.dstOffset.y = 0;
15033 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015034 copyRegion.extent.width = 1;
15035 copyRegion.extent.height = 1;
15036 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015037 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015038 EndCommandBuffer();
15039
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015040 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015041
Chia-I Wuf7458c52015-10-26 21:10:41 +080015042 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015043 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015044 vkFreeMemory(m_device->device(), srcMem, NULL);
15045 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015046}
15047
Karl Schultz6addd812016-02-02 17:17:23 -070015048TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
15049 VkResult err;
15050 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015051
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15053 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015054
Mike Stroyana3082432015-09-25 13:39:21 -060015055 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015056
15057 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015058 VkImage srcImage;
15059 VkImage dstImage;
15060 VkDeviceMemory srcMem;
15061 VkDeviceMemory destMem;
15062 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015063
15064 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015065 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15066 image_create_info.pNext = NULL;
15067 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15068 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15069 image_create_info.extent.width = 32;
15070 image_create_info.extent.height = 1;
15071 image_create_info.extent.depth = 1;
15072 image_create_info.mipLevels = 1;
15073 image_create_info.arrayLayers = 1;
15074 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15075 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15076 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15077 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015078
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015079 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015080 ASSERT_VK_SUCCESS(err);
15081
Karl Schultz6addd812016-02-02 17:17:23 -070015082 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015083
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015084 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015085 ASSERT_VK_SUCCESS(err);
15086
15087 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015088 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015089 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15090 memAlloc.pNext = NULL;
15091 memAlloc.allocationSize = 0;
15092 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015093
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015094 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015095 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015096 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015097 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015098 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015099 ASSERT_VK_SUCCESS(err);
15100
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015101 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015102 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015103 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015104 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015105 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015106 ASSERT_VK_SUCCESS(err);
15107
15108 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15109 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015110 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015111 ASSERT_VK_SUCCESS(err);
15112
15113 BeginCommandBuffer();
15114 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015115 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15116 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015117 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015118 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015119 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015120 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015121 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015122 resolveRegion.srcOffset.x = 0;
15123 resolveRegion.srcOffset.y = 0;
15124 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015125 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015126 resolveRegion.dstSubresource.mipLevel = 0;
15127 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015128 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015129 resolveRegion.dstOffset.x = 0;
15130 resolveRegion.dstOffset.y = 0;
15131 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015132 resolveRegion.extent.width = 1;
15133 resolveRegion.extent.height = 1;
15134 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015135 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015136 EndCommandBuffer();
15137
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015138 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015139
Chia-I Wuf7458c52015-10-26 21:10:41 +080015140 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015141 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015142 vkFreeMemory(m_device->device(), srcMem, NULL);
15143 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015144}
15145
Karl Schultz6addd812016-02-02 17:17:23 -070015146TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
15147 VkResult err;
15148 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015149
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015150 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15151 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015152
Mike Stroyana3082432015-09-25 13:39:21 -060015153 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015154
Chris Forbesa7530692016-05-08 12:35:39 +120015155 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015156 VkImage srcImage;
15157 VkImage dstImage;
15158 VkDeviceMemory srcMem;
15159 VkDeviceMemory destMem;
15160 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015161
15162 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015163 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15164 image_create_info.pNext = NULL;
15165 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15166 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15167 image_create_info.extent.width = 32;
15168 image_create_info.extent.height = 1;
15169 image_create_info.extent.depth = 1;
15170 image_create_info.mipLevels = 1;
15171 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120015172 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015173 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15174 // Note: Some implementations expect color attachment usage for any
15175 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015176 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015177 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015178
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015179 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015180 ASSERT_VK_SUCCESS(err);
15181
Karl Schultz6addd812016-02-02 17:17:23 -070015182 // Note: Some implementations expect color attachment usage for any
15183 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015184 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015185
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015186 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015187 ASSERT_VK_SUCCESS(err);
15188
15189 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015190 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015191 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15192 memAlloc.pNext = NULL;
15193 memAlloc.allocationSize = 0;
15194 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015195
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015196 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015197 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015198 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015199 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015200 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015201 ASSERT_VK_SUCCESS(err);
15202
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015203 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015204 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015205 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015206 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015207 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015208 ASSERT_VK_SUCCESS(err);
15209
15210 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15211 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015212 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015213 ASSERT_VK_SUCCESS(err);
15214
15215 BeginCommandBuffer();
15216 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015217 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15218 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015219 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015220 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015221 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015222 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015223 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015224 resolveRegion.srcOffset.x = 0;
15225 resolveRegion.srcOffset.y = 0;
15226 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015227 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015228 resolveRegion.dstSubresource.mipLevel = 0;
15229 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015230 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015231 resolveRegion.dstOffset.x = 0;
15232 resolveRegion.dstOffset.y = 0;
15233 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015234 resolveRegion.extent.width = 1;
15235 resolveRegion.extent.height = 1;
15236 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015237 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015238 EndCommandBuffer();
15239
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015240 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015241
Chia-I Wuf7458c52015-10-26 21:10:41 +080015242 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015243 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015244 vkFreeMemory(m_device->device(), srcMem, NULL);
15245 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015246}
15247
Karl Schultz6addd812016-02-02 17:17:23 -070015248TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
15249 VkResult err;
15250 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015251
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15253 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015254
Mike Stroyana3082432015-09-25 13:39:21 -060015255 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015256
15257 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015258 VkImage srcImage;
15259 VkImage dstImage;
15260 VkDeviceMemory srcMem;
15261 VkDeviceMemory destMem;
15262 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015263
15264 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015265 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15266 image_create_info.pNext = NULL;
15267 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15268 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15269 image_create_info.extent.width = 32;
15270 image_create_info.extent.height = 1;
15271 image_create_info.extent.depth = 1;
15272 image_create_info.mipLevels = 1;
15273 image_create_info.arrayLayers = 1;
15274 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15275 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15276 // Note: Some implementations expect color attachment usage for any
15277 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015278 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015279 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015280
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015281 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015282 ASSERT_VK_SUCCESS(err);
15283
Karl Schultz6addd812016-02-02 17:17:23 -070015284 // Set format to something other than source image
15285 image_create_info.format = VK_FORMAT_R32_SFLOAT;
15286 // Note: Some implementations expect color attachment usage for any
15287 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015288 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015289 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015290
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015291 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015292 ASSERT_VK_SUCCESS(err);
15293
15294 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015295 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015296 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15297 memAlloc.pNext = NULL;
15298 memAlloc.allocationSize = 0;
15299 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015300
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015301 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015302 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015303 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015304 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015305 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015306 ASSERT_VK_SUCCESS(err);
15307
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015308 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015309 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015310 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015311 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015312 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015313 ASSERT_VK_SUCCESS(err);
15314
15315 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15316 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015317 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015318 ASSERT_VK_SUCCESS(err);
15319
15320 BeginCommandBuffer();
15321 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015322 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15323 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015324 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015325 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015326 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015327 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015328 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015329 resolveRegion.srcOffset.x = 0;
15330 resolveRegion.srcOffset.y = 0;
15331 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015332 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015333 resolveRegion.dstSubresource.mipLevel = 0;
15334 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015335 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015336 resolveRegion.dstOffset.x = 0;
15337 resolveRegion.dstOffset.y = 0;
15338 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015339 resolveRegion.extent.width = 1;
15340 resolveRegion.extent.height = 1;
15341 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015342 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015343 EndCommandBuffer();
15344
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015345 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015346
Chia-I Wuf7458c52015-10-26 21:10:41 +080015347 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015348 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015349 vkFreeMemory(m_device->device(), srcMem, NULL);
15350 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015351}
15352
Karl Schultz6addd812016-02-02 17:17:23 -070015353TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
15354 VkResult err;
15355 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015356
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015357 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15358 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015359
Mike Stroyana3082432015-09-25 13:39:21 -060015360 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015361
15362 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015363 VkImage srcImage;
15364 VkImage dstImage;
15365 VkDeviceMemory srcMem;
15366 VkDeviceMemory destMem;
15367 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015368
15369 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015370 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15371 image_create_info.pNext = NULL;
15372 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15373 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15374 image_create_info.extent.width = 32;
15375 image_create_info.extent.height = 1;
15376 image_create_info.extent.depth = 1;
15377 image_create_info.mipLevels = 1;
15378 image_create_info.arrayLayers = 1;
15379 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15380 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15381 // Note: Some implementations expect color attachment usage for any
15382 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015383 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015384 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015385
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015386 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015387 ASSERT_VK_SUCCESS(err);
15388
Karl Schultz6addd812016-02-02 17:17:23 -070015389 image_create_info.imageType = VK_IMAGE_TYPE_1D;
15390 // Note: Some implementations expect color attachment usage for any
15391 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015392 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015393 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015394
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015395 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015396 ASSERT_VK_SUCCESS(err);
15397
15398 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015399 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015400 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15401 memAlloc.pNext = NULL;
15402 memAlloc.allocationSize = 0;
15403 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015404
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015405 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015406 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015407 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015408 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015409 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015410 ASSERT_VK_SUCCESS(err);
15411
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015412 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015413 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015414 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015415 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015416 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015417 ASSERT_VK_SUCCESS(err);
15418
15419 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15420 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015421 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015422 ASSERT_VK_SUCCESS(err);
15423
15424 BeginCommandBuffer();
15425 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015426 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15427 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015428 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015429 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015430 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015431 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015432 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015433 resolveRegion.srcOffset.x = 0;
15434 resolveRegion.srcOffset.y = 0;
15435 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015436 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015437 resolveRegion.dstSubresource.mipLevel = 0;
15438 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015439 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015440 resolveRegion.dstOffset.x = 0;
15441 resolveRegion.dstOffset.y = 0;
15442 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015443 resolveRegion.extent.width = 1;
15444 resolveRegion.extent.height = 1;
15445 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015446 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015447 EndCommandBuffer();
15448
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015449 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015450
Chia-I Wuf7458c52015-10-26 21:10:41 +080015451 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015452 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015453 vkFreeMemory(m_device->device(), srcMem, NULL);
15454 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015455}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015456
Karl Schultz6addd812016-02-02 17:17:23 -070015457TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015458 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070015459 // to using a DS format, then cause it to hit error due to COLOR_BIT not
15460 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015461 // The image format check comes 2nd in validation so we trigger it first,
15462 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070015463 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015464
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15466 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015467
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015468 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015469
Chia-I Wu1b99bb22015-10-27 19:25:11 +080015470 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015471 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15472 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015473
15474 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015475 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
15476 ds_pool_ci.pNext = NULL;
15477 ds_pool_ci.maxSets = 1;
15478 ds_pool_ci.poolSizeCount = 1;
15479 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015480
15481 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015482 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015483 ASSERT_VK_SUCCESS(err);
15484
15485 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015486 dsl_binding.binding = 0;
15487 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15488 dsl_binding.descriptorCount = 1;
15489 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
15490 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015491
15492 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015493 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
15494 ds_layout_ci.pNext = NULL;
15495 ds_layout_ci.bindingCount = 1;
15496 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015497 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015498 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015499 ASSERT_VK_SUCCESS(err);
15500
15501 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015502 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080015503 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070015504 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015505 alloc_info.descriptorPool = ds_pool;
15506 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015507 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015508 ASSERT_VK_SUCCESS(err);
15509
Karl Schultz6addd812016-02-02 17:17:23 -070015510 VkImage image_bad;
15511 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015512 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060015513 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015514 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070015515 const int32_t tex_width = 32;
15516 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015517
15518 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015519 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15520 image_create_info.pNext = NULL;
15521 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15522 image_create_info.format = tex_format_bad;
15523 image_create_info.extent.width = tex_width;
15524 image_create_info.extent.height = tex_height;
15525 image_create_info.extent.depth = 1;
15526 image_create_info.mipLevels = 1;
15527 image_create_info.arrayLayers = 1;
15528 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15529 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015530 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015531 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015532
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015533 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015534 ASSERT_VK_SUCCESS(err);
15535 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015536 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15537 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015538 ASSERT_VK_SUCCESS(err);
15539
15540 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015541 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015542 image_view_create_info.image = image_bad;
15543 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15544 image_view_create_info.format = tex_format_bad;
15545 image_view_create_info.subresourceRange.baseArrayLayer = 0;
15546 image_view_create_info.subresourceRange.baseMipLevel = 0;
15547 image_view_create_info.subresourceRange.layerCount = 1;
15548 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015549 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015550
15551 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015552 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015553
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015554 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015555
Chia-I Wuf7458c52015-10-26 21:10:41 +080015556 vkDestroyImage(m_device->device(), image_bad, NULL);
15557 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015558 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
15559 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015560}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015561
15562TEST_F(VkLayerTest, ClearImageErrors) {
15563 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
15564 "ClearDepthStencilImage with a color image.");
15565
15566 ASSERT_NO_FATAL_FAILURE(InitState());
15567 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15568
15569 // Renderpass is started here so end it as Clear cmds can't be in renderpass
15570 BeginCommandBuffer();
15571 m_commandBuffer->EndRenderPass();
15572
15573 // Color image
15574 VkClearColorValue clear_color;
15575 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
15576 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
15577 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
15578 const int32_t img_width = 32;
15579 const int32_t img_height = 32;
15580 VkImageCreateInfo image_create_info = {};
15581 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15582 image_create_info.pNext = NULL;
15583 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15584 image_create_info.format = color_format;
15585 image_create_info.extent.width = img_width;
15586 image_create_info.extent.height = img_height;
15587 image_create_info.extent.depth = 1;
15588 image_create_info.mipLevels = 1;
15589 image_create_info.arrayLayers = 1;
15590 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15591 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15592 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15593
15594 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015595 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015596
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015597 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015598
15599 // Depth/Stencil image
15600 VkClearDepthStencilValue clear_value = {0};
15601 reqs = 0; // don't need HOST_VISIBLE DS image
15602 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
15603 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
15604 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
15605 ds_image_create_info.extent.width = 64;
15606 ds_image_create_info.extent.height = 64;
15607 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15608 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
15609
15610 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015611 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015612
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015613 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 -060015614
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015616
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015617 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015618 &color_range);
15619
15620 m_errorMonitor->VerifyFound();
15621
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with "
15623 "image created without "
15624 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060015625
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015626 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060015627 &color_range);
15628
15629 m_errorMonitor->VerifyFound();
15630
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015631 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15633 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015634
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015635 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(),
15636 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015637
15638 m_errorMonitor->VerifyFound();
15639}
Tobin Ehliscde08892015-09-22 10:11:37 -060015640#endif // IMAGE_TESTS
15641
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060015642
15643// WSI Enabled Tests
15644//
Chris Forbes09368e42016-10-13 11:59:22 +130015645#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060015646TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
15647
15648#if defined(VK_USE_PLATFORM_XCB_KHR)
15649 VkSurfaceKHR surface = VK_NULL_HANDLE;
15650
15651 VkResult err;
15652 bool pass;
15653 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
15654 VkSwapchainCreateInfoKHR swapchain_create_info = {};
15655 // uint32_t swapchain_image_count = 0;
15656 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
15657 // uint32_t image_index = 0;
15658 // VkPresentInfoKHR present_info = {};
15659
15660 ASSERT_NO_FATAL_FAILURE(InitState());
15661
15662 // Use the create function from one of the VK_KHR_*_surface extension in
15663 // order to create a surface, testing all known errors in the process,
15664 // before successfully creating a surface:
15665 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
15666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
15667 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
15668 pass = (err != VK_SUCCESS);
15669 ASSERT_TRUE(pass);
15670 m_errorMonitor->VerifyFound();
15671
15672 // Next, try to create a surface with the wrong
15673 // VkXcbSurfaceCreateInfoKHR::sType:
15674 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
15675 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
15676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
15677 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
15678 pass = (err != VK_SUCCESS);
15679 ASSERT_TRUE(pass);
15680 m_errorMonitor->VerifyFound();
15681
15682 // Create a native window, and then correctly create a surface:
15683 xcb_connection_t *connection;
15684 xcb_screen_t *screen;
15685 xcb_window_t xcb_window;
15686 xcb_intern_atom_reply_t *atom_wm_delete_window;
15687
15688 const xcb_setup_t *setup;
15689 xcb_screen_iterator_t iter;
15690 int scr;
15691 uint32_t value_mask, value_list[32];
15692 int width = 1;
15693 int height = 1;
15694
15695 connection = xcb_connect(NULL, &scr);
15696 ASSERT_TRUE(connection != NULL);
15697 setup = xcb_get_setup(connection);
15698 iter = xcb_setup_roots_iterator(setup);
15699 while (scr-- > 0)
15700 xcb_screen_next(&iter);
15701 screen = iter.data;
15702
15703 xcb_window = xcb_generate_id(connection);
15704
15705 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
15706 value_list[0] = screen->black_pixel;
15707 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
15708
15709 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
15710 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
15711
15712 /* Magic code that will send notification when window is destroyed */
15713 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
15714 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
15715
15716 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
15717 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
15718 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
15719 free(reply);
15720
15721 xcb_map_window(connection, xcb_window);
15722
15723 // Force the x/y coordinates to 100,100 results are identical in consecutive
15724 // runs
15725 const uint32_t coords[] = { 100, 100 };
15726 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
15727
15728 // Finally, try to correctly create a surface:
15729 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
15730 xcb_create_info.pNext = NULL;
15731 xcb_create_info.flags = 0;
15732 xcb_create_info.connection = connection;
15733 xcb_create_info.window = xcb_window;
15734 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
15735 pass = (err == VK_SUCCESS);
15736 ASSERT_TRUE(pass);
15737
15738 // Check if surface supports presentation:
15739
15740 // 1st, do so without having queried the queue families:
15741 VkBool32 supported = false;
15742 // TODO: Get the following error to come out:
15743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15744 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
15745 "function");
15746 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
15747 pass = (err != VK_SUCCESS);
15748 // ASSERT_TRUE(pass);
15749 // m_errorMonitor->VerifyFound();
15750
15751 // Next, query a queue family index that's too large:
15752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
15753 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
15754 pass = (err != VK_SUCCESS);
15755 ASSERT_TRUE(pass);
15756 m_errorMonitor->VerifyFound();
15757
15758 // Finally, do so correctly:
15759 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
15760 // SUPPORTED
15761 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
15762 pass = (err == VK_SUCCESS);
15763 ASSERT_TRUE(pass);
15764
15765 // Before proceeding, try to create a swapchain without having called
15766 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
15767 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
15768 swapchain_create_info.pNext = NULL;
15769 swapchain_create_info.flags = 0;
15770 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15771 swapchain_create_info.surface = surface;
15772 swapchain_create_info.imageArrayLayers = 1;
15773 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
15774 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
15775 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15776 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
15777 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15778 pass = (err != VK_SUCCESS);
15779 ASSERT_TRUE(pass);
15780 m_errorMonitor->VerifyFound();
15781
15782 // Get the surface capabilities:
15783 VkSurfaceCapabilitiesKHR surface_capabilities;
15784
15785 // Do so correctly (only error logged by this entrypoint is if the
15786 // extension isn't enabled):
15787 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
15788 pass = (err == VK_SUCCESS);
15789 ASSERT_TRUE(pass);
15790
15791 // Get the surface formats:
15792 uint32_t surface_format_count;
15793
15794 // First, try without a pointer to surface_format_count:
15795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
15796 "specified as NULL");
15797 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
15798 pass = (err == VK_SUCCESS);
15799 ASSERT_TRUE(pass);
15800 m_errorMonitor->VerifyFound();
15801
15802 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
15803 // correctly done a 1st try (to get the count):
15804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
15805 surface_format_count = 0;
15806 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
15807 pass = (err == VK_SUCCESS);
15808 ASSERT_TRUE(pass);
15809 m_errorMonitor->VerifyFound();
15810
15811 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
15812 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
15813 pass = (err == VK_SUCCESS);
15814 ASSERT_TRUE(pass);
15815
15816 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
15817 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
15818
15819 // Next, do a 2nd try with surface_format_count being set too high:
15820 surface_format_count += 5;
15821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
15822 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
15823 pass = (err == VK_SUCCESS);
15824 ASSERT_TRUE(pass);
15825 m_errorMonitor->VerifyFound();
15826
15827 // Finally, do a correct 1st and 2nd try:
15828 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
15829 pass = (err == VK_SUCCESS);
15830 ASSERT_TRUE(pass);
15831 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
15832 pass = (err == VK_SUCCESS);
15833 ASSERT_TRUE(pass);
15834
15835 // Get the surface present modes:
15836 uint32_t surface_present_mode_count;
15837
15838 // First, try without a pointer to surface_format_count:
15839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
15840 "specified as NULL");
15841
15842 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
15843 pass = (err == VK_SUCCESS);
15844 ASSERT_TRUE(pass);
15845 m_errorMonitor->VerifyFound();
15846
15847 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
15848 // correctly done a 1st try (to get the count):
15849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
15850 surface_present_mode_count = 0;
15851 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
15852 (VkPresentModeKHR *)&surface_present_mode_count);
15853 pass = (err == VK_SUCCESS);
15854 ASSERT_TRUE(pass);
15855 m_errorMonitor->VerifyFound();
15856
15857 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
15858 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
15859 pass = (err == VK_SUCCESS);
15860 ASSERT_TRUE(pass);
15861
15862 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
15863 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
15864
15865 // Next, do a 2nd try with surface_format_count being set too high:
15866 surface_present_mode_count += 5;
15867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
15868 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
15869 pass = (err == VK_SUCCESS);
15870 ASSERT_TRUE(pass);
15871 m_errorMonitor->VerifyFound();
15872
15873 // Finally, do a correct 1st and 2nd try:
15874 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
15875 pass = (err == VK_SUCCESS);
15876 ASSERT_TRUE(pass);
15877 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
15878 pass = (err == VK_SUCCESS);
15879 ASSERT_TRUE(pass);
15880
15881 // Create a swapchain:
15882
15883 // First, try without a pointer to swapchain_create_info:
15884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
15885 "specified as NULL");
15886
15887 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
15888 pass = (err != VK_SUCCESS);
15889 ASSERT_TRUE(pass);
15890 m_errorMonitor->VerifyFound();
15891
15892 // Next, call with a non-NULL swapchain_create_info, that has the wrong
15893 // sType:
15894 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
15895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
15896
15897 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15898 pass = (err != VK_SUCCESS);
15899 ASSERT_TRUE(pass);
15900 m_errorMonitor->VerifyFound();
15901
15902 // Next, call with a NULL swapchain pointer:
15903 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
15904 swapchain_create_info.pNext = NULL;
15905 swapchain_create_info.flags = 0;
15906 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
15907 "specified as NULL");
15908
15909 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
15910 pass = (err != VK_SUCCESS);
15911 ASSERT_TRUE(pass);
15912 m_errorMonitor->VerifyFound();
15913
15914 // TODO: Enhance swapchain layer so that
15915 // swapchain_create_info.queueFamilyIndexCount is checked against something?
15916
15917 // Next, call with a queue family index that's too large:
15918 uint32_t queueFamilyIndex[2] = { 100000, 0 };
15919 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
15920 swapchain_create_info.queueFamilyIndexCount = 2;
15921 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
15922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
15923 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15924 pass = (err != VK_SUCCESS);
15925 ASSERT_TRUE(pass);
15926 m_errorMonitor->VerifyFound();
15927
15928 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
15929 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
15930 swapchain_create_info.queueFamilyIndexCount = 1;
15931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15932 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
15933 "pCreateInfo->pQueueFamilyIndices).");
15934 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15935 pass = (err != VK_SUCCESS);
15936 ASSERT_TRUE(pass);
15937 m_errorMonitor->VerifyFound();
15938
15939 // Next, call with an invalid imageSharingMode:
15940 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
15941 swapchain_create_info.queueFamilyIndexCount = 1;
15942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15943 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
15944 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15945 pass = (err != VK_SUCCESS);
15946 ASSERT_TRUE(pass);
15947 m_errorMonitor->VerifyFound();
15948 // Fix for the future:
15949 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
15950 // SUPPORTED
15951 swapchain_create_info.queueFamilyIndexCount = 0;
15952 queueFamilyIndex[0] = 0;
15953 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
15954
15955 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
15956 // Get the images from a swapchain:
15957 // Acquire an image from a swapchain:
15958 // Present an image to a swapchain:
15959 // Destroy the swapchain:
15960
15961 // TODOs:
15962 //
15963 // - Try destroying the device without first destroying the swapchain
15964 //
15965 // - Try destroying the device without first destroying the surface
15966 //
15967 // - Try destroying the surface without first destroying the swapchain
15968
15969 // Destroy the surface:
15970 vkDestroySurfaceKHR(instance(), surface, NULL);
15971
15972 // Tear down the window:
15973 xcb_destroy_window(connection, xcb_window);
15974 xcb_disconnect(connection);
15975
15976#else // VK_USE_PLATFORM_XCB_KHR
15977 return;
15978#endif // VK_USE_PLATFORM_XCB_KHR
15979}
Chris Forbes09368e42016-10-13 11:59:22 +130015980#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060015981
15982//
15983// POSITIVE VALIDATION TESTS
15984//
15985// These tests do not expect to encounter ANY validation errors pass only if this is true
15986
Tobin Ehlise0006882016-11-03 10:14:28 -060015987TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
15988 TEST_DESCRIPTION("Perform an image layout transition in a secondary command buffer followed "
15989 "by a transition in the primary.");
15990 VkResult err;
15991 m_errorMonitor->ExpectSuccess();
15992 ASSERT_NO_FATAL_FAILURE(InitState());
15993 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15994 // Allocate a secondary and primary cmd buffer
15995 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
15996 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
15997 command_buffer_allocate_info.commandPool = m_commandPool;
15998 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
15999 command_buffer_allocate_info.commandBufferCount = 1;
16000
16001 VkCommandBuffer secondary_command_buffer;
16002 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
16003 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
16004 VkCommandBuffer primary_command_buffer;
16005 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
16006 VkCommandBufferBeginInfo command_buffer_begin_info = {};
16007 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
16008 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
16009 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
16010 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
16011 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
16012
16013 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
16014 ASSERT_VK_SUCCESS(err);
16015 VkImageObj image(m_device);
16016 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
16017 ASSERT_TRUE(image.initialized());
16018 VkImageMemoryBarrier img_barrier = {};
16019 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16020 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16021 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16022 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16023 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16024 img_barrier.image = image.handle();
16025 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16026 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16027 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16028 img_barrier.subresourceRange.baseArrayLayer = 0;
16029 img_barrier.subresourceRange.baseMipLevel = 0;
16030 img_barrier.subresourceRange.layerCount = 1;
16031 img_barrier.subresourceRange.levelCount = 1;
16032 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
16033 0, nullptr, 1, &img_barrier);
16034 err = vkEndCommandBuffer(secondary_command_buffer);
16035 ASSERT_VK_SUCCESS(err);
16036
16037 // Now update primary cmd buffer to execute secondary and transitions image
16038 command_buffer_begin_info.pInheritanceInfo = nullptr;
16039 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
16040 ASSERT_VK_SUCCESS(err);
16041 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
16042 VkImageMemoryBarrier img_barrier2 = {};
16043 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16044 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16045 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16046 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16047 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16048 img_barrier2.image = image.handle();
16049 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16050 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16051 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16052 img_barrier2.subresourceRange.baseArrayLayer = 0;
16053 img_barrier2.subresourceRange.baseMipLevel = 0;
16054 img_barrier2.subresourceRange.layerCount = 1;
16055 img_barrier2.subresourceRange.levelCount = 1;
16056 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
16057 nullptr, 1, &img_barrier2);
16058 err = vkEndCommandBuffer(primary_command_buffer);
16059 ASSERT_VK_SUCCESS(err);
16060 VkSubmitInfo submit_info = {};
16061 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
16062 submit_info.commandBufferCount = 1;
16063 submit_info.pCommandBuffers = &primary_command_buffer;
16064 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
16065 ASSERT_VK_SUCCESS(err);
16066 m_errorMonitor->VerifyNotFound();
16067 err = vkDeviceWaitIdle(m_device->device());
16068 ASSERT_VK_SUCCESS(err);
16069 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &secondary_command_buffer);
16070 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &primary_command_buffer);
16071}
16072
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016073// This is a positive test. No failures are expected.
16074TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
16075 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSets validation code "
16076 "is ignoring VkWriteDescriptorSet members that are not "
16077 "related to the descriptor type specified by "
16078 "VkWriteDescriptorSet::descriptorType. Correct "
16079 "validation behavior will result in the test running to "
16080 "completion without validation errors.");
16081
16082 const uintptr_t invalid_ptr = 0xcdcdcdcd;
16083
16084 ASSERT_NO_FATAL_FAILURE(InitState());
16085
16086 // Image Case
16087 {
16088 m_errorMonitor->ExpectSuccess();
16089
16090 VkImage image;
16091 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16092 const int32_t tex_width = 32;
16093 const int32_t tex_height = 32;
16094 VkImageCreateInfo image_create_info = {};
16095 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16096 image_create_info.pNext = NULL;
16097 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16098 image_create_info.format = tex_format;
16099 image_create_info.extent.width = tex_width;
16100 image_create_info.extent.height = tex_height;
16101 image_create_info.extent.depth = 1;
16102 image_create_info.mipLevels = 1;
16103 image_create_info.arrayLayers = 1;
16104 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16105 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16106 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16107 image_create_info.flags = 0;
16108 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16109 ASSERT_VK_SUCCESS(err);
16110
16111 VkMemoryRequirements memory_reqs;
16112 VkDeviceMemory image_memory;
16113 bool pass;
16114 VkMemoryAllocateInfo memory_info = {};
16115 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16116 memory_info.pNext = NULL;
16117 memory_info.allocationSize = 0;
16118 memory_info.memoryTypeIndex = 0;
16119 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
16120 memory_info.allocationSize = memory_reqs.size;
16121 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16122 ASSERT_TRUE(pass);
16123 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
16124 ASSERT_VK_SUCCESS(err);
16125 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
16126 ASSERT_VK_SUCCESS(err);
16127
16128 VkImageViewCreateInfo image_view_create_info = {};
16129 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16130 image_view_create_info.image = image;
16131 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16132 image_view_create_info.format = tex_format;
16133 image_view_create_info.subresourceRange.layerCount = 1;
16134 image_view_create_info.subresourceRange.baseMipLevel = 0;
16135 image_view_create_info.subresourceRange.levelCount = 1;
16136 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16137
16138 VkImageView view;
16139 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
16140 ASSERT_VK_SUCCESS(err);
16141
16142 VkDescriptorPoolSize ds_type_count = {};
16143 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16144 ds_type_count.descriptorCount = 1;
16145
16146 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16147 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16148 ds_pool_ci.pNext = NULL;
16149 ds_pool_ci.maxSets = 1;
16150 ds_pool_ci.poolSizeCount = 1;
16151 ds_pool_ci.pPoolSizes = &ds_type_count;
16152
16153 VkDescriptorPool ds_pool;
16154 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16155 ASSERT_VK_SUCCESS(err);
16156
16157 VkDescriptorSetLayoutBinding dsl_binding = {};
16158 dsl_binding.binding = 0;
16159 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16160 dsl_binding.descriptorCount = 1;
16161 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16162 dsl_binding.pImmutableSamplers = NULL;
16163
16164 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16165 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16166 ds_layout_ci.pNext = NULL;
16167 ds_layout_ci.bindingCount = 1;
16168 ds_layout_ci.pBindings = &dsl_binding;
16169 VkDescriptorSetLayout ds_layout;
16170 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16171 ASSERT_VK_SUCCESS(err);
16172
16173 VkDescriptorSet descriptor_set;
16174 VkDescriptorSetAllocateInfo alloc_info = {};
16175 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16176 alloc_info.descriptorSetCount = 1;
16177 alloc_info.descriptorPool = ds_pool;
16178 alloc_info.pSetLayouts = &ds_layout;
16179 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16180 ASSERT_VK_SUCCESS(err);
16181
16182 VkDescriptorImageInfo image_info = {};
16183 image_info.imageView = view;
16184 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
16185
16186 VkWriteDescriptorSet descriptor_write;
16187 memset(&descriptor_write, 0, sizeof(descriptor_write));
16188 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16189 descriptor_write.dstSet = descriptor_set;
16190 descriptor_write.dstBinding = 0;
16191 descriptor_write.descriptorCount = 1;
16192 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16193 descriptor_write.pImageInfo = &image_info;
16194
16195 // Set pBufferInfo and pTexelBufferView to invalid values, which should
16196 // be
16197 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
16198 // This will most likely produce a crash if the parameter_validation
16199 // layer
16200 // does not correctly ignore pBufferInfo.
16201 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
16202 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
16203
16204 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16205
16206 m_errorMonitor->VerifyNotFound();
16207
16208 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16209 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16210 vkDestroyImageView(m_device->device(), view, NULL);
16211 vkDestroyImage(m_device->device(), image, NULL);
16212 vkFreeMemory(m_device->device(), image_memory, NULL);
16213 }
16214
16215 // Buffer Case
16216 {
16217 m_errorMonitor->ExpectSuccess();
16218
16219 VkBuffer buffer;
16220 uint32_t queue_family_index = 0;
16221 VkBufferCreateInfo buffer_create_info = {};
16222 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16223 buffer_create_info.size = 1024;
16224 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16225 buffer_create_info.queueFamilyIndexCount = 1;
16226 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
16227
16228 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
16229 ASSERT_VK_SUCCESS(err);
16230
16231 VkMemoryRequirements memory_reqs;
16232 VkDeviceMemory buffer_memory;
16233 bool pass;
16234 VkMemoryAllocateInfo memory_info = {};
16235 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16236 memory_info.pNext = NULL;
16237 memory_info.allocationSize = 0;
16238 memory_info.memoryTypeIndex = 0;
16239
16240 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
16241 memory_info.allocationSize = memory_reqs.size;
16242 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16243 ASSERT_TRUE(pass);
16244
16245 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
16246 ASSERT_VK_SUCCESS(err);
16247 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
16248 ASSERT_VK_SUCCESS(err);
16249
16250 VkDescriptorPoolSize ds_type_count = {};
16251 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16252 ds_type_count.descriptorCount = 1;
16253
16254 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16255 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16256 ds_pool_ci.pNext = NULL;
16257 ds_pool_ci.maxSets = 1;
16258 ds_pool_ci.poolSizeCount = 1;
16259 ds_pool_ci.pPoolSizes = &ds_type_count;
16260
16261 VkDescriptorPool ds_pool;
16262 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16263 ASSERT_VK_SUCCESS(err);
16264
16265 VkDescriptorSetLayoutBinding dsl_binding = {};
16266 dsl_binding.binding = 0;
16267 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16268 dsl_binding.descriptorCount = 1;
16269 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16270 dsl_binding.pImmutableSamplers = NULL;
16271
16272 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16273 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16274 ds_layout_ci.pNext = NULL;
16275 ds_layout_ci.bindingCount = 1;
16276 ds_layout_ci.pBindings = &dsl_binding;
16277 VkDescriptorSetLayout ds_layout;
16278 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16279 ASSERT_VK_SUCCESS(err);
16280
16281 VkDescriptorSet descriptor_set;
16282 VkDescriptorSetAllocateInfo alloc_info = {};
16283 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16284 alloc_info.descriptorSetCount = 1;
16285 alloc_info.descriptorPool = ds_pool;
16286 alloc_info.pSetLayouts = &ds_layout;
16287 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16288 ASSERT_VK_SUCCESS(err);
16289
16290 VkDescriptorBufferInfo buffer_info = {};
16291 buffer_info.buffer = buffer;
16292 buffer_info.offset = 0;
16293 buffer_info.range = 1024;
16294
16295 VkWriteDescriptorSet descriptor_write;
16296 memset(&descriptor_write, 0, sizeof(descriptor_write));
16297 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16298 descriptor_write.dstSet = descriptor_set;
16299 descriptor_write.dstBinding = 0;
16300 descriptor_write.descriptorCount = 1;
16301 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16302 descriptor_write.pBufferInfo = &buffer_info;
16303
16304 // Set pImageInfo and pTexelBufferView to invalid values, which should
16305 // be
16306 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
16307 // This will most likely produce a crash if the parameter_validation
16308 // layer
16309 // does not correctly ignore pImageInfo.
16310 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
16311 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
16312
16313 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16314
16315 m_errorMonitor->VerifyNotFound();
16316
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016317 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16318 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16319 vkDestroyBuffer(m_device->device(), buffer, NULL);
16320 vkFreeMemory(m_device->device(), buffer_memory, NULL);
16321 }
16322
16323 // Texel Buffer Case
16324 {
16325 m_errorMonitor->ExpectSuccess();
16326
16327 VkBuffer buffer;
16328 uint32_t queue_family_index = 0;
16329 VkBufferCreateInfo buffer_create_info = {};
16330 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16331 buffer_create_info.size = 1024;
16332 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
16333 buffer_create_info.queueFamilyIndexCount = 1;
16334 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
16335
16336 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
16337 ASSERT_VK_SUCCESS(err);
16338
16339 VkMemoryRequirements memory_reqs;
16340 VkDeviceMemory buffer_memory;
16341 bool pass;
16342 VkMemoryAllocateInfo memory_info = {};
16343 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16344 memory_info.pNext = NULL;
16345 memory_info.allocationSize = 0;
16346 memory_info.memoryTypeIndex = 0;
16347
16348 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
16349 memory_info.allocationSize = memory_reqs.size;
16350 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16351 ASSERT_TRUE(pass);
16352
16353 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
16354 ASSERT_VK_SUCCESS(err);
16355 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
16356 ASSERT_VK_SUCCESS(err);
16357
16358 VkBufferViewCreateInfo buff_view_ci = {};
16359 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
16360 buff_view_ci.buffer = buffer;
16361 buff_view_ci.format = VK_FORMAT_R8_UNORM;
16362 buff_view_ci.range = VK_WHOLE_SIZE;
16363 VkBufferView buffer_view;
16364 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
16365
16366 VkDescriptorPoolSize ds_type_count = {};
16367 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16368 ds_type_count.descriptorCount = 1;
16369
16370 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16371 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16372 ds_pool_ci.pNext = NULL;
16373 ds_pool_ci.maxSets = 1;
16374 ds_pool_ci.poolSizeCount = 1;
16375 ds_pool_ci.pPoolSizes = &ds_type_count;
16376
16377 VkDescriptorPool ds_pool;
16378 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16379 ASSERT_VK_SUCCESS(err);
16380
16381 VkDescriptorSetLayoutBinding dsl_binding = {};
16382 dsl_binding.binding = 0;
16383 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16384 dsl_binding.descriptorCount = 1;
16385 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16386 dsl_binding.pImmutableSamplers = NULL;
16387
16388 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16389 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16390 ds_layout_ci.pNext = NULL;
16391 ds_layout_ci.bindingCount = 1;
16392 ds_layout_ci.pBindings = &dsl_binding;
16393 VkDescriptorSetLayout ds_layout;
16394 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16395 ASSERT_VK_SUCCESS(err);
16396
16397 VkDescriptorSet descriptor_set;
16398 VkDescriptorSetAllocateInfo alloc_info = {};
16399 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16400 alloc_info.descriptorSetCount = 1;
16401 alloc_info.descriptorPool = ds_pool;
16402 alloc_info.pSetLayouts = &ds_layout;
16403 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16404 ASSERT_VK_SUCCESS(err);
16405
16406 VkWriteDescriptorSet descriptor_write;
16407 memset(&descriptor_write, 0, sizeof(descriptor_write));
16408 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16409 descriptor_write.dstSet = descriptor_set;
16410 descriptor_write.dstBinding = 0;
16411 descriptor_write.descriptorCount = 1;
16412 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16413 descriptor_write.pTexelBufferView = &buffer_view;
16414
16415 // Set pImageInfo and pBufferInfo to invalid values, which should be
16416 // ignored for descriptorType ==
16417 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
16418 // This will most likely produce a crash if the parameter_validation
16419 // layer
16420 // does not correctly ignore pImageInfo and pBufferInfo.
16421 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
16422 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
16423
16424 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16425
16426 m_errorMonitor->VerifyNotFound();
16427
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016428 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16429 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16430 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
16431 vkDestroyBuffer(m_device->device(), buffer, NULL);
16432 vkFreeMemory(m_device->device(), buffer_memory, NULL);
16433 }
16434}
16435
Tobin Ehlisf7428442016-10-25 07:58:24 -060016436TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
16437 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
16438
16439 ASSERT_NO_FATAL_FAILURE(InitState());
16440 // Create layout where two binding #s are "1"
16441 static const uint32_t NUM_BINDINGS = 3;
16442 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
16443 dsl_binding[0].binding = 1;
16444 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16445 dsl_binding[0].descriptorCount = 1;
16446 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16447 dsl_binding[0].pImmutableSamplers = NULL;
16448 dsl_binding[1].binding = 0;
16449 dsl_binding[1].descriptorCount = 1;
16450 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16451 dsl_binding[1].descriptorCount = 1;
16452 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16453 dsl_binding[1].pImmutableSamplers = NULL;
16454 dsl_binding[2].binding = 1; // Duplicate binding should cause error
16455 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16456 dsl_binding[2].descriptorCount = 1;
16457 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16458 dsl_binding[2].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 = NUM_BINDINGS;
16464 ds_layout_ci.pBindings = dsl_binding;
16465 VkDescriptorSetLayout ds_layout;
16466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
16467 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16468 m_errorMonitor->VerifyFound();
16469}
16470
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060016471TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016472 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
16473
16474 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016475
16476 BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016477
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060016478 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
16479
16480 {
16481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
16482 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
16483 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16484 m_errorMonitor->VerifyFound();
16485 }
16486
16487 {
16488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
16489 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
16490 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16491 m_errorMonitor->VerifyFound();
16492 }
16493
16494 {
16495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
16496 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
16497 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16498 m_errorMonitor->VerifyFound();
16499 }
16500
16501 {
16502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
16503 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
16504 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16505 m_errorMonitor->VerifyFound();
16506 }
16507
16508 {
16509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
16510 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
16511 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16512 m_errorMonitor->VerifyFound();
16513 }
16514
16515 {
16516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
16517 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
16518 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16519 m_errorMonitor->VerifyFound();
16520 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016521
16522 {
16523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
16524 VkRect2D scissor = {{-1, 0}, {16, 16}};
16525 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16526 m_errorMonitor->VerifyFound();
16527 }
16528
16529 {
16530 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
16531 VkRect2D scissor = {{0, -2}, {16, 16}};
16532 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16533 m_errorMonitor->VerifyFound();
16534 }
16535
16536 {
16537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
16538 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
16539 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16540 m_errorMonitor->VerifyFound();
16541 }
16542
16543 {
16544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
16545 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
16546 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16547 m_errorMonitor->VerifyFound();
16548 }
16549
16550 EndCommandBuffer();
16551}
16552
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016553// This is a positive test. No failures are expected.
16554TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
16555 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
16556 VkResult err;
16557
16558 ASSERT_NO_FATAL_FAILURE(InitState());
16559 m_errorMonitor->ExpectSuccess();
16560 VkDescriptorPoolSize ds_type_count = {};
16561 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16562 ds_type_count.descriptorCount = 2;
16563
16564 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16565 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16566 ds_pool_ci.pNext = NULL;
16567 ds_pool_ci.maxSets = 1;
16568 ds_pool_ci.poolSizeCount = 1;
16569 ds_pool_ci.pPoolSizes = &ds_type_count;
16570
16571 VkDescriptorPool ds_pool;
16572 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16573 ASSERT_VK_SUCCESS(err);
16574
16575 // Create layout with two uniform buffer descriptors w/ empty binding between them
16576 static const uint32_t NUM_BINDINGS = 3;
16577 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
16578 dsl_binding[0].binding = 0;
16579 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16580 dsl_binding[0].descriptorCount = 1;
16581 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
16582 dsl_binding[0].pImmutableSamplers = NULL;
16583 dsl_binding[1].binding = 1;
16584 dsl_binding[1].descriptorCount = 0; // empty binding
16585 dsl_binding[2].binding = 2;
16586 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16587 dsl_binding[2].descriptorCount = 1;
16588 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
16589 dsl_binding[2].pImmutableSamplers = NULL;
16590
16591 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16592 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16593 ds_layout_ci.pNext = NULL;
16594 ds_layout_ci.bindingCount = NUM_BINDINGS;
16595 ds_layout_ci.pBindings = dsl_binding;
16596 VkDescriptorSetLayout ds_layout;
16597 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16598 ASSERT_VK_SUCCESS(err);
16599
16600 VkDescriptorSet descriptor_set = {};
16601 VkDescriptorSetAllocateInfo alloc_info = {};
16602 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16603 alloc_info.descriptorSetCount = 1;
16604 alloc_info.descriptorPool = ds_pool;
16605 alloc_info.pSetLayouts = &ds_layout;
16606 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16607 ASSERT_VK_SUCCESS(err);
16608
16609 // Create a buffer to be used for update
16610 VkBufferCreateInfo buff_ci = {};
16611 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16612 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16613 buff_ci.size = 256;
16614 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16615 VkBuffer buffer;
16616 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
16617 ASSERT_VK_SUCCESS(err);
16618 // Have to bind memory to buffer before descriptor update
16619 VkMemoryAllocateInfo mem_alloc = {};
16620 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16621 mem_alloc.pNext = NULL;
16622 mem_alloc.allocationSize = 512; // one allocation for both buffers
16623 mem_alloc.memoryTypeIndex = 0;
16624
16625 VkMemoryRequirements mem_reqs;
16626 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
16627 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
16628 if (!pass) {
16629 vkDestroyBuffer(m_device->device(), buffer, NULL);
16630 return;
16631 }
16632
16633 VkDeviceMemory mem;
16634 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
16635 ASSERT_VK_SUCCESS(err);
16636 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
16637 ASSERT_VK_SUCCESS(err);
16638
16639 // Only update the descriptor at binding 2
16640 VkDescriptorBufferInfo buff_info = {};
16641 buff_info.buffer = buffer;
16642 buff_info.offset = 0;
16643 buff_info.range = VK_WHOLE_SIZE;
16644 VkWriteDescriptorSet descriptor_write = {};
16645 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16646 descriptor_write.dstBinding = 2;
16647 descriptor_write.descriptorCount = 1;
16648 descriptor_write.pTexelBufferView = nullptr;
16649 descriptor_write.pBufferInfo = &buff_info;
16650 descriptor_write.pImageInfo = nullptr;
16651 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16652 descriptor_write.dstSet = descriptor_set;
16653
16654 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16655
16656 m_errorMonitor->VerifyNotFound();
16657 // Cleanup
16658 vkFreeMemory(m_device->device(), mem, NULL);
16659 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16660 vkDestroyBuffer(m_device->device(), buffer, NULL);
16661 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16662}
16663
16664// This is a positive test. No failures are expected.
16665TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
16666 VkResult err;
16667 bool pass;
16668
16669 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
16670 "the buffer, create an image, and bind the same memory to "
16671 "it");
16672
16673 m_errorMonitor->ExpectSuccess();
16674
16675 ASSERT_NO_FATAL_FAILURE(InitState());
16676
16677 VkBuffer buffer;
16678 VkImage image;
16679 VkDeviceMemory mem;
16680 VkMemoryRequirements mem_reqs;
16681
16682 VkBufferCreateInfo buf_info = {};
16683 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16684 buf_info.pNext = NULL;
16685 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16686 buf_info.size = 256;
16687 buf_info.queueFamilyIndexCount = 0;
16688 buf_info.pQueueFamilyIndices = NULL;
16689 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16690 buf_info.flags = 0;
16691 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
16692 ASSERT_VK_SUCCESS(err);
16693
16694 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
16695
16696 VkMemoryAllocateInfo alloc_info = {};
16697 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16698 alloc_info.pNext = NULL;
16699 alloc_info.memoryTypeIndex = 0;
16700
16701 // Ensure memory is big enough for both bindings
16702 alloc_info.allocationSize = 0x10000;
16703
16704 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
16705 if (!pass) {
16706 vkDestroyBuffer(m_device->device(), buffer, NULL);
16707 return;
16708 }
16709
16710 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
16711 ASSERT_VK_SUCCESS(err);
16712
16713 uint8_t *pData;
16714 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
16715 ASSERT_VK_SUCCESS(err);
16716
16717 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
16718
16719 vkUnmapMemory(m_device->device(), mem);
16720
16721 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
16722 ASSERT_VK_SUCCESS(err);
16723
16724 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
16725 // memory. In fact, it was never used by the GPU.
16726 // Just be be sure, wait for idle.
16727 vkDestroyBuffer(m_device->device(), buffer, NULL);
16728 vkDeviceWaitIdle(m_device->device());
16729
16730 VkImageCreateInfo image_create_info = {};
16731 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16732 image_create_info.pNext = NULL;
16733 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16734 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
16735 image_create_info.extent.width = 64;
16736 image_create_info.extent.height = 64;
16737 image_create_info.extent.depth = 1;
16738 image_create_info.mipLevels = 1;
16739 image_create_info.arrayLayers = 1;
16740 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16741 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16742 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
16743 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16744 image_create_info.queueFamilyIndexCount = 0;
16745 image_create_info.pQueueFamilyIndices = NULL;
16746 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16747 image_create_info.flags = 0;
16748
16749 VkMemoryAllocateInfo mem_alloc = {};
16750 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16751 mem_alloc.pNext = NULL;
16752 mem_alloc.allocationSize = 0;
16753 mem_alloc.memoryTypeIndex = 0;
16754
16755 /* Create a mappable image. It will be the texture if linear images are ok
16756 * to be textures or it will be the staging image if they are not.
16757 */
16758 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16759 ASSERT_VK_SUCCESS(err);
16760
16761 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
16762
16763 mem_alloc.allocationSize = mem_reqs.size;
16764
16765 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
16766 if (!pass) {
16767 vkDestroyImage(m_device->device(), image, NULL);
16768 return;
16769 }
16770
16771 // VALIDATION FAILURE:
16772 err = vkBindImageMemory(m_device->device(), image, mem, 0);
16773 ASSERT_VK_SUCCESS(err);
16774
16775 m_errorMonitor->VerifyNotFound();
16776
16777 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016778 vkDestroyImage(m_device->device(), image, NULL);
16779}
16780
Tobin Ehlis953e8392016-11-17 10:54:13 -070016781TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
16782 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
16783 // We previously had a bug where dynamic offset of inactive bindings was still being used
16784 VkResult err;
16785 m_errorMonitor->ExpectSuccess();
16786
16787 ASSERT_NO_FATAL_FAILURE(InitState());
16788 ASSERT_NO_FATAL_FAILURE(InitViewport());
16789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16790
16791 VkDescriptorPoolSize ds_type_count = {};
16792 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16793 ds_type_count.descriptorCount = 3;
16794
16795 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16796 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16797 ds_pool_ci.pNext = NULL;
16798 ds_pool_ci.maxSets = 1;
16799 ds_pool_ci.poolSizeCount = 1;
16800 ds_pool_ci.pPoolSizes = &ds_type_count;
16801
16802 VkDescriptorPool ds_pool;
16803 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16804 ASSERT_VK_SUCCESS(err);
16805
16806 const uint32_t BINDING_COUNT = 3;
16807 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070016808 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070016809 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16810 dsl_binding[0].descriptorCount = 1;
16811 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16812 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070016813 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070016814 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16815 dsl_binding[1].descriptorCount = 1;
16816 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16817 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070016818 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070016819 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16820 dsl_binding[2].descriptorCount = 1;
16821 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16822 dsl_binding[2].pImmutableSamplers = NULL;
16823
16824 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16825 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16826 ds_layout_ci.pNext = NULL;
16827 ds_layout_ci.bindingCount = BINDING_COUNT;
16828 ds_layout_ci.pBindings = dsl_binding;
16829 VkDescriptorSetLayout ds_layout;
16830 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16831 ASSERT_VK_SUCCESS(err);
16832
16833 VkDescriptorSet descriptor_set;
16834 VkDescriptorSetAllocateInfo alloc_info = {};
16835 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16836 alloc_info.descriptorSetCount = 1;
16837 alloc_info.descriptorPool = ds_pool;
16838 alloc_info.pSetLayouts = &ds_layout;
16839 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16840 ASSERT_VK_SUCCESS(err);
16841
16842 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
16843 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
16844 pipeline_layout_ci.pNext = NULL;
16845 pipeline_layout_ci.setLayoutCount = 1;
16846 pipeline_layout_ci.pSetLayouts = &ds_layout;
16847
16848 VkPipelineLayout pipeline_layout;
16849 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
16850 ASSERT_VK_SUCCESS(err);
16851
16852 // Create two buffers to update the descriptors with
16853 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
16854 uint32_t qfi = 0;
16855 VkBufferCreateInfo buffCI = {};
16856 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16857 buffCI.size = 2048;
16858 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16859 buffCI.queueFamilyIndexCount = 1;
16860 buffCI.pQueueFamilyIndices = &qfi;
16861
16862 VkBuffer dyub1;
16863 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
16864 ASSERT_VK_SUCCESS(err);
16865 // buffer2
16866 buffCI.size = 1024;
16867 VkBuffer dyub2;
16868 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
16869 ASSERT_VK_SUCCESS(err);
16870 // Allocate memory and bind to buffers
16871 VkMemoryAllocateInfo mem_alloc[2] = {};
16872 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16873 mem_alloc[0].pNext = NULL;
16874 mem_alloc[0].memoryTypeIndex = 0;
16875 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16876 mem_alloc[1].pNext = NULL;
16877 mem_alloc[1].memoryTypeIndex = 0;
16878
16879 VkMemoryRequirements mem_reqs1;
16880 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
16881 VkMemoryRequirements mem_reqs2;
16882 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
16883 mem_alloc[0].allocationSize = mem_reqs1.size;
16884 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
16885 mem_alloc[1].allocationSize = mem_reqs2.size;
16886 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
16887 if (!pass) {
16888 vkDestroyBuffer(m_device->device(), dyub1, NULL);
16889 vkDestroyBuffer(m_device->device(), dyub2, NULL);
16890 return;
16891 }
16892
16893 VkDeviceMemory mem1;
16894 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
16895 ASSERT_VK_SUCCESS(err);
16896 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
16897 ASSERT_VK_SUCCESS(err);
16898 VkDeviceMemory mem2;
16899 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
16900 ASSERT_VK_SUCCESS(err);
16901 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
16902 ASSERT_VK_SUCCESS(err);
16903 // Update descriptors
16904 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
16905 buff_info[0].buffer = dyub1;
16906 buff_info[0].offset = 0;
16907 buff_info[0].range = 256;
16908 buff_info[1].buffer = dyub1;
16909 buff_info[1].offset = 256;
16910 buff_info[1].range = 512;
16911 buff_info[2].buffer = dyub2;
16912 buff_info[2].offset = 0;
16913 buff_info[2].range = 512;
16914
16915 VkWriteDescriptorSet descriptor_write;
16916 memset(&descriptor_write, 0, sizeof(descriptor_write));
16917 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16918 descriptor_write.dstSet = descriptor_set;
16919 descriptor_write.dstBinding = 0;
16920 descriptor_write.descriptorCount = BINDING_COUNT;
16921 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16922 descriptor_write.pBufferInfo = buff_info;
16923
16924 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16925
16926 BeginCommandBuffer();
16927
16928 // Create PSO to be used for draw-time errors below
16929 char const *vsSource = "#version 450\n"
16930 "\n"
16931 "out gl_PerVertex { \n"
16932 " vec4 gl_Position;\n"
16933 "};\n"
16934 "void main(){\n"
16935 " gl_Position = vec4(1);\n"
16936 "}\n";
16937 char const *fsSource = "#version 450\n"
16938 "\n"
16939 "layout(location=0) out vec4 x;\n"
16940 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
16941 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
16942 "void main(){\n"
16943 " x = vec4(bar1.y) + vec4(bar2.y);\n"
16944 "}\n";
16945 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16946 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16947 VkPipelineObj pipe(m_device);
16948 pipe.SetViewport(m_viewports);
16949 pipe.SetScissor(m_scissors);
16950 pipe.AddShader(&vs);
16951 pipe.AddShader(&fs);
16952 pipe.AddColorAttachment();
16953 pipe.CreateVKPipeline(pipeline_layout, renderPass());
16954
16955 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
16956 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
16957 // we used to have a bug in this case.
16958 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
16959 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
16960 &descriptor_set, BINDING_COUNT, dyn_off);
16961 Draw(1, 0, 0, 0);
16962 m_errorMonitor->VerifyNotFound();
16963
16964 vkDestroyBuffer(m_device->device(), dyub1, NULL);
16965 vkDestroyBuffer(m_device->device(), dyub2, NULL);
16966 vkFreeMemory(m_device->device(), mem1, NULL);
16967 vkFreeMemory(m_device->device(), mem2, NULL);
16968
16969 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
16970 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16971 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16972}
16973
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016974TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
16975
16976 TEST_DESCRIPTION("Ensure that validations handling of non-coherent memory "
16977 "mapping while using VK_WHOLE_SIZE does not cause access "
16978 "violations");
16979 VkResult err;
16980 uint8_t *pData;
16981 ASSERT_NO_FATAL_FAILURE(InitState());
16982
16983 VkDeviceMemory mem;
16984 VkMemoryRequirements mem_reqs;
16985 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070016986 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016987 VkMemoryAllocateInfo alloc_info = {};
16988 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16989 alloc_info.pNext = NULL;
16990 alloc_info.memoryTypeIndex = 0;
16991
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070016992 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016993 alloc_info.allocationSize = allocation_size;
16994
16995 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
16996 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
16997 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
16998 if (!pass) {
16999 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
17000 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
17001 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
17002 if (!pass) {
17003 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
17004 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
17005 VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
17006 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
17007 if (!pass) {
17008 return;
17009 }
17010 }
17011 }
17012
17013 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
17014 ASSERT_VK_SUCCESS(err);
17015
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017016 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017017 m_errorMonitor->ExpectSuccess();
17018 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
17019 ASSERT_VK_SUCCESS(err);
17020 VkMappedMemoryRange mmr = {};
17021 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17022 mmr.memory = mem;
17023 mmr.offset = 0;
17024 mmr.size = VK_WHOLE_SIZE;
17025 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17026 ASSERT_VK_SUCCESS(err);
17027 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17028 ASSERT_VK_SUCCESS(err);
17029 m_errorMonitor->VerifyNotFound();
17030 vkUnmapMemory(m_device->device(), mem);
17031
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017032 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017033 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017034 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017035 ASSERT_VK_SUCCESS(err);
17036 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17037 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017038 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017039 mmr.size = VK_WHOLE_SIZE;
17040 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17041 ASSERT_VK_SUCCESS(err);
17042 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17043 ASSERT_VK_SUCCESS(err);
17044 m_errorMonitor->VerifyNotFound();
17045 vkUnmapMemory(m_device->device(), mem);
17046
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017047 // Map with offset and size
17048 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017049 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017050 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017051 ASSERT_VK_SUCCESS(err);
17052 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17053 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017054 mmr.offset = 4 * atom_size;
17055 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017056 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17057 ASSERT_VK_SUCCESS(err);
17058 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17059 ASSERT_VK_SUCCESS(err);
17060 m_errorMonitor->VerifyNotFound();
17061 vkUnmapMemory(m_device->device(), mem);
17062
17063 // Map without offset and flush WHOLE_SIZE with two separate offsets
17064 m_errorMonitor->ExpectSuccess();
17065 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
17066 ASSERT_VK_SUCCESS(err);
17067 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17068 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017069 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017070 mmr.size = VK_WHOLE_SIZE;
17071 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17072 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017073 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017074 mmr.size = VK_WHOLE_SIZE;
17075 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17076 ASSERT_VK_SUCCESS(err);
17077 m_errorMonitor->VerifyNotFound();
17078 vkUnmapMemory(m_device->device(), mem);
17079
17080 vkFreeMemory(m_device->device(), mem, NULL);
17081}
17082
17083// This is a positive test. We used to expect error in this case but spec now allows it
17084TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
17085 m_errorMonitor->ExpectSuccess();
17086 vk_testing::Fence testFence;
17087 VkFenceCreateInfo fenceInfo = {};
17088 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
17089 fenceInfo.pNext = NULL;
17090
17091 ASSERT_NO_FATAL_FAILURE(InitState());
17092 testFence.init(*m_device, fenceInfo);
17093 VkFence fences[1] = { testFence.handle() };
17094 VkResult result = vkResetFences(m_device->device(), 1, fences);
17095 ASSERT_VK_SUCCESS(result);
17096
17097 m_errorMonitor->VerifyNotFound();
17098}
17099
17100TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
17101 m_errorMonitor->ExpectSuccess();
17102
17103 ASSERT_NO_FATAL_FAILURE(InitState());
17104 VkResult err;
17105
17106 // Record (empty!) command buffer that can be submitted multiple times
17107 // simultaneously.
17108 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
17109 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr };
17110 m_commandBuffer->BeginCommandBuffer(&cbbi);
17111 m_commandBuffer->EndCommandBuffer();
17112
17113 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
17114 VkFence fence;
17115 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
17116 ASSERT_VK_SUCCESS(err);
17117
17118 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
17119 VkSemaphore s1, s2;
17120 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
17121 ASSERT_VK_SUCCESS(err);
17122 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
17123 ASSERT_VK_SUCCESS(err);
17124
17125 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
17126 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1 };
17127 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
17128 ASSERT_VK_SUCCESS(err);
17129
17130 // Submit CB again, signaling s2.
17131 si.pSignalSemaphores = &s2;
17132 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
17133 ASSERT_VK_SUCCESS(err);
17134
17135 // Wait for fence.
17136 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
17137 ASSERT_VK_SUCCESS(err);
17138
17139 // CB is still in flight from second submission, but semaphore s1 is no
17140 // longer in flight. delete it.
17141 vkDestroySemaphore(m_device->device(), s1, nullptr);
17142
17143 m_errorMonitor->VerifyNotFound();
17144
17145 // Force device idle and clean up remaining objects
17146 vkDeviceWaitIdle(m_device->device());
17147 vkDestroySemaphore(m_device->device(), s2, nullptr);
17148 vkDestroyFence(m_device->device(), fence, nullptr);
17149}
17150
17151TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
17152 m_errorMonitor->ExpectSuccess();
17153
17154 ASSERT_NO_FATAL_FAILURE(InitState());
17155 VkResult err;
17156
17157 // A fence created signaled
17158 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
17159 VkFence f1;
17160 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
17161 ASSERT_VK_SUCCESS(err);
17162
17163 // A fence created not
17164 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
17165 VkFence f2;
17166 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
17167 ASSERT_VK_SUCCESS(err);
17168
17169 // Submit the unsignaled fence
17170 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr };
17171 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
17172
17173 // Wait on both fences, with signaled first.
17174 VkFence fences[] = { f1, f2 };
17175 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
17176
17177 // Should have both retired!
17178 vkDestroyFence(m_device->device(), f1, nullptr);
17179 vkDestroyFence(m_device->device(), f2, nullptr);
17180
17181 m_errorMonitor->VerifyNotFound();
17182}
17183
17184TEST_F(VkPositiveLayerTest, ValidUsage) {
17185 TEST_DESCRIPTION("Verify that creating an image view from an image with valid usage "
17186 "doesn't generate validation errors");
17187
17188 ASSERT_NO_FATAL_FAILURE(InitState());
17189
17190 m_errorMonitor->ExpectSuccess();
17191 // Verify that we can create a view with usage INPUT_ATTACHMENT
17192 VkImageObj image(m_device);
17193 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17194 ASSERT_TRUE(image.initialized());
17195 VkImageView imageView;
17196 VkImageViewCreateInfo ivci = {};
17197 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
17198 ivci.image = image.handle();
17199 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
17200 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
17201 ivci.subresourceRange.layerCount = 1;
17202 ivci.subresourceRange.baseMipLevel = 0;
17203 ivci.subresourceRange.levelCount = 1;
17204 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17205
17206 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
17207 m_errorMonitor->VerifyNotFound();
17208 vkDestroyImageView(m_device->device(), imageView, NULL);
17209}
17210
17211// This is a positive test. No failures are expected.
17212TEST_F(VkPositiveLayerTest, BindSparse) {
17213 TEST_DESCRIPTION("Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
17214 "and then free the memory");
17215
17216 ASSERT_NO_FATAL_FAILURE(InitState());
17217
17218 auto index = m_device->graphics_queue_node_index_;
17219 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT))
17220 return;
17221
17222 m_errorMonitor->ExpectSuccess();
17223
17224 VkImage image;
17225 VkImageCreateInfo image_create_info = {};
17226 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17227 image_create_info.pNext = NULL;
17228 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17229 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17230 image_create_info.extent.width = 64;
17231 image_create_info.extent.height = 64;
17232 image_create_info.extent.depth = 1;
17233 image_create_info.mipLevels = 1;
17234 image_create_info.arrayLayers = 1;
17235 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17236 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17237 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
17238 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
17239 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
17240 ASSERT_VK_SUCCESS(err);
17241
17242 VkMemoryRequirements memory_reqs;
17243 VkDeviceMemory memory_one, memory_two;
17244 bool pass;
17245 VkMemoryAllocateInfo memory_info = {};
17246 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17247 memory_info.pNext = NULL;
17248 memory_info.allocationSize = 0;
17249 memory_info.memoryTypeIndex = 0;
17250 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
17251 // Find an image big enough to allow sparse mapping of 2 memory regions
17252 // Increase the image size until it is at least twice the
17253 // size of the required alignment, to ensure we can bind both
17254 // allocated memory blocks to the image on aligned offsets.
17255 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
17256 vkDestroyImage(m_device->device(), image, nullptr);
17257 image_create_info.extent.width *= 2;
17258 image_create_info.extent.height *= 2;
17259 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
17260 ASSERT_VK_SUCCESS(err);
17261 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
17262 }
17263 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
17264 // at the end of the first
17265 memory_info.allocationSize = memory_reqs.alignment;
17266 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17267 ASSERT_TRUE(pass);
17268 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
17269 ASSERT_VK_SUCCESS(err);
17270 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
17271 ASSERT_VK_SUCCESS(err);
17272 VkSparseMemoryBind binds[2];
17273 binds[0].flags = 0;
17274 binds[0].memory = memory_one;
17275 binds[0].memoryOffset = 0;
17276 binds[0].resourceOffset = 0;
17277 binds[0].size = memory_info.allocationSize;
17278 binds[1].flags = 0;
17279 binds[1].memory = memory_two;
17280 binds[1].memoryOffset = 0;
17281 binds[1].resourceOffset = memory_info.allocationSize;
17282 binds[1].size = memory_info.allocationSize;
17283
17284 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
17285 opaqueBindInfo.image = image;
17286 opaqueBindInfo.bindCount = 2;
17287 opaqueBindInfo.pBinds = binds;
17288
17289 VkFence fence = VK_NULL_HANDLE;
17290 VkBindSparseInfo bindSparseInfo = {};
17291 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
17292 bindSparseInfo.imageOpaqueBindCount = 1;
17293 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
17294
17295 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
17296 vkQueueWaitIdle(m_device->m_queue);
17297 vkDestroyImage(m_device->device(), image, NULL);
17298 vkFreeMemory(m_device->device(), memory_one, NULL);
17299 vkFreeMemory(m_device->device(), memory_two, NULL);
17300 m_errorMonitor->VerifyNotFound();
17301}
17302
17303TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
17304 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
17305 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
17306 "the command buffer has prior knowledge of that "
17307 "attachment's layout.");
17308
17309 m_errorMonitor->ExpectSuccess();
17310
17311 ASSERT_NO_FATAL_FAILURE(InitState());
17312
17313 // A renderpass with one color attachment.
17314 VkAttachmentDescription attachment = { 0,
17315 VK_FORMAT_R8G8B8A8_UNORM,
17316 VK_SAMPLE_COUNT_1_BIT,
17317 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17318 VK_ATTACHMENT_STORE_OP_STORE,
17319 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17320 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17321 VK_IMAGE_LAYOUT_UNDEFINED,
17322 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17323
17324 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17325
17326 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17327
17328 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr };
17329
17330 VkRenderPass rp;
17331 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17332 ASSERT_VK_SUCCESS(err);
17333
17334 // A compatible framebuffer.
17335 VkImageObj image(m_device);
17336 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17337 ASSERT_TRUE(image.initialized());
17338
17339 VkImageViewCreateInfo ivci = {
17340 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17341 nullptr,
17342 0,
17343 image.handle(),
17344 VK_IMAGE_VIEW_TYPE_2D,
17345 VK_FORMAT_R8G8B8A8_UNORM,
17346 { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17347 VK_COMPONENT_SWIZZLE_IDENTITY },
17348 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
17349 };
17350 VkImageView view;
17351 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17352 ASSERT_VK_SUCCESS(err);
17353
17354 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17355 VkFramebuffer fb;
17356 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17357 ASSERT_VK_SUCCESS(err);
17358
17359 // Record a single command buffer which uses this renderpass twice. The
17360 // bug is triggered at the beginning of the second renderpass, when the
17361 // command buffer already has a layout recorded for the attachment.
17362 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17363 BeginCommandBuffer();
17364 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17365 vkCmdEndRenderPass(m_commandBuffer->handle());
17366 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17367
17368 m_errorMonitor->VerifyNotFound();
17369
17370 vkCmdEndRenderPass(m_commandBuffer->handle());
17371 EndCommandBuffer();
17372
17373 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17374 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17375 vkDestroyImageView(m_device->device(), view, nullptr);
17376}
17377
17378TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
17379 TEST_DESCRIPTION("This test should pass. Create a Framebuffer and "
17380 "command buffer, bind them together, then destroy "
17381 "command pool and framebuffer and verify there are no "
17382 "errors.");
17383
17384 m_errorMonitor->ExpectSuccess();
17385
17386 ASSERT_NO_FATAL_FAILURE(InitState());
17387
17388 // A renderpass with one color attachment.
17389 VkAttachmentDescription attachment = { 0,
17390 VK_FORMAT_R8G8B8A8_UNORM,
17391 VK_SAMPLE_COUNT_1_BIT,
17392 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17393 VK_ATTACHMENT_STORE_OP_STORE,
17394 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17395 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17396 VK_IMAGE_LAYOUT_UNDEFINED,
17397 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17398
17399 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17400
17401 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17402
17403 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr };
17404
17405 VkRenderPass rp;
17406 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17407 ASSERT_VK_SUCCESS(err);
17408
17409 // A compatible framebuffer.
17410 VkImageObj image(m_device);
17411 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17412 ASSERT_TRUE(image.initialized());
17413
17414 VkImageViewCreateInfo ivci = {
17415 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17416 nullptr,
17417 0,
17418 image.handle(),
17419 VK_IMAGE_VIEW_TYPE_2D,
17420 VK_FORMAT_R8G8B8A8_UNORM,
17421 { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17422 VK_COMPONENT_SWIZZLE_IDENTITY },
17423 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
17424 };
17425 VkImageView view;
17426 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17427 ASSERT_VK_SUCCESS(err);
17428
17429 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17430 VkFramebuffer fb;
17431 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17432 ASSERT_VK_SUCCESS(err);
17433
17434 // Explicitly create a command buffer to bind the FB to so that we can then
17435 // destroy the command pool in order to implicitly free command buffer
17436 VkCommandPool command_pool;
17437 VkCommandPoolCreateInfo pool_create_info{};
17438 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17439 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17440 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17441 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17442
17443 VkCommandBuffer command_buffer;
17444 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17445 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17446 command_buffer_allocate_info.commandPool = command_pool;
17447 command_buffer_allocate_info.commandBufferCount = 1;
17448 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17449 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
17450
17451 // Begin our cmd buffer with renderpass using our framebuffer
17452 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17453 VkCommandBufferBeginInfo begin_info{};
17454 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17455 vkBeginCommandBuffer(command_buffer, &begin_info);
17456
17457 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17458 vkCmdEndRenderPass(command_buffer);
17459 vkEndCommandBuffer(command_buffer);
17460 vkDestroyImageView(m_device->device(), view, nullptr);
17461 // Destroy command pool to implicitly free command buffer
17462 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
17463 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17464 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17465 m_errorMonitor->VerifyNotFound();
17466}
17467
17468TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
17469 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
17470 "transitions for the first subpass");
17471
17472 m_errorMonitor->ExpectSuccess();
17473
17474 ASSERT_NO_FATAL_FAILURE(InitState());
17475
17476 // A renderpass with one color attachment.
17477 VkAttachmentDescription attachment = { 0,
17478 VK_FORMAT_R8G8B8A8_UNORM,
17479 VK_SAMPLE_COUNT_1_BIT,
17480 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17481 VK_ATTACHMENT_STORE_OP_STORE,
17482 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17483 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17484 VK_IMAGE_LAYOUT_UNDEFINED,
17485 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17486
17487 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17488
17489 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17490
17491 VkSubpassDependency dep = { 0,
17492 0,
17493 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17494 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17495 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17496 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17497 VK_DEPENDENCY_BY_REGION_BIT };
17498
17499 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep };
17500
17501 VkResult err;
17502 VkRenderPass rp;
17503 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17504 ASSERT_VK_SUCCESS(err);
17505
17506 // A compatible framebuffer.
17507 VkImageObj image(m_device);
17508 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17509 ASSERT_TRUE(image.initialized());
17510
17511 VkImageViewCreateInfo ivci = {
17512 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17513 nullptr,
17514 0,
17515 image.handle(),
17516 VK_IMAGE_VIEW_TYPE_2D,
17517 VK_FORMAT_R8G8B8A8_UNORM,
17518 { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17519 VK_COMPONENT_SWIZZLE_IDENTITY },
17520 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
17521 };
17522 VkImageView view;
17523 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17524 ASSERT_VK_SUCCESS(err);
17525
17526 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17527 VkFramebuffer fb;
17528 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17529 ASSERT_VK_SUCCESS(err);
17530
17531 // Record a single command buffer which issues a pipeline barrier w/
17532 // image memory barrier for the attachment. This detects the previously
17533 // missing tracking of the subpass layout by throwing a validation error
17534 // if it doesn't occur.
17535 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17536 BeginCommandBuffer();
17537 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17538
17539 VkImageMemoryBarrier imb = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
17540 nullptr,
17541 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17542 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17543 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
17544 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
17545 VK_QUEUE_FAMILY_IGNORED,
17546 VK_QUEUE_FAMILY_IGNORED,
17547 image.handle(),
17548 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } };
17549 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17550 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
17551 &imb);
17552
17553 vkCmdEndRenderPass(m_commandBuffer->handle());
17554 m_errorMonitor->VerifyNotFound();
17555 EndCommandBuffer();
17556
17557 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17558 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17559 vkDestroyImageView(m_device->device(), view, nullptr);
17560}
17561
17562TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
17563 TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
17564 "is used as a depth/stencil framebuffer attachment, the "
17565 "aspectMask is ignored and both depth and stencil image "
17566 "subresources are used.");
17567
17568 VkFormatProperties format_properties;
17569 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
17570 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
17571 return;
17572 }
17573
17574 m_errorMonitor->ExpectSuccess();
17575
17576 ASSERT_NO_FATAL_FAILURE(InitState());
17577
17578 VkAttachmentDescription attachment = { 0,
17579 VK_FORMAT_D32_SFLOAT_S8_UINT,
17580 VK_SAMPLE_COUNT_1_BIT,
17581 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17582 VK_ATTACHMENT_STORE_OP_STORE,
17583 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17584 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17585 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
17586 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL };
17587
17588 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL };
17589
17590 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr };
17591
17592 VkSubpassDependency dep = { 0,
17593 0,
17594 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17595 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17596 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17597 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17598 VK_DEPENDENCY_BY_REGION_BIT};
17599
17600 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep };
17601
17602 VkResult err;
17603 VkRenderPass rp;
17604 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17605 ASSERT_VK_SUCCESS(err);
17606
17607 VkImageObj image(m_device);
17608 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
17609 0x26, // usage
17610 VK_IMAGE_TILING_OPTIMAL, 0);
17611 ASSERT_TRUE(image.initialized());
17612 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
17613
17614 VkImageViewCreateInfo ivci = {
17615 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17616 nullptr,
17617 0,
17618 image.handle(),
17619 VK_IMAGE_VIEW_TYPE_2D,
17620 VK_FORMAT_D32_SFLOAT_S8_UINT,
17621 { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A },
17622 { 0x2, 0, 1, 0, 1 },
17623 };
17624 VkImageView view;
17625 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17626 ASSERT_VK_SUCCESS(err);
17627
17628 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17629 VkFramebuffer fb;
17630 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17631 ASSERT_VK_SUCCESS(err);
17632
17633 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17634 BeginCommandBuffer();
17635 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17636
17637 VkImageMemoryBarrier imb = {};
17638 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17639 imb.pNext = nullptr;
17640 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
17641 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17642 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17643 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
17644 imb.srcQueueFamilyIndex = 0;
17645 imb.dstQueueFamilyIndex = 0;
17646 imb.image = image.handle();
17647 imb.subresourceRange.aspectMask = 0x6;
17648 imb.subresourceRange.baseMipLevel = 0;
17649 imb.subresourceRange.levelCount = 0x1;
17650 imb.subresourceRange.baseArrayLayer = 0;
17651 imb.subresourceRange.layerCount = 0x1;
17652
17653 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17654 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
17655 &imb);
17656
17657 vkCmdEndRenderPass(m_commandBuffer->handle());
17658 EndCommandBuffer();
17659 QueueCommandBuffer(false);
17660 m_errorMonitor->VerifyNotFound();
17661
17662 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17663 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17664 vkDestroyImageView(m_device->device(), view, nullptr);
17665}
17666
17667TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
17668 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
17669 "errors, when an attachment reference is "
17670 "VK_ATTACHMENT_UNUSED");
17671
17672 m_errorMonitor->ExpectSuccess();
17673
17674 ASSERT_NO_FATAL_FAILURE(InitState());
17675
17676 // A renderpass with no attachments
17677 VkAttachmentReference att_ref = { VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17678
17679 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17680
17681 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr };
17682
17683 VkRenderPass rp;
17684 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17685 ASSERT_VK_SUCCESS(err);
17686
17687 // A compatible framebuffer.
17688 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1 };
17689 VkFramebuffer fb;
17690 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17691 ASSERT_VK_SUCCESS(err);
17692
17693 // Record a command buffer which just begins and ends the renderpass. The
17694 // bug manifests in BeginRenderPass.
17695 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17696 BeginCommandBuffer();
17697 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17698 vkCmdEndRenderPass(m_commandBuffer->handle());
17699 m_errorMonitor->VerifyNotFound();
17700 EndCommandBuffer();
17701
17702 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17703 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17704}
17705
17706// This is a positive test. No errors are expected.
17707TEST_F(VkPositiveLayerTest, StencilLoadOp) {
17708 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
17709 "CLEAR. stencil[Load|Store]Op used to be ignored.");
17710 VkResult result = VK_SUCCESS;
17711 VkImageFormatProperties formatProps;
17712 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17713 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
17714 &formatProps);
17715 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
17716 return;
17717 }
17718
17719 ASSERT_NO_FATAL_FAILURE(InitState());
17720 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
17721 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
17722 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
17723 VkAttachmentDescription att = {};
17724 VkAttachmentReference ref = {};
17725 att.format = depth_stencil_fmt;
17726 att.samples = VK_SAMPLE_COUNT_1_BIT;
17727 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
17728 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
17729 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
17730 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
17731 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17732 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17733
17734 VkClearValue clear;
17735 clear.depthStencil.depth = 1.0;
17736 clear.depthStencil.stencil = 0;
17737 ref.attachment = 0;
17738 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17739
17740 VkSubpassDescription subpass = {};
17741 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
17742 subpass.flags = 0;
17743 subpass.inputAttachmentCount = 0;
17744 subpass.pInputAttachments = NULL;
17745 subpass.colorAttachmentCount = 0;
17746 subpass.pColorAttachments = NULL;
17747 subpass.pResolveAttachments = NULL;
17748 subpass.pDepthStencilAttachment = &ref;
17749 subpass.preserveAttachmentCount = 0;
17750 subpass.pPreserveAttachments = NULL;
17751
17752 VkRenderPass rp;
17753 VkRenderPassCreateInfo rp_info = {};
17754 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
17755 rp_info.attachmentCount = 1;
17756 rp_info.pAttachments = &att;
17757 rp_info.subpassCount = 1;
17758 rp_info.pSubpasses = &subpass;
17759 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
17760 ASSERT_VK_SUCCESS(result);
17761
17762 VkImageView *depthView = m_depthStencil->BindInfo();
17763 VkFramebufferCreateInfo fb_info = {};
17764 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
17765 fb_info.pNext = NULL;
17766 fb_info.renderPass = rp;
17767 fb_info.attachmentCount = 1;
17768 fb_info.pAttachments = depthView;
17769 fb_info.width = 100;
17770 fb_info.height = 100;
17771 fb_info.layers = 1;
17772 VkFramebuffer fb;
17773 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
17774 ASSERT_VK_SUCCESS(result);
17775
17776 VkRenderPassBeginInfo rpbinfo = {};
17777 rpbinfo.clearValueCount = 1;
17778 rpbinfo.pClearValues = &clear;
17779 rpbinfo.pNext = NULL;
17780 rpbinfo.renderPass = rp;
17781 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
17782 rpbinfo.renderArea.extent.width = 100;
17783 rpbinfo.renderArea.extent.height = 100;
17784 rpbinfo.renderArea.offset.x = 0;
17785 rpbinfo.renderArea.offset.y = 0;
17786 rpbinfo.framebuffer = fb;
17787
17788 VkFence fence = {};
17789 VkFenceCreateInfo fence_ci = {};
17790 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
17791 fence_ci.pNext = nullptr;
17792 fence_ci.flags = 0;
17793 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
17794 ASSERT_VK_SUCCESS(result);
17795
17796 m_commandBuffer->BeginCommandBuffer();
17797 m_commandBuffer->BeginRenderPass(rpbinfo);
17798 m_commandBuffer->EndRenderPass();
17799 m_commandBuffer->EndCommandBuffer();
17800 m_commandBuffer->QueueCommandBuffer(fence);
17801
17802 VkImageObj destImage(m_device);
17803 destImage.init(100, 100, depth_stencil_fmt, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17804 VK_IMAGE_TILING_OPTIMAL, 0);
17805 VkImageMemoryBarrier barrier = {};
17806 VkImageSubresourceRange range;
17807 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17808 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
17809 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
17810 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17811 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
17812 barrier.image = m_depthStencil->handle();
17813 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17814 range.baseMipLevel = 0;
17815 range.levelCount = 1;
17816 range.baseArrayLayer = 0;
17817 range.layerCount = 1;
17818 barrier.subresourceRange = range;
17819 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
17820 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
17821 cmdbuf.BeginCommandBuffer();
17822 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
17823 &barrier);
17824 barrier.srcAccessMask = 0;
17825 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17826 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
17827 barrier.image = destImage.handle();
17828 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
17829 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
17830 &barrier);
17831 VkImageCopy cregion;
17832 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17833 cregion.srcSubresource.mipLevel = 0;
17834 cregion.srcSubresource.baseArrayLayer = 0;
17835 cregion.srcSubresource.layerCount = 1;
17836 cregion.srcOffset.x = 0;
17837 cregion.srcOffset.y = 0;
17838 cregion.srcOffset.z = 0;
17839 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17840 cregion.dstSubresource.mipLevel = 0;
17841 cregion.dstSubresource.baseArrayLayer = 0;
17842 cregion.dstSubresource.layerCount = 1;
17843 cregion.dstOffset.x = 0;
17844 cregion.dstOffset.y = 0;
17845 cregion.dstOffset.z = 0;
17846 cregion.extent.width = 100;
17847 cregion.extent.height = 100;
17848 cregion.extent.depth = 1;
17849 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
17850 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
17851 cmdbuf.EndCommandBuffer();
17852
17853 VkSubmitInfo submit_info;
17854 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17855 submit_info.pNext = NULL;
17856 submit_info.waitSemaphoreCount = 0;
17857 submit_info.pWaitSemaphores = NULL;
17858 submit_info.pWaitDstStageMask = NULL;
17859 submit_info.commandBufferCount = 1;
17860 submit_info.pCommandBuffers = &cmdbuf.handle();
17861 submit_info.signalSemaphoreCount = 0;
17862 submit_info.pSignalSemaphores = NULL;
17863
17864 m_errorMonitor->ExpectSuccess();
17865 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
17866 m_errorMonitor->VerifyNotFound();
17867
17868 vkQueueWaitIdle(m_device->m_queue);
17869 vkDestroyFence(m_device->device(), fence, nullptr);
17870 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17871 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17872}
17873
17874// This is a positive test. No errors should be generated.
17875TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
17876 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
17877
17878 m_errorMonitor->ExpectSuccess();
17879 ASSERT_NO_FATAL_FAILURE(InitState());
17880
17881 VkEvent event;
17882 VkEventCreateInfo event_create_info{};
17883 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
17884 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
17885
17886 VkCommandPool command_pool;
17887 VkCommandPoolCreateInfo pool_create_info{};
17888 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17889 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17890 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17891 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17892
17893 VkCommandBuffer command_buffer;
17894 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17895 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17896 command_buffer_allocate_info.commandPool = command_pool;
17897 command_buffer_allocate_info.commandBufferCount = 1;
17898 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17899 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
17900
17901 VkQueue queue = VK_NULL_HANDLE;
17902 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
17903
17904 {
17905 VkCommandBufferBeginInfo begin_info{};
17906 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17907 vkBeginCommandBuffer(command_buffer, &begin_info);
17908
17909 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
17910 nullptr, 0, nullptr);
17911 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
17912 vkEndCommandBuffer(command_buffer);
17913 }
17914 {
17915 VkSubmitInfo submit_info{};
17916 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17917 submit_info.commandBufferCount = 1;
17918 submit_info.pCommandBuffers = &command_buffer;
17919 submit_info.signalSemaphoreCount = 0;
17920 submit_info.pSignalSemaphores = nullptr;
17921 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
17922 }
17923 { vkSetEvent(m_device->device(), event); }
17924
17925 vkQueueWaitIdle(queue);
17926
17927 vkDestroyEvent(m_device->device(), event, nullptr);
17928 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
17929 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
17930
17931 m_errorMonitor->VerifyNotFound();
17932}
17933// This is a positive test. No errors should be generated.
17934TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
17935 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
17936
17937 ASSERT_NO_FATAL_FAILURE(InitState());
17938 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
17939 return;
17940
17941 m_errorMonitor->ExpectSuccess();
17942
17943 VkQueryPool query_pool;
17944 VkQueryPoolCreateInfo query_pool_create_info{};
17945 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
17946 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
17947 query_pool_create_info.queryCount = 1;
17948 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
17949
17950 VkCommandPool command_pool;
17951 VkCommandPoolCreateInfo pool_create_info{};
17952 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17953 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17954 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17955 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17956
17957 VkCommandBuffer command_buffer;
17958 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17959 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17960 command_buffer_allocate_info.commandPool = command_pool;
17961 command_buffer_allocate_info.commandBufferCount = 1;
17962 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17963 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
17964
17965 VkCommandBuffer secondary_command_buffer;
17966 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
17967 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
17968
17969 VkQueue queue = VK_NULL_HANDLE;
17970 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
17971
17972 uint32_t qfi = 0;
17973 VkBufferCreateInfo buff_create_info = {};
17974 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17975 buff_create_info.size = 1024;
17976 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
17977 buff_create_info.queueFamilyIndexCount = 1;
17978 buff_create_info.pQueueFamilyIndices = &qfi;
17979
17980 VkResult err;
17981 VkBuffer buffer;
17982 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
17983 ASSERT_VK_SUCCESS(err);
17984 VkMemoryAllocateInfo mem_alloc = {};
17985 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17986 mem_alloc.pNext = NULL;
17987 mem_alloc.allocationSize = 1024;
17988 mem_alloc.memoryTypeIndex = 0;
17989
17990 VkMemoryRequirements memReqs;
17991 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
17992 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
17993 if (!pass) {
17994 vkDestroyBuffer(m_device->device(), buffer, NULL);
17995 return;
17996 }
17997
17998 VkDeviceMemory mem;
17999 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
18000 ASSERT_VK_SUCCESS(err);
18001 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
18002 ASSERT_VK_SUCCESS(err);
18003
18004 VkCommandBufferInheritanceInfo hinfo = {};
18005 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18006 hinfo.renderPass = VK_NULL_HANDLE;
18007 hinfo.subpass = 0;
18008 hinfo.framebuffer = VK_NULL_HANDLE;
18009 hinfo.occlusionQueryEnable = VK_FALSE;
18010 hinfo.queryFlags = 0;
18011 hinfo.pipelineStatistics = 0;
18012
18013 {
18014 VkCommandBufferBeginInfo begin_info{};
18015 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18016 begin_info.pInheritanceInfo = &hinfo;
18017 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
18018
18019 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
18020 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
18021
18022 vkEndCommandBuffer(secondary_command_buffer);
18023
18024 begin_info.pInheritanceInfo = nullptr;
18025 vkBeginCommandBuffer(command_buffer, &begin_info);
18026
18027 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
18028 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
18029
18030 vkEndCommandBuffer(command_buffer);
18031 }
18032 {
18033 VkSubmitInfo submit_info{};
18034 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18035 submit_info.commandBufferCount = 1;
18036 submit_info.pCommandBuffers = &command_buffer;
18037 submit_info.signalSemaphoreCount = 0;
18038 submit_info.pSignalSemaphores = nullptr;
18039 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18040 }
18041
18042 vkQueueWaitIdle(queue);
18043
18044 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
18045 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
18046 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
18047 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18048 vkDestroyBuffer(m_device->device(), buffer, NULL);
18049 vkFreeMemory(m_device->device(), mem, NULL);
18050
18051 m_errorMonitor->VerifyNotFound();
18052}
18053
18054// This is a positive test. No errors should be generated.
18055TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
18056 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
18057
18058 ASSERT_NO_FATAL_FAILURE(InitState());
18059 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18060 return;
18061
18062 m_errorMonitor->ExpectSuccess();
18063
18064 VkQueryPool query_pool;
18065 VkQueryPoolCreateInfo query_pool_create_info{};
18066 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
18067 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
18068 query_pool_create_info.queryCount = 1;
18069 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
18070
18071 VkCommandPool command_pool;
18072 VkCommandPoolCreateInfo pool_create_info{};
18073 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18074 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18075 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18076 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18077
18078 VkCommandBuffer command_buffer[2];
18079 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18080 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18081 command_buffer_allocate_info.commandPool = command_pool;
18082 command_buffer_allocate_info.commandBufferCount = 2;
18083 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18084 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18085
18086 VkQueue queue = VK_NULL_HANDLE;
18087 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18088
18089 uint32_t qfi = 0;
18090 VkBufferCreateInfo buff_create_info = {};
18091 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18092 buff_create_info.size = 1024;
18093 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
18094 buff_create_info.queueFamilyIndexCount = 1;
18095 buff_create_info.pQueueFamilyIndices = &qfi;
18096
18097 VkResult err;
18098 VkBuffer buffer;
18099 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
18100 ASSERT_VK_SUCCESS(err);
18101 VkMemoryAllocateInfo mem_alloc = {};
18102 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18103 mem_alloc.pNext = NULL;
18104 mem_alloc.allocationSize = 1024;
18105 mem_alloc.memoryTypeIndex = 0;
18106
18107 VkMemoryRequirements memReqs;
18108 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
18109 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
18110 if (!pass) {
18111 vkDestroyBuffer(m_device->device(), buffer, NULL);
18112 return;
18113 }
18114
18115 VkDeviceMemory mem;
18116 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
18117 ASSERT_VK_SUCCESS(err);
18118 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
18119 ASSERT_VK_SUCCESS(err);
18120
18121 {
18122 VkCommandBufferBeginInfo begin_info{};
18123 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18124 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18125
18126 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
18127 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
18128
18129 vkEndCommandBuffer(command_buffer[0]);
18130
18131 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18132
18133 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
18134
18135 vkEndCommandBuffer(command_buffer[1]);
18136 }
18137 {
18138 VkSubmitInfo submit_info{};
18139 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18140 submit_info.commandBufferCount = 2;
18141 submit_info.pCommandBuffers = command_buffer;
18142 submit_info.signalSemaphoreCount = 0;
18143 submit_info.pSignalSemaphores = nullptr;
18144 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18145 }
18146
18147 vkQueueWaitIdle(queue);
18148
18149 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
18150 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
18151 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18152 vkDestroyBuffer(m_device->device(), buffer, NULL);
18153 vkFreeMemory(m_device->device(), mem, NULL);
18154
18155 m_errorMonitor->VerifyNotFound();
18156}
18157
Tony Barbourc46924f2016-11-04 11:49:52 -060018158TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018159 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
18160
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018161 ASSERT_NO_FATAL_FAILURE(InitState());
18162 VkEvent event;
18163 VkEventCreateInfo event_create_info{};
18164 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
18165 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
18166
18167 VkCommandPool command_pool;
18168 VkCommandPoolCreateInfo pool_create_info{};
18169 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18170 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18171 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18172 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18173
18174 VkCommandBuffer command_buffer;
18175 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18176 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18177 command_buffer_allocate_info.commandPool = command_pool;
18178 command_buffer_allocate_info.commandBufferCount = 1;
18179 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18180 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
18181
18182 VkQueue queue = VK_NULL_HANDLE;
18183 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
18184
18185 {
18186 VkCommandBufferBeginInfo begin_info{};
18187 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18188 vkBeginCommandBuffer(command_buffer, &begin_info);
18189
18190 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018191 vkEndCommandBuffer(command_buffer);
18192 }
18193 {
18194 VkSubmitInfo submit_info{};
18195 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18196 submit_info.commandBufferCount = 1;
18197 submit_info.pCommandBuffers = &command_buffer;
18198 submit_info.signalSemaphoreCount = 0;
18199 submit_info.pSignalSemaphores = nullptr;
18200 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18201 }
18202 {
18203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is already in use by a "
18204 "command buffer.");
18205 vkSetEvent(m_device->device(), event);
18206 m_errorMonitor->VerifyFound();
18207 }
18208
18209 vkQueueWaitIdle(queue);
18210
18211 vkDestroyEvent(m_device->device(), event, nullptr);
18212 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
18213 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18214}
18215
18216// This is a positive test. No errors should be generated.
18217TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
18218 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
18219 "run through a Submit & WaitForFences cycle 3 times. This "
18220 "previously revealed a bug so running this positive test "
18221 "to prevent a regression.");
18222 m_errorMonitor->ExpectSuccess();
18223
18224 ASSERT_NO_FATAL_FAILURE(InitState());
18225 VkQueue queue = VK_NULL_HANDLE;
18226 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
18227
18228 static const uint32_t NUM_OBJECTS = 2;
18229 static const uint32_t NUM_FRAMES = 3;
18230 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
18231 VkFence fences[NUM_OBJECTS] = {};
18232
18233 VkCommandPool cmd_pool;
18234 VkCommandPoolCreateInfo cmd_pool_ci = {};
18235 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18236 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
18237 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18238 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
18239 ASSERT_VK_SUCCESS(err);
18240
18241 VkCommandBufferAllocateInfo cmd_buf_info = {};
18242 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18243 cmd_buf_info.commandPool = cmd_pool;
18244 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18245 cmd_buf_info.commandBufferCount = 1;
18246
18247 VkFenceCreateInfo fence_ci = {};
18248 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18249 fence_ci.pNext = nullptr;
18250 fence_ci.flags = 0;
18251
18252 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
18253 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
18254 ASSERT_VK_SUCCESS(err);
18255 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
18256 ASSERT_VK_SUCCESS(err);
18257 }
18258
18259 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
18260 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
18261 // Create empty cmd buffer
18262 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
18263 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18264
18265 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
18266 ASSERT_VK_SUCCESS(err);
18267 err = vkEndCommandBuffer(cmd_buffers[obj]);
18268 ASSERT_VK_SUCCESS(err);
18269
18270 VkSubmitInfo submit_info = {};
18271 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18272 submit_info.commandBufferCount = 1;
18273 submit_info.pCommandBuffers = &cmd_buffers[obj];
18274 // Submit cmd buffer and wait for fence
18275 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
18276 ASSERT_VK_SUCCESS(err);
18277 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
18278 ASSERT_VK_SUCCESS(err);
18279 err = vkResetFences(m_device->device(), 1, &fences[obj]);
18280 ASSERT_VK_SUCCESS(err);
18281 }
18282 }
18283 m_errorMonitor->VerifyNotFound();
18284 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
18285 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
18286 vkDestroyFence(m_device->device(), fences[i], nullptr);
18287 }
18288}
18289// This is a positive test. No errors should be generated.
18290TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
18291
18292 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18293 "submitted on separate queues followed by a QueueWaitIdle.");
18294
18295 ASSERT_NO_FATAL_FAILURE(InitState());
18296 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18297 return;
18298
18299 m_errorMonitor->ExpectSuccess();
18300
18301 VkSemaphore semaphore;
18302 VkSemaphoreCreateInfo semaphore_create_info{};
18303 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18304 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18305
18306 VkCommandPool command_pool;
18307 VkCommandPoolCreateInfo pool_create_info{};
18308 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18309 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18310 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18311 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18312
18313 VkCommandBuffer command_buffer[2];
18314 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18315 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18316 command_buffer_allocate_info.commandPool = command_pool;
18317 command_buffer_allocate_info.commandBufferCount = 2;
18318 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18319 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18320
18321 VkQueue queue = VK_NULL_HANDLE;
18322 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18323
18324 {
18325 VkCommandBufferBeginInfo begin_info{};
18326 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18327 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18328
18329 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18330 nullptr, 0, nullptr, 0, nullptr);
18331
18332 VkViewport viewport{};
18333 viewport.maxDepth = 1.0f;
18334 viewport.minDepth = 0.0f;
18335 viewport.width = 512;
18336 viewport.height = 512;
18337 viewport.x = 0;
18338 viewport.y = 0;
18339 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18340 vkEndCommandBuffer(command_buffer[0]);
18341 }
18342 {
18343 VkCommandBufferBeginInfo begin_info{};
18344 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18345 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18346
18347 VkViewport viewport{};
18348 viewport.maxDepth = 1.0f;
18349 viewport.minDepth = 0.0f;
18350 viewport.width = 512;
18351 viewport.height = 512;
18352 viewport.x = 0;
18353 viewport.y = 0;
18354 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18355 vkEndCommandBuffer(command_buffer[1]);
18356 }
18357 {
18358 VkSubmitInfo submit_info{};
18359 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18360 submit_info.commandBufferCount = 1;
18361 submit_info.pCommandBuffers = &command_buffer[0];
18362 submit_info.signalSemaphoreCount = 1;
18363 submit_info.pSignalSemaphores = &semaphore;
18364 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18365 }
18366 {
18367 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18368 VkSubmitInfo submit_info{};
18369 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18370 submit_info.commandBufferCount = 1;
18371 submit_info.pCommandBuffers = &command_buffer[1];
18372 submit_info.waitSemaphoreCount = 1;
18373 submit_info.pWaitSemaphores = &semaphore;
18374 submit_info.pWaitDstStageMask = flags;
18375 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18376 }
18377
18378 vkQueueWaitIdle(m_device->m_queue);
18379
18380 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18381 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18382 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18383
18384 m_errorMonitor->VerifyNotFound();
18385}
18386
18387// This is a positive test. No errors should be generated.
18388TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
18389
18390 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18391 "submitted on separate queues, the second having a fence"
18392 "followed by a QueueWaitIdle.");
18393
18394 ASSERT_NO_FATAL_FAILURE(InitState());
18395 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18396 return;
18397
18398 m_errorMonitor->ExpectSuccess();
18399
18400 VkFence fence;
18401 VkFenceCreateInfo fence_create_info{};
18402 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18403 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18404
18405 VkSemaphore semaphore;
18406 VkSemaphoreCreateInfo semaphore_create_info{};
18407 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18408 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18409
18410 VkCommandPool command_pool;
18411 VkCommandPoolCreateInfo pool_create_info{};
18412 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18413 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18414 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18415 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18416
18417 VkCommandBuffer command_buffer[2];
18418 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18419 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18420 command_buffer_allocate_info.commandPool = command_pool;
18421 command_buffer_allocate_info.commandBufferCount = 2;
18422 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18423 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18424
18425 VkQueue queue = VK_NULL_HANDLE;
18426 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18427
18428 {
18429 VkCommandBufferBeginInfo begin_info{};
18430 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18431 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18432
18433 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18434 nullptr, 0, nullptr, 0, nullptr);
18435
18436 VkViewport viewport{};
18437 viewport.maxDepth = 1.0f;
18438 viewport.minDepth = 0.0f;
18439 viewport.width = 512;
18440 viewport.height = 512;
18441 viewport.x = 0;
18442 viewport.y = 0;
18443 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18444 vkEndCommandBuffer(command_buffer[0]);
18445 }
18446 {
18447 VkCommandBufferBeginInfo begin_info{};
18448 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18449 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18450
18451 VkViewport viewport{};
18452 viewport.maxDepth = 1.0f;
18453 viewport.minDepth = 0.0f;
18454 viewport.width = 512;
18455 viewport.height = 512;
18456 viewport.x = 0;
18457 viewport.y = 0;
18458 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18459 vkEndCommandBuffer(command_buffer[1]);
18460 }
18461 {
18462 VkSubmitInfo submit_info{};
18463 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18464 submit_info.commandBufferCount = 1;
18465 submit_info.pCommandBuffers = &command_buffer[0];
18466 submit_info.signalSemaphoreCount = 1;
18467 submit_info.pSignalSemaphores = &semaphore;
18468 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18469 }
18470 {
18471 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18472 VkSubmitInfo submit_info{};
18473 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18474 submit_info.commandBufferCount = 1;
18475 submit_info.pCommandBuffers = &command_buffer[1];
18476 submit_info.waitSemaphoreCount = 1;
18477 submit_info.pWaitSemaphores = &semaphore;
18478 submit_info.pWaitDstStageMask = flags;
18479 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18480 }
18481
18482 vkQueueWaitIdle(m_device->m_queue);
18483
18484 vkDestroyFence(m_device->device(), fence, nullptr);
18485 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18486 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18487 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18488
18489 m_errorMonitor->VerifyNotFound();
18490}
18491
18492// This is a positive test. No errors should be generated.
18493TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
18494
18495 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18496 "submitted on separate queues, the second having a fence"
18497 "followed by two consecutive WaitForFences calls on the same fence.");
18498
18499 ASSERT_NO_FATAL_FAILURE(InitState());
18500 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18501 return;
18502
18503 m_errorMonitor->ExpectSuccess();
18504
18505 VkFence fence;
18506 VkFenceCreateInfo fence_create_info{};
18507 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18508 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18509
18510 VkSemaphore semaphore;
18511 VkSemaphoreCreateInfo semaphore_create_info{};
18512 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18513 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18514
18515 VkCommandPool command_pool;
18516 VkCommandPoolCreateInfo pool_create_info{};
18517 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18518 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18519 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18520 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18521
18522 VkCommandBuffer command_buffer[2];
18523 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18524 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18525 command_buffer_allocate_info.commandPool = command_pool;
18526 command_buffer_allocate_info.commandBufferCount = 2;
18527 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18528 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18529
18530 VkQueue queue = VK_NULL_HANDLE;
18531 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18532
18533 {
18534 VkCommandBufferBeginInfo begin_info{};
18535 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18536 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18537
18538 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18539 nullptr, 0, nullptr, 0, nullptr);
18540
18541 VkViewport viewport{};
18542 viewport.maxDepth = 1.0f;
18543 viewport.minDepth = 0.0f;
18544 viewport.width = 512;
18545 viewport.height = 512;
18546 viewport.x = 0;
18547 viewport.y = 0;
18548 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18549 vkEndCommandBuffer(command_buffer[0]);
18550 }
18551 {
18552 VkCommandBufferBeginInfo begin_info{};
18553 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18554 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18555
18556 VkViewport viewport{};
18557 viewport.maxDepth = 1.0f;
18558 viewport.minDepth = 0.0f;
18559 viewport.width = 512;
18560 viewport.height = 512;
18561 viewport.x = 0;
18562 viewport.y = 0;
18563 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18564 vkEndCommandBuffer(command_buffer[1]);
18565 }
18566 {
18567 VkSubmitInfo submit_info{};
18568 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18569 submit_info.commandBufferCount = 1;
18570 submit_info.pCommandBuffers = &command_buffer[0];
18571 submit_info.signalSemaphoreCount = 1;
18572 submit_info.pSignalSemaphores = &semaphore;
18573 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18574 }
18575 {
18576 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18577 VkSubmitInfo submit_info{};
18578 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18579 submit_info.commandBufferCount = 1;
18580 submit_info.pCommandBuffers = &command_buffer[1];
18581 submit_info.waitSemaphoreCount = 1;
18582 submit_info.pWaitSemaphores = &semaphore;
18583 submit_info.pWaitDstStageMask = flags;
18584 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18585 }
18586
18587 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18588 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18589
18590 vkDestroyFence(m_device->device(), fence, nullptr);
18591 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18592 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18593 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18594
18595 m_errorMonitor->VerifyNotFound();
18596}
18597
18598TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
18599
18600 ASSERT_NO_FATAL_FAILURE(InitState());
18601 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
18602 printf("Test requires two queues, skipping\n");
18603 return;
18604 }
18605
18606 VkResult err;
18607
18608 m_errorMonitor->ExpectSuccess();
18609
18610 VkQueue q0 = m_device->m_queue;
18611 VkQueue q1 = nullptr;
18612 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
18613 ASSERT_NE(q1, nullptr);
18614
18615 // An (empty) command buffer. We must have work in the first submission --
18616 // the layer treats unfenced work differently from fenced work.
18617 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
18618 VkCommandPool pool;
18619 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
18620 ASSERT_VK_SUCCESS(err);
18621 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
18622 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1 };
18623 VkCommandBuffer cb;
18624 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
18625 ASSERT_VK_SUCCESS(err);
18626 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr };
18627 err = vkBeginCommandBuffer(cb, &cbbi);
18628 ASSERT_VK_SUCCESS(err);
18629 err = vkEndCommandBuffer(cb);
18630 ASSERT_VK_SUCCESS(err);
18631
18632 // A semaphore
18633 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
18634 VkSemaphore s;
18635 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
18636 ASSERT_VK_SUCCESS(err);
18637
18638 // First submission, to q0
18639 VkSubmitInfo s0 = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s };
18640
18641 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
18642 ASSERT_VK_SUCCESS(err);
18643
18644 // Second submission, to q1, waiting on s
18645 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
18646 VkSubmitInfo s1 = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr };
18647
18648 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
18649 ASSERT_VK_SUCCESS(err);
18650
18651 // Wait for q0 idle
18652 err = vkQueueWaitIdle(q0);
18653 ASSERT_VK_SUCCESS(err);
18654
18655 // Command buffer should have been completed (it was on q0); reset the pool.
18656 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
18657
18658 m_errorMonitor->VerifyNotFound();
18659
18660 // Force device completely idle and clean up resources
18661 vkDeviceWaitIdle(m_device->device());
18662 vkDestroyCommandPool(m_device->device(), pool, nullptr);
18663 vkDestroySemaphore(m_device->device(), s, nullptr);
18664}
18665
18666// This is a positive test. No errors should be generated.
18667TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
18668
18669 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18670 "submitted on separate queues, the second having a fence, "
18671 "followed by a WaitForFences call.");
18672
18673 ASSERT_NO_FATAL_FAILURE(InitState());
18674 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18675 return;
18676
18677 m_errorMonitor->ExpectSuccess();
18678
18679 ASSERT_NO_FATAL_FAILURE(InitState());
18680 VkFence fence;
18681 VkFenceCreateInfo fence_create_info{};
18682 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18683 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18684
18685 VkSemaphore semaphore;
18686 VkSemaphoreCreateInfo semaphore_create_info{};
18687 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18688 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18689
18690 VkCommandPool command_pool;
18691 VkCommandPoolCreateInfo pool_create_info{};
18692 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18693 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18694 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18695 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18696
18697 VkCommandBuffer command_buffer[2];
18698 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18699 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18700 command_buffer_allocate_info.commandPool = command_pool;
18701 command_buffer_allocate_info.commandBufferCount = 2;
18702 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18703 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18704
18705 VkQueue queue = VK_NULL_HANDLE;
18706 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18707
18708 {
18709 VkCommandBufferBeginInfo begin_info{};
18710 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18711 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18712
18713 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18714 nullptr, 0, nullptr, 0, nullptr);
18715
18716 VkViewport viewport{};
18717 viewport.maxDepth = 1.0f;
18718 viewport.minDepth = 0.0f;
18719 viewport.width = 512;
18720 viewport.height = 512;
18721 viewport.x = 0;
18722 viewport.y = 0;
18723 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18724 vkEndCommandBuffer(command_buffer[0]);
18725 }
18726 {
18727 VkCommandBufferBeginInfo begin_info{};
18728 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18729 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18730
18731 VkViewport viewport{};
18732 viewport.maxDepth = 1.0f;
18733 viewport.minDepth = 0.0f;
18734 viewport.width = 512;
18735 viewport.height = 512;
18736 viewport.x = 0;
18737 viewport.y = 0;
18738 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18739 vkEndCommandBuffer(command_buffer[1]);
18740 }
18741 {
18742 VkSubmitInfo submit_info{};
18743 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18744 submit_info.commandBufferCount = 1;
18745 submit_info.pCommandBuffers = &command_buffer[0];
18746 submit_info.signalSemaphoreCount = 1;
18747 submit_info.pSignalSemaphores = &semaphore;
18748 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18749 }
18750 {
18751 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18752 VkSubmitInfo submit_info{};
18753 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18754 submit_info.commandBufferCount = 1;
18755 submit_info.pCommandBuffers = &command_buffer[1];
18756 submit_info.waitSemaphoreCount = 1;
18757 submit_info.pWaitSemaphores = &semaphore;
18758 submit_info.pWaitDstStageMask = flags;
18759 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18760 }
18761
18762 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18763
18764 vkDestroyFence(m_device->device(), fence, nullptr);
18765 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18766 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18767 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18768
18769 m_errorMonitor->VerifyNotFound();
18770}
18771
18772// This is a positive test. No errors should be generated.
18773TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
18774
18775 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18776 "on the same queue, sharing a signal/wait semaphore, the "
18777 "second having a fence, "
18778 "followed by a WaitForFences call.");
18779
18780 m_errorMonitor->ExpectSuccess();
18781
18782 ASSERT_NO_FATAL_FAILURE(InitState());
18783 VkFence fence;
18784 VkFenceCreateInfo fence_create_info{};
18785 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18786 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18787
18788 VkSemaphore semaphore;
18789 VkSemaphoreCreateInfo semaphore_create_info{};
18790 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18791 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18792
18793 VkCommandPool command_pool;
18794 VkCommandPoolCreateInfo pool_create_info{};
18795 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18796 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18797 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18798 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18799
18800 VkCommandBuffer command_buffer[2];
18801 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18802 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18803 command_buffer_allocate_info.commandPool = command_pool;
18804 command_buffer_allocate_info.commandBufferCount = 2;
18805 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18806 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18807
18808 {
18809 VkCommandBufferBeginInfo begin_info{};
18810 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18811 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18812
18813 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18814 nullptr, 0, nullptr, 0, nullptr);
18815
18816 VkViewport viewport{};
18817 viewport.maxDepth = 1.0f;
18818 viewport.minDepth = 0.0f;
18819 viewport.width = 512;
18820 viewport.height = 512;
18821 viewport.x = 0;
18822 viewport.y = 0;
18823 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18824 vkEndCommandBuffer(command_buffer[0]);
18825 }
18826 {
18827 VkCommandBufferBeginInfo begin_info{};
18828 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18829 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18830
18831 VkViewport viewport{};
18832 viewport.maxDepth = 1.0f;
18833 viewport.minDepth = 0.0f;
18834 viewport.width = 512;
18835 viewport.height = 512;
18836 viewport.x = 0;
18837 viewport.y = 0;
18838 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18839 vkEndCommandBuffer(command_buffer[1]);
18840 }
18841 {
18842 VkSubmitInfo submit_info{};
18843 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18844 submit_info.commandBufferCount = 1;
18845 submit_info.pCommandBuffers = &command_buffer[0];
18846 submit_info.signalSemaphoreCount = 1;
18847 submit_info.pSignalSemaphores = &semaphore;
18848 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18849 }
18850 {
18851 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18852 VkSubmitInfo submit_info{};
18853 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18854 submit_info.commandBufferCount = 1;
18855 submit_info.pCommandBuffers = &command_buffer[1];
18856 submit_info.waitSemaphoreCount = 1;
18857 submit_info.pWaitSemaphores = &semaphore;
18858 submit_info.pWaitDstStageMask = flags;
18859 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18860 }
18861
18862 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18863
18864 vkDestroyFence(m_device->device(), fence, nullptr);
18865 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18866 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18867 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18868
18869 m_errorMonitor->VerifyNotFound();
18870}
18871
18872// This is a positive test. No errors should be generated.
18873TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
18874
18875 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18876 "on the same queue, no fences, followed by a third QueueSubmit with NO "
18877 "SubmitInfos but with a fence, followed by a WaitForFences call.");
18878
18879 m_errorMonitor->ExpectSuccess();
18880
18881 ASSERT_NO_FATAL_FAILURE(InitState());
18882 VkFence fence;
18883 VkFenceCreateInfo fence_create_info{};
18884 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18885 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18886
18887 VkCommandPool command_pool;
18888 VkCommandPoolCreateInfo pool_create_info{};
18889 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18890 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18891 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18892 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18893
18894 VkCommandBuffer command_buffer[2];
18895 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18896 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18897 command_buffer_allocate_info.commandPool = command_pool;
18898 command_buffer_allocate_info.commandBufferCount = 2;
18899 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18900 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18901
18902 {
18903 VkCommandBufferBeginInfo begin_info{};
18904 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18905 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18906
18907 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18908 nullptr, 0, nullptr, 0, nullptr);
18909
18910 VkViewport viewport{};
18911 viewport.maxDepth = 1.0f;
18912 viewport.minDepth = 0.0f;
18913 viewport.width = 512;
18914 viewport.height = 512;
18915 viewport.x = 0;
18916 viewport.y = 0;
18917 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18918 vkEndCommandBuffer(command_buffer[0]);
18919 }
18920 {
18921 VkCommandBufferBeginInfo begin_info{};
18922 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18923 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18924
18925 VkViewport viewport{};
18926 viewport.maxDepth = 1.0f;
18927 viewport.minDepth = 0.0f;
18928 viewport.width = 512;
18929 viewport.height = 512;
18930 viewport.x = 0;
18931 viewport.y = 0;
18932 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18933 vkEndCommandBuffer(command_buffer[1]);
18934 }
18935 {
18936 VkSubmitInfo submit_info{};
18937 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18938 submit_info.commandBufferCount = 1;
18939 submit_info.pCommandBuffers = &command_buffer[0];
18940 submit_info.signalSemaphoreCount = 0;
18941 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
18942 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18943 }
18944 {
18945 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18946 VkSubmitInfo submit_info{};
18947 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18948 submit_info.commandBufferCount = 1;
18949 submit_info.pCommandBuffers = &command_buffer[1];
18950 submit_info.waitSemaphoreCount = 0;
18951 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
18952 submit_info.pWaitDstStageMask = flags;
18953 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18954 }
18955
18956 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
18957
18958 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18959 ASSERT_VK_SUCCESS(err);
18960
18961 vkDestroyFence(m_device->device(), fence, nullptr);
18962 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18963 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18964
18965 m_errorMonitor->VerifyNotFound();
18966}
18967
18968// This is a positive test. No errors should be generated.
18969TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
18970
18971 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18972 "on the same queue, the second having a fence, followed "
18973 "by a WaitForFences call.");
18974
18975 m_errorMonitor->ExpectSuccess();
18976
18977 ASSERT_NO_FATAL_FAILURE(InitState());
18978 VkFence fence;
18979 VkFenceCreateInfo fence_create_info{};
18980 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18981 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18982
18983 VkCommandPool command_pool;
18984 VkCommandPoolCreateInfo pool_create_info{};
18985 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18986 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18987 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18988 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18989
18990 VkCommandBuffer command_buffer[2];
18991 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18992 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18993 command_buffer_allocate_info.commandPool = command_pool;
18994 command_buffer_allocate_info.commandBufferCount = 2;
18995 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18996 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18997
18998 {
18999 VkCommandBufferBeginInfo begin_info{};
19000 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19001 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19002
19003 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
19004 nullptr, 0, nullptr, 0, nullptr);
19005
19006 VkViewport viewport{};
19007 viewport.maxDepth = 1.0f;
19008 viewport.minDepth = 0.0f;
19009 viewport.width = 512;
19010 viewport.height = 512;
19011 viewport.x = 0;
19012 viewport.y = 0;
19013 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19014 vkEndCommandBuffer(command_buffer[0]);
19015 }
19016 {
19017 VkCommandBufferBeginInfo begin_info{};
19018 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19019 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19020
19021 VkViewport viewport{};
19022 viewport.maxDepth = 1.0f;
19023 viewport.minDepth = 0.0f;
19024 viewport.width = 512;
19025 viewport.height = 512;
19026 viewport.x = 0;
19027 viewport.y = 0;
19028 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19029 vkEndCommandBuffer(command_buffer[1]);
19030 }
19031 {
19032 VkSubmitInfo submit_info{};
19033 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19034 submit_info.commandBufferCount = 1;
19035 submit_info.pCommandBuffers = &command_buffer[0];
19036 submit_info.signalSemaphoreCount = 0;
19037 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
19038 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19039 }
19040 {
19041 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
19042 VkSubmitInfo submit_info{};
19043 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19044 submit_info.commandBufferCount = 1;
19045 submit_info.pCommandBuffers = &command_buffer[1];
19046 submit_info.waitSemaphoreCount = 0;
19047 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
19048 submit_info.pWaitDstStageMask = flags;
19049 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19050 }
19051
19052 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19053
19054 vkDestroyFence(m_device->device(), fence, nullptr);
19055 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19056 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19057
19058 m_errorMonitor->VerifyNotFound();
19059}
19060
19061// This is a positive test. No errors should be generated.
19062TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
19063
19064 TEST_DESCRIPTION("Two command buffers each in a separate SubmitInfo sent in a single "
19065 "QueueSubmit call followed by a WaitForFences call.");
19066 ASSERT_NO_FATAL_FAILURE(InitState());
19067
19068 m_errorMonitor->ExpectSuccess();
19069
19070 VkFence fence;
19071 VkFenceCreateInfo fence_create_info{};
19072 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19073 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19074
19075 VkSemaphore semaphore;
19076 VkSemaphoreCreateInfo semaphore_create_info{};
19077 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19078 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19079
19080 VkCommandPool command_pool;
19081 VkCommandPoolCreateInfo pool_create_info{};
19082 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19083 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19084 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19085 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19086
19087 VkCommandBuffer command_buffer[2];
19088 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19089 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19090 command_buffer_allocate_info.commandPool = command_pool;
19091 command_buffer_allocate_info.commandBufferCount = 2;
19092 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19093 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19094
19095 {
19096 VkCommandBufferBeginInfo begin_info{};
19097 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19098 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19099
19100 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
19101 nullptr, 0, nullptr, 0, nullptr);
19102
19103 VkViewport viewport{};
19104 viewport.maxDepth = 1.0f;
19105 viewport.minDepth = 0.0f;
19106 viewport.width = 512;
19107 viewport.height = 512;
19108 viewport.x = 0;
19109 viewport.y = 0;
19110 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19111 vkEndCommandBuffer(command_buffer[0]);
19112 }
19113 {
19114 VkCommandBufferBeginInfo begin_info{};
19115 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19116 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19117
19118 VkViewport viewport{};
19119 viewport.maxDepth = 1.0f;
19120 viewport.minDepth = 0.0f;
19121 viewport.width = 512;
19122 viewport.height = 512;
19123 viewport.x = 0;
19124 viewport.y = 0;
19125 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19126 vkEndCommandBuffer(command_buffer[1]);
19127 }
19128 {
19129 VkSubmitInfo submit_info[2];
19130 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
19131
19132 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19133 submit_info[0].pNext = NULL;
19134 submit_info[0].commandBufferCount = 1;
19135 submit_info[0].pCommandBuffers = &command_buffer[0];
19136 submit_info[0].signalSemaphoreCount = 1;
19137 submit_info[0].pSignalSemaphores = &semaphore;
19138 submit_info[0].waitSemaphoreCount = 0;
19139 submit_info[0].pWaitSemaphores = NULL;
19140 submit_info[0].pWaitDstStageMask = 0;
19141
19142 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19143 submit_info[1].pNext = NULL;
19144 submit_info[1].commandBufferCount = 1;
19145 submit_info[1].pCommandBuffers = &command_buffer[1];
19146 submit_info[1].waitSemaphoreCount = 1;
19147 submit_info[1].pWaitSemaphores = &semaphore;
19148 submit_info[1].pWaitDstStageMask = flags;
19149 submit_info[1].signalSemaphoreCount = 0;
19150 submit_info[1].pSignalSemaphores = NULL;
19151 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
19152 }
19153
19154 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19155
19156 vkDestroyFence(m_device->device(), fence, nullptr);
19157 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19158 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19159 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19160
19161 m_errorMonitor->VerifyNotFound();
19162}
19163
19164TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
19165 m_errorMonitor->ExpectSuccess();
19166
19167 ASSERT_NO_FATAL_FAILURE(InitState());
19168 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19169
19170 BeginCommandBuffer(); // Framework implicitly begins the renderpass.
19171 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // End implicit.
19172
19173 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
19174 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
19175 m_errorMonitor->VerifyNotFound();
19176 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
19177 m_errorMonitor->VerifyNotFound();
19178 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
19179 m_errorMonitor->VerifyNotFound();
19180
19181 m_commandBuffer->EndCommandBuffer();
19182 m_errorMonitor->VerifyNotFound();
19183}
19184
19185TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
19186 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
19187 "attachment that uses LOAD_OP_CLEAR, the first subpass "
19188 "has a valid layout, and a second subpass then uses a "
19189 "valid *READ_ONLY* layout.");
19190 m_errorMonitor->ExpectSuccess();
19191 ASSERT_NO_FATAL_FAILURE(InitState());
19192
19193 VkAttachmentReference attach[2] = {};
19194 attach[0].attachment = 0;
19195 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19196 attach[1].attachment = 0;
19197 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
19198 VkSubpassDescription subpasses[2] = {};
19199 // First subpass clears DS attach on load
19200 subpasses[0].pDepthStencilAttachment = &attach[0];
19201 // 2nd subpass reads in DS as input attachment
19202 subpasses[1].inputAttachmentCount = 1;
19203 subpasses[1].pInputAttachments = &attach[1];
19204 VkAttachmentDescription attach_desc = {};
19205 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
19206 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
19207 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
19208 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
19209 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
19210 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
19211 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19212 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
19213 VkRenderPassCreateInfo rpci = {};
19214 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
19215 rpci.attachmentCount = 1;
19216 rpci.pAttachments = &attach_desc;
19217 rpci.subpassCount = 2;
19218 rpci.pSubpasses = subpasses;
19219
19220 // Now create RenderPass and verify no errors
19221 VkRenderPass rp;
19222 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
19223 m_errorMonitor->VerifyNotFound();
19224
19225 vkDestroyRenderPass(m_device->device(), rp, NULL);
19226}
19227
19228TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
19229 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
19230 "as vertex attributes");
19231 m_errorMonitor->ExpectSuccess();
19232
19233 ASSERT_NO_FATAL_FAILURE(InitState());
19234 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19235
19236 VkVertexInputBindingDescription input_binding;
19237 memset(&input_binding, 0, sizeof(input_binding));
19238
19239 VkVertexInputAttributeDescription input_attribs[2];
19240 memset(input_attribs, 0, sizeof(input_attribs));
19241
19242 for (int i = 0; i < 2; i++) {
19243 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19244 input_attribs[i].location = i;
19245 }
19246
19247 char const *vsSource = "#version 450\n"
19248 "\n"
19249 "layout(location=0) in mat2x4 x;\n"
19250 "out gl_PerVertex {\n"
19251 " vec4 gl_Position;\n"
19252 "};\n"
19253 "void main(){\n"
19254 " gl_Position = x[0] + x[1];\n"
19255 "}\n";
19256 char const *fsSource = "#version 450\n"
19257 "\n"
19258 "layout(location=0) out vec4 color;\n"
19259 "void main(){\n"
19260 " color = vec4(1);\n"
19261 "}\n";
19262
19263 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19264 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19265
19266 VkPipelineObj pipe(m_device);
19267 pipe.AddColorAttachment();
19268 pipe.AddShader(&vs);
19269 pipe.AddShader(&fs);
19270
19271 pipe.AddVertexInputBindings(&input_binding, 1);
19272 pipe.AddVertexInputAttribs(input_attribs, 2);
19273
19274 VkDescriptorSetObj descriptorSet(m_device);
19275 descriptorSet.AppendDummy();
19276 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19277
19278 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19279
19280 /* expect success */
19281 m_errorMonitor->VerifyNotFound();
19282}
19283
19284TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
19285 m_errorMonitor->ExpectSuccess();
19286
19287 ASSERT_NO_FATAL_FAILURE(InitState());
19288 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19289
19290 VkVertexInputBindingDescription input_binding;
19291 memset(&input_binding, 0, sizeof(input_binding));
19292
19293 VkVertexInputAttributeDescription input_attribs[2];
19294 memset(input_attribs, 0, sizeof(input_attribs));
19295
19296 for (int i = 0; i < 2; i++) {
19297 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19298 input_attribs[i].location = i;
19299 }
19300
19301 char const *vsSource = "#version 450\n"
19302 "\n"
19303 "layout(location=0) in vec4 x[2];\n"
19304 "out gl_PerVertex {\n"
19305 " vec4 gl_Position;\n"
19306 "};\n"
19307 "void main(){\n"
19308 " gl_Position = x[0] + x[1];\n"
19309 "}\n";
19310 char const *fsSource = "#version 450\n"
19311 "\n"
19312 "layout(location=0) out vec4 color;\n"
19313 "void main(){\n"
19314 " color = vec4(1);\n"
19315 "}\n";
19316
19317 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19318 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19319
19320 VkPipelineObj pipe(m_device);
19321 pipe.AddColorAttachment();
19322 pipe.AddShader(&vs);
19323 pipe.AddShader(&fs);
19324
19325 pipe.AddVertexInputBindings(&input_binding, 1);
19326 pipe.AddVertexInputAttribs(input_attribs, 2);
19327
19328 VkDescriptorSetObj descriptorSet(m_device);
19329 descriptorSet.AppendDummy();
19330 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19331
19332 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19333
19334 m_errorMonitor->VerifyNotFound();
19335}
19336
19337TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
19338 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
19339 "through multiple vertex shader inputs, each consuming a different "
19340 "subset of the components.");
19341 m_errorMonitor->ExpectSuccess();
19342
19343 ASSERT_NO_FATAL_FAILURE(InitState());
19344 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19345
19346 VkVertexInputBindingDescription input_binding;
19347 memset(&input_binding, 0, sizeof(input_binding));
19348
19349 VkVertexInputAttributeDescription input_attribs[3];
19350 memset(input_attribs, 0, sizeof(input_attribs));
19351
19352 for (int i = 0; i < 3; i++) {
19353 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19354 input_attribs[i].location = i;
19355 }
19356
19357 char const *vsSource = "#version 450\n"
19358 "\n"
19359 "layout(location=0) in vec4 x;\n"
19360 "layout(location=1) in vec3 y1;\n"
19361 "layout(location=1, component=3) in float y2;\n"
19362 "layout(location=2) in vec4 z;\n"
19363 "out gl_PerVertex {\n"
19364 " vec4 gl_Position;\n"
19365 "};\n"
19366 "void main(){\n"
19367 " gl_Position = x + vec4(y1, y2) + z;\n"
19368 "}\n";
19369 char const *fsSource = "#version 450\n"
19370 "\n"
19371 "layout(location=0) out vec4 color;\n"
19372 "void main(){\n"
19373 " color = vec4(1);\n"
19374 "}\n";
19375
19376 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19377 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19378
19379 VkPipelineObj pipe(m_device);
19380 pipe.AddColorAttachment();
19381 pipe.AddShader(&vs);
19382 pipe.AddShader(&fs);
19383
19384 pipe.AddVertexInputBindings(&input_binding, 1);
19385 pipe.AddVertexInputAttribs(input_attribs, 3);
19386
19387 VkDescriptorSetObj descriptorSet(m_device);
19388 descriptorSet.AppendDummy();
19389 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19390
19391 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19392
19393 m_errorMonitor->VerifyNotFound();
19394}
19395
19396TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
19397 m_errorMonitor->ExpectSuccess();
19398
19399 ASSERT_NO_FATAL_FAILURE(InitState());
19400 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19401
19402 char const *vsSource = "#version 450\n"
19403 "out gl_PerVertex {\n"
19404 " vec4 gl_Position;\n"
19405 "};\n"
19406 "void main(){\n"
19407 " gl_Position = vec4(0);\n"
19408 "}\n";
19409 char const *fsSource = "#version 450\n"
19410 "\n"
19411 "layout(location=0) out vec4 color;\n"
19412 "void main(){\n"
19413 " color = vec4(1);\n"
19414 "}\n";
19415
19416 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19417 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19418
19419 VkPipelineObj pipe(m_device);
19420 pipe.AddColorAttachment();
19421 pipe.AddShader(&vs);
19422 pipe.AddShader(&fs);
19423
19424 VkDescriptorSetObj descriptorSet(m_device);
19425 descriptorSet.AppendDummy();
19426 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19427
19428 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19429
19430 m_errorMonitor->VerifyNotFound();
19431}
19432
19433TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
19434 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
19435 "set out in 14.1.3: fundamental type must match, and producer side must "
19436 "have at least as many components");
19437 m_errorMonitor->ExpectSuccess();
19438
19439 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
19440
19441 ASSERT_NO_FATAL_FAILURE(InitState());
19442 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19443
19444 char const *vsSource = "#version 450\n"
19445 "out gl_PerVertex {\n"
19446 " vec4 gl_Position;\n"
19447 "};\n"
19448 "layout(location=0) out vec3 x;\n"
19449 "layout(location=1) out ivec3 y;\n"
19450 "layout(location=2) out vec3 z;\n"
19451 "void main(){\n"
19452 " gl_Position = vec4(0);\n"
19453 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
19454 "}\n";
19455 char const *fsSource = "#version 450\n"
19456 "\n"
19457 "layout(location=0) out vec4 color;\n"
19458 "layout(location=0) in float x;\n"
19459 "layout(location=1) flat in int y;\n"
19460 "layout(location=2) in vec2 z;\n"
19461 "void main(){\n"
19462 " color = vec4(1 + x + y + z.x);\n"
19463 "}\n";
19464
19465 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19466 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19467
19468 VkPipelineObj pipe(m_device);
19469 pipe.AddColorAttachment();
19470 pipe.AddShader(&vs);
19471 pipe.AddShader(&fs);
19472
19473 VkDescriptorSetObj descriptorSet(m_device);
19474 descriptorSet.AppendDummy();
19475 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19476
19477 VkResult err = VK_SUCCESS;
19478 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19479 ASSERT_VK_SUCCESS(err);
19480
19481 m_errorMonitor->VerifyNotFound();
19482}
19483
19484TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
19485 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
19486 "passed between the TCS and TES stages");
19487 m_errorMonitor->ExpectSuccess();
19488
19489 ASSERT_NO_FATAL_FAILURE(InitState());
19490 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19491
19492 if (!m_device->phy().features().tessellationShader) {
19493 printf("Device does not support tessellation shaders; skipped.\n");
19494 return;
19495 }
19496
19497 char const *vsSource = "#version 450\n"
19498 "void main(){}\n";
19499 char const *tcsSource = "#version 450\n"
19500 "layout(location=0) out int x[];\n"
19501 "layout(vertices=3) out;\n"
19502 "void main(){\n"
19503 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
19504 " gl_TessLevelInner[0] = 1;\n"
19505 " x[gl_InvocationID] = gl_InvocationID;\n"
19506 "}\n";
19507 char const *tesSource = "#version 450\n"
19508 "layout(triangles, equal_spacing, cw) in;\n"
19509 "layout(location=0) in int x[];\n"
19510 "out gl_PerVertex { vec4 gl_Position; };\n"
19511 "void main(){\n"
19512 " gl_Position.xyz = gl_TessCoord;\n"
19513 " gl_Position.w = x[0] + x[1] + x[2];\n"
19514 "}\n";
19515 char const *fsSource = "#version 450\n"
19516 "layout(location=0) out vec4 color;\n"
19517 "void main(){\n"
19518 " color = vec4(1);\n"
19519 "}\n";
19520
19521 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19522 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
19523 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
19524 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19525
19526 VkPipelineInputAssemblyStateCreateInfo iasci{ VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
19527 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE };
19528
19529 VkPipelineTessellationStateCreateInfo tsci{ VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3 };
19530
19531 VkPipelineObj pipe(m_device);
19532 pipe.SetInputAssembly(&iasci);
19533 pipe.SetTessellation(&tsci);
19534 pipe.AddColorAttachment();
19535 pipe.AddShader(&vs);
19536 pipe.AddShader(&tcs);
19537 pipe.AddShader(&tes);
19538 pipe.AddShader(&fs);
19539
19540 VkDescriptorSetObj descriptorSet(m_device);
19541 descriptorSet.AppendDummy();
19542 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19543
19544 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19545
19546 m_errorMonitor->VerifyNotFound();
19547}
19548
19549TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
19550 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
19551 "interface block passed into the geometry shader. This "
19552 "is interesting because the 'extra' array level is not "
19553 "present on the member type, but on the block instance.");
19554 m_errorMonitor->ExpectSuccess();
19555
19556 ASSERT_NO_FATAL_FAILURE(InitState());
19557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19558
19559 if (!m_device->phy().features().geometryShader) {
19560 printf("Device does not support geometry shaders; skipped.\n");
19561 return;
19562 }
19563
19564 char const *vsSource = "#version 450\n"
19565 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
19566 "void main(){\n"
19567 " vs_out.x = vec4(1);\n"
19568 "}\n";
19569 char const *gsSource = "#version 450\n"
19570 "layout(triangles) in;\n"
19571 "layout(triangle_strip, max_vertices=3) out;\n"
19572 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
19573 "out gl_PerVertex { vec4 gl_Position; };\n"
19574 "void main() {\n"
19575 " gl_Position = gs_in[0].x;\n"
19576 " EmitVertex();\n"
19577 "}\n";
19578 char const *fsSource = "#version 450\n"
19579 "layout(location=0) out vec4 color;\n"
19580 "void main(){\n"
19581 " color = vec4(1);\n"
19582 "}\n";
19583
19584 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19585 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
19586 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19587
19588 VkPipelineObj pipe(m_device);
19589 pipe.AddColorAttachment();
19590 pipe.AddShader(&vs);
19591 pipe.AddShader(&gs);
19592 pipe.AddShader(&fs);
19593
19594 VkDescriptorSetObj descriptorSet(m_device);
19595 descriptorSet.AppendDummy();
19596 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19597
19598 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19599
19600 m_errorMonitor->VerifyNotFound();
19601}
19602
19603TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
19604 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
19605 "attributes. This is interesting because they consume multiple "
19606 "locations.");
19607 m_errorMonitor->ExpectSuccess();
19608
19609 ASSERT_NO_FATAL_FAILURE(InitState());
19610 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19611
19612 if (!m_device->phy().features().shaderFloat64) {
19613 printf("Device does not support 64bit vertex attributes; skipped.\n");
19614 return;
19615 }
19616
19617 VkVertexInputBindingDescription input_bindings[1];
19618 memset(input_bindings, 0, sizeof(input_bindings));
19619
19620 VkVertexInputAttributeDescription input_attribs[4];
19621 memset(input_attribs, 0, sizeof(input_attribs));
19622 input_attribs[0].location = 0;
19623 input_attribs[0].offset = 0;
19624 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19625 input_attribs[1].location = 2;
19626 input_attribs[1].offset = 32;
19627 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19628 input_attribs[2].location = 4;
19629 input_attribs[2].offset = 64;
19630 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19631 input_attribs[3].location = 6;
19632 input_attribs[3].offset = 96;
19633 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19634
19635 char const *vsSource = "#version 450\n"
19636 "\n"
19637 "layout(location=0) in dmat4 x;\n"
19638 "out gl_PerVertex {\n"
19639 " vec4 gl_Position;\n"
19640 "};\n"
19641 "void main(){\n"
19642 " gl_Position = vec4(x[0][0]);\n"
19643 "}\n";
19644 char const *fsSource = "#version 450\n"
19645 "\n"
19646 "layout(location=0) out vec4 color;\n"
19647 "void main(){\n"
19648 " color = vec4(1);\n"
19649 "}\n";
19650
19651 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19652 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19653
19654 VkPipelineObj pipe(m_device);
19655 pipe.AddColorAttachment();
19656 pipe.AddShader(&vs);
19657 pipe.AddShader(&fs);
19658
19659 pipe.AddVertexInputBindings(input_bindings, 1);
19660 pipe.AddVertexInputAttribs(input_attribs, 4);
19661
19662 VkDescriptorSetObj descriptorSet(m_device);
19663 descriptorSet.AppendDummy();
19664 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19665
19666 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19667
19668 m_errorMonitor->VerifyNotFound();
19669}
19670
19671TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
19672 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
19673 m_errorMonitor->ExpectSuccess();
19674
19675 ASSERT_NO_FATAL_FAILURE(InitState());
19676
19677 char const *vsSource = "#version 450\n"
19678 "\n"
19679 "out gl_PerVertex {\n"
19680 " vec4 gl_Position;\n"
19681 "};\n"
19682 "void main(){\n"
19683 " gl_Position = vec4(1);\n"
19684 "}\n";
19685 char const *fsSource = "#version 450\n"
19686 "\n"
19687 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
19688 "layout(location=0) out vec4 color;\n"
19689 "void main() {\n"
19690 " color = subpassLoad(x);\n"
19691 "}\n";
19692
19693 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19694 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19695
19696 VkPipelineObj pipe(m_device);
19697 pipe.AddShader(&vs);
19698 pipe.AddShader(&fs);
19699 pipe.AddColorAttachment();
19700 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19701
19702 VkDescriptorSetLayoutBinding dslb = { 0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr };
19703 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb };
19704 VkDescriptorSetLayout dsl;
19705 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19706 ASSERT_VK_SUCCESS(err);
19707
19708 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19709 VkPipelineLayout pl;
19710 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19711 ASSERT_VK_SUCCESS(err);
19712
19713 VkAttachmentDescription descs[2] = {
19714 { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
19715 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
19716 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL },
19717 { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
19718 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL },
19719 };
19720 VkAttachmentReference color = {
19721 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
19722 };
19723 VkAttachmentReference input = {
19724 1, VK_IMAGE_LAYOUT_GENERAL,
19725 };
19726
19727 VkSubpassDescription sd = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr };
19728
19729 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr };
19730 VkRenderPass rp;
19731 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19732 ASSERT_VK_SUCCESS(err);
19733
19734 // should be OK. would go wrong here if it's going to...
19735 pipe.CreateVKPipeline(pl, rp);
19736
19737 m_errorMonitor->VerifyNotFound();
19738
19739 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19740 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19741 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19742}
19743
19744TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
19745 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
19746 "descriptor-backed resource which is not provided, but the shader does not "
19747 "statically use it. This is interesting because it requires compute pipelines "
19748 "to have a proper descriptor use walk, which they didn't for some time.");
19749 m_errorMonitor->ExpectSuccess();
19750
19751 ASSERT_NO_FATAL_FAILURE(InitState());
19752
19753 char const *csSource = "#version 450\n"
19754 "\n"
19755 "layout(local_size_x=1) in;\n"
19756 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
19757 "void main(){\n"
19758 " // x is not used.\n"
19759 "}\n";
19760
19761 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19762
19763 VkDescriptorSetObj descriptorSet(m_device);
19764 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19765
19766 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19767 nullptr,
19768 0,
19769 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19770 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19771 descriptorSet.GetPipelineLayout(),
19772 VK_NULL_HANDLE,
19773 -1 };
19774
19775 VkPipeline pipe;
19776 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19777
19778 m_errorMonitor->VerifyNotFound();
19779
19780 if (err == VK_SUCCESS) {
19781 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19782 }
19783}
19784
19785TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
19786 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
19787 "sampler portion of a combined image + sampler");
19788 m_errorMonitor->ExpectSuccess();
19789
19790 ASSERT_NO_FATAL_FAILURE(InitState());
19791
19792 VkDescriptorSetLayoutBinding bindings[] = {
19793 { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19794 { 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19795 { 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19796 };
19797 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings };
19798 VkDescriptorSetLayout dsl;
19799 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19800 ASSERT_VK_SUCCESS(err);
19801
19802 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19803 VkPipelineLayout pl;
19804 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19805 ASSERT_VK_SUCCESS(err);
19806
19807 char const *csSource = "#version 450\n"
19808 "\n"
19809 "layout(local_size_x=1) in;\n"
19810 "layout(set=0, binding=0) uniform sampler s;\n"
19811 "layout(set=0, binding=1) uniform texture2D t;\n"
19812 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
19813 "void main() {\n"
19814 " x = texture(sampler2D(t, s), vec2(0));\n"
19815 "}\n";
19816 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19817
19818 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19819 nullptr,
19820 0,
19821 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19822 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19823 pl,
19824 VK_NULL_HANDLE,
19825 -1 };
19826
19827 VkPipeline pipe;
19828 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19829
19830 m_errorMonitor->VerifyNotFound();
19831
19832 if (err == VK_SUCCESS) {
19833 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19834 }
19835
19836 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19837 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19838}
19839
19840TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
19841 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
19842 "image portion of a combined image + sampler");
19843 m_errorMonitor->ExpectSuccess();
19844
19845 ASSERT_NO_FATAL_FAILURE(InitState());
19846
19847 VkDescriptorSetLayoutBinding bindings[] = {
19848 { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19849 { 1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19850 { 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19851 };
19852 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings };
19853 VkDescriptorSetLayout dsl;
19854 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19855 ASSERT_VK_SUCCESS(err);
19856
19857 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19858 VkPipelineLayout pl;
19859 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19860 ASSERT_VK_SUCCESS(err);
19861
19862 char const *csSource = "#version 450\n"
19863 "\n"
19864 "layout(local_size_x=1) in;\n"
19865 "layout(set=0, binding=0) uniform texture2D t;\n"
19866 "layout(set=0, binding=1) uniform sampler s;\n"
19867 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
19868 "void main() {\n"
19869 " x = texture(sampler2D(t, s), vec2(0));\n"
19870 "}\n";
19871 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19872
19873 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19874 nullptr,
19875 0,
19876 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19877 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19878 pl,
19879 VK_NULL_HANDLE,
19880 -1 };
19881
19882 VkPipeline pipe;
19883 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19884
19885 m_errorMonitor->VerifyNotFound();
19886
19887 if (err == VK_SUCCESS) {
19888 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19889 }
19890
19891 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19892 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19893}
19894
19895TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
19896 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
19897 "both the sampler and the image of a combined image+sampler "
19898 "but via separate variables");
19899 m_errorMonitor->ExpectSuccess();
19900
19901 ASSERT_NO_FATAL_FAILURE(InitState());
19902
19903 VkDescriptorSetLayoutBinding bindings[] = {
19904 { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19905 { 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19906 };
19907 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings };
19908 VkDescriptorSetLayout dsl;
19909 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19910 ASSERT_VK_SUCCESS(err);
19911
19912 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19913 VkPipelineLayout pl;
19914 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19915 ASSERT_VK_SUCCESS(err);
19916
19917 char const *csSource = "#version 450\n"
19918 "\n"
19919 "layout(local_size_x=1) in;\n"
19920 "layout(set=0, binding=0) uniform texture2D t;\n"
19921 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
19922 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
19923 "void main() {\n"
19924 " x = texture(sampler2D(t, s), vec2(0));\n"
19925 "}\n";
19926 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19927
19928 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19929 nullptr,
19930 0,
19931 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19932 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19933 pl,
19934 VK_NULL_HANDLE,
19935 -1 };
19936
19937 VkPipeline pipe;
19938 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19939
19940 m_errorMonitor->VerifyNotFound();
19941
19942 if (err == VK_SUCCESS) {
19943 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19944 }
19945
19946 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19947 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19948}
19949
19950TEST_F(VkPositiveLayerTest, ValidStructPNext) {
19951 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
19952
19953 ASSERT_NO_FATAL_FAILURE(InitState());
19954
19955 // Positive test to check parameter_validation and unique_objects support
19956 // for NV_dedicated_allocation
19957 uint32_t extension_count = 0;
19958 bool supports_nv_dedicated_allocation = false;
19959 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
19960 ASSERT_VK_SUCCESS(err);
19961
19962 if (extension_count > 0) {
19963 std::vector<VkExtensionProperties> available_extensions(extension_count);
19964
19965 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
19966 ASSERT_VK_SUCCESS(err);
19967
19968 for (const auto &extension_props : available_extensions) {
19969 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
19970 supports_nv_dedicated_allocation = true;
19971 }
19972 }
19973 }
19974
19975 if (supports_nv_dedicated_allocation) {
19976 m_errorMonitor->ExpectSuccess();
19977
19978 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
19979 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
19980 dedicated_buffer_create_info.pNext = nullptr;
19981 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
19982
19983 uint32_t queue_family_index = 0;
19984 VkBufferCreateInfo buffer_create_info = {};
19985 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19986 buffer_create_info.pNext = &dedicated_buffer_create_info;
19987 buffer_create_info.size = 1024;
19988 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19989 buffer_create_info.queueFamilyIndexCount = 1;
19990 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
19991
19992 VkBuffer buffer;
19993 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
19994 ASSERT_VK_SUCCESS(err);
19995
19996 VkMemoryRequirements memory_reqs;
19997 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
19998
19999 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
20000 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
20001 dedicated_memory_info.pNext = nullptr;
20002 dedicated_memory_info.buffer = buffer;
20003 dedicated_memory_info.image = VK_NULL_HANDLE;
20004
20005 VkMemoryAllocateInfo memory_info = {};
20006 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20007 memory_info.pNext = &dedicated_memory_info;
20008 memory_info.allocationSize = memory_reqs.size;
20009
20010 bool pass;
20011 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20012 ASSERT_TRUE(pass);
20013
20014 VkDeviceMemory buffer_memory;
20015 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
20016 ASSERT_VK_SUCCESS(err);
20017
20018 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
20019 ASSERT_VK_SUCCESS(err);
20020
20021 vkDestroyBuffer(m_device->device(), buffer, NULL);
20022 vkFreeMemory(m_device->device(), buffer_memory, NULL);
20023
20024 m_errorMonitor->VerifyNotFound();
20025 }
20026}
20027
20028TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
20029 VkResult err;
20030
20031 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
20032
20033 ASSERT_NO_FATAL_FAILURE(InitState());
20034 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20035
20036 std::vector<const char *> device_extension_names;
20037 auto features = m_device->phy().features();
20038 // Artificially disable support for non-solid fill modes
20039 features.fillModeNonSolid = false;
20040 // The sacrificial device object
20041 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
20042
20043 VkRenderpassObj render_pass(&test_device);
20044
20045 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20046 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20047 pipeline_layout_ci.setLayoutCount = 0;
20048 pipeline_layout_ci.pSetLayouts = NULL;
20049
20050 VkPipelineLayout pipeline_layout;
20051 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20052 ASSERT_VK_SUCCESS(err);
20053
20054 VkPipelineRasterizationStateCreateInfo rs_ci = {};
20055 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
20056 rs_ci.pNext = nullptr;
20057 rs_ci.lineWidth = 1.0f;
20058 rs_ci.rasterizerDiscardEnable = true;
20059
20060 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
20061 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20062
20063 // Set polygonMode=FILL. No error is expected
20064 m_errorMonitor->ExpectSuccess();
20065 {
20066 VkPipelineObj pipe(&test_device);
20067 pipe.AddShader(&vs);
20068 pipe.AddShader(&fs);
20069 pipe.AddColorAttachment();
20070 // Set polygonMode to a good value
20071 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
20072 pipe.SetRasterization(&rs_ci);
20073 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
20074 }
20075 m_errorMonitor->VerifyNotFound();
20076
20077 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
20078}
20079
20080TEST_F(VkPositiveLayerTest, ValidPushConstants) {
20081 VkResult err;
20082 ASSERT_NO_FATAL_FAILURE(InitState());
20083 ASSERT_NO_FATAL_FAILURE(InitViewport());
20084 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20085
20086 VkPipelineLayout pipeline_layout;
20087 VkPushConstantRange pc_range = {};
20088 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20089 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20090 pipeline_layout_ci.pushConstantRangeCount = 1;
20091 pipeline_layout_ci.pPushConstantRanges = &pc_range;
20092
20093 //
20094 // Check for invalid push constant ranges in pipeline layouts.
20095 //
20096 struct PipelineLayoutTestCase {
20097 VkPushConstantRange const range;
20098 char const *msg;
20099 };
20100
20101 // Check for overlapping ranges
20102 const uint32_t ranges_per_test = 5;
20103 struct OverlappingRangeTestCase {
20104 VkPushConstantRange const ranges[ranges_per_test];
20105 char const *msg;
20106 };
20107
20108 // Run some positive tests to make sure overlap checking in the layer is OK
20109 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos = { { { { { VK_SHADER_STAGE_VERTEX_BIT, 0, 4 },
20110 { VK_SHADER_STAGE_VERTEX_BIT, 4, 4 },
20111 { VK_SHADER_STAGE_VERTEX_BIT, 8, 4 },
20112 { VK_SHADER_STAGE_VERTEX_BIT, 12, 4 },
20113 { VK_SHADER_STAGE_VERTEX_BIT, 16, 4 } },
20114 "" },
20115 { { { VK_SHADER_STAGE_VERTEX_BIT, 92, 24 },
20116 { VK_SHADER_STAGE_VERTEX_BIT, 80, 4 },
20117 { VK_SHADER_STAGE_VERTEX_BIT, 64, 8 },
20118 { VK_SHADER_STAGE_VERTEX_BIT, 4, 16 },
20119 { VK_SHADER_STAGE_VERTEX_BIT, 0, 4 } },
20120 "" } } };
20121 for (const auto &iter : overlapping_range_tests_pos) {
20122 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
20123 m_errorMonitor->ExpectSuccess();
20124 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20125 m_errorMonitor->VerifyNotFound();
20126 if (VK_SUCCESS == err) {
20127 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20128 }
20129 }
20130
20131 //
20132 // CmdPushConstants tests
20133 //
20134 const uint8_t dummy_values[100] = {};
20135
20136 BeginCommandBuffer();
20137
20138 // positive overlapping range tests with cmd
20139 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = { {
20140 { { VK_SHADER_STAGE_VERTEX_BIT, 0, 16 }, "" },
20141 { { VK_SHADER_STAGE_VERTEX_BIT, 0, 4 }, "" },
20142 { { VK_SHADER_STAGE_VERTEX_BIT, 20, 12 }, "" },
20143 { { VK_SHADER_STAGE_VERTEX_BIT, 56, 36 }, "" },
20144 } };
20145
20146 // Setup ranges: [0,16) [20,36) [36,44) [44,52) [56,80) [80,92)
20147 const VkPushConstantRange pc_range4[] = {
20148 { VK_SHADER_STAGE_VERTEX_BIT, 20, 16 },{ VK_SHADER_STAGE_VERTEX_BIT, 0, 16 },{ VK_SHADER_STAGE_VERTEX_BIT, 44, 8 },
20149 { VK_SHADER_STAGE_VERTEX_BIT, 80, 12 },{ VK_SHADER_STAGE_VERTEX_BIT, 36, 8 },{ VK_SHADER_STAGE_VERTEX_BIT, 56, 24 },
20150 };
20151
20152 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range4) / sizeof(VkPushConstantRange);
20153 pipeline_layout_ci.pPushConstantRanges = pc_range4;
20154 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20155 ASSERT_VK_SUCCESS(err);
20156 for (const auto &iter : cmd_overlap_tests_pos) {
20157 m_errorMonitor->ExpectSuccess();
20158 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
20159 iter.range.size, dummy_values);
20160 m_errorMonitor->VerifyNotFound();
20161 }
20162 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20163
20164 EndCommandBuffer();
20165}
20166
20167
20168
20169
20170
20171
20172
20173#if 0 // A few devices have issues with this test so disabling for now
20174TEST_F(VkPositiveLayerTest, LongFenceChain)
20175{
20176 m_errorMonitor->ExpectSuccess();
20177
20178 ASSERT_NO_FATAL_FAILURE(InitState());
20179 VkResult err;
20180
20181 std::vector<VkFence> fences;
20182
20183 const int chainLength = 32768;
20184
20185 for (int i = 0; i < chainLength; i++) {
20186 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
20187 VkFence fence;
20188 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
20189 ASSERT_VK_SUCCESS(err);
20190
20191 fences.push_back(fence);
20192
20193 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
20194 0, nullptr, 0, nullptr };
20195 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
20196 ASSERT_VK_SUCCESS(err);
20197
20198 }
20199
20200 // BOOM, stack overflow.
20201 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
20202
20203 for (auto fence : fences)
20204 vkDestroyFence(m_device->device(), fence, nullptr);
20205
20206 m_errorMonitor->VerifyNotFound();
20207}
20208#endif
20209
20210
Cody Northrop1242dfd2016-07-13 17:24:59 -060020211#if defined(ANDROID) && defined(VALIDATION_APK)
20212static bool initialized = false;
20213static bool active = false;
20214
20215// Convert Intents to argv
20216// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020217std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020218 std::vector<std::string> args;
20219 JavaVM &vm = *app.activity->vm;
20220 JNIEnv *p_env;
20221 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK)
20222 return args;
20223
20224 JNIEnv &env = *p_env;
20225 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020226 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060020227 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020228 jmethodID get_string_extra_method =
20229 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060020230 jvalue get_string_extra_args;
20231 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020232 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060020233
20234 std::string args_str;
20235 if (extra_str) {
20236 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
20237 args_str = extra_utf;
20238 env.ReleaseStringUTFChars(extra_str, extra_utf);
20239 env.DeleteLocalRef(extra_str);
20240 }
20241
20242 env.DeleteLocalRef(get_string_extra_args.l);
20243 env.DeleteLocalRef(intent);
20244 vm.DetachCurrentThread();
20245
20246 // split args_str
20247 std::stringstream ss(args_str);
20248 std::string arg;
20249 while (std::getline(ss, arg, ' ')) {
20250 if (!arg.empty())
20251 args.push_back(arg);
20252 }
20253
20254 return args;
20255}
20256
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020257static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020258
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020259static void processCommand(struct android_app *app, int32_t cmd) {
20260 switch (cmd) {
20261 case APP_CMD_INIT_WINDOW: {
20262 if (app->window) {
20263 initialized = true;
Cody Northrop1242dfd2016-07-13 17:24:59 -060020264 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020265 break;
20266 }
20267 case APP_CMD_GAINED_FOCUS: {
20268 active = true;
20269 break;
20270 }
20271 case APP_CMD_LOST_FOCUS: {
20272 active = false;
20273 break;
20274 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020275 }
20276}
20277
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020278void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020279 app_dummy();
20280
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020281 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060020282
20283 int vulkanSupport = InitVulkan();
20284 if (vulkanSupport == 0) {
20285 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
20286 return;
20287 }
20288
20289 app->onAppCmd = processCommand;
20290 app->onInputEvent = processInput;
20291
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020292 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020293 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020294 struct android_poll_source *source;
20295 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020296 if (source) {
20297 source->process(app, source);
20298 }
20299
20300 if (app->destroyRequested != 0) {
20301 VkTestFramework::Finish();
20302 return;
20303 }
20304 }
20305
20306 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020307 // Use the following key to send arguments to gtest, i.e.
20308 // --es args "--gtest_filter=-VkLayerTest.foo"
20309 const char key[] = "args";
20310 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020311
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020312 std::string filter = "";
20313 if (args.size() > 0) {
20314 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
20315 filter += args[0];
20316 } else {
20317 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
20318 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020319
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020320 int argc = 2;
20321 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
20322 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020323
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020324 // Route output to files until we can override the gtest output
20325 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
20326 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020327
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020328 ::testing::InitGoogleTest(&argc, argv);
20329 VkTestFramework::InitArgs(&argc, argv);
20330 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020331
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020332 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060020333
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020334 if (result != 0) {
20335 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
20336 } else {
20337 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
20338 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020339
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020340 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060020341
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020342 fclose(stdout);
20343 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020344
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020345 ANativeActivity_finish(app->activity);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020346
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020347 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060020348 }
20349 }
20350}
20351#endif
20352
Tony Barbour300a6082015-04-07 13:44:53 -060020353int main(int argc, char **argv) {
20354 int result;
20355
Cody Northrop8e54a402016-03-08 22:25:52 -070020356#ifdef ANDROID
20357 int vulkanSupport = InitVulkan();
20358 if (vulkanSupport == 0)
20359 return 1;
20360#endif
20361
Tony Barbour300a6082015-04-07 13:44:53 -060020362 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060020363 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060020364
20365 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
20366
20367 result = RUN_ALL_TESTS();
20368
Tony Barbour6918cd52015-04-09 12:58:51 -060020369 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060020370 return result;
20371}