blob: cf64ba74ac836d8c64ca2eb9d5b99e29c9a851e0 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 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
46//--------------------------------------------------------------------------------------
47// Mesh and VertexFormat Data
48//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070049struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070050 float posX, posY, posZ, posW; // Position data
51 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050052};
53
Karl Schultz6addd812016-02-02 17:17:23 -070054#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050055
56typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070057 BsoFailNone = 0x00000000,
58 BsoFailLineWidth = 0x00000001,
59 BsoFailDepthBias = 0x00000002,
60 BsoFailViewport = 0x00000004,
61 BsoFailScissor = 0x00000008,
62 BsoFailBlend = 0x00000010,
63 BsoFailDepthBounds = 0x00000020,
64 BsoFailStencilReadMask = 0x00000040,
65 BsoFailStencilWriteMask = 0x00000080,
66 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060067 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060068 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050069} BsoFailSelect;
70
71struct vktriangle_vs_uniform {
72 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070073 float mvp[4][4];
74 float position[3][4];
75 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050076};
77
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070078static const char bindStateVertShaderText[] =
79 "#version 450\n"
80 "vec2 vertices[3];\n"
81 "out gl_PerVertex {\n"
82 " vec4 gl_Position;\n"
83 "};\n"
84 "void main() {\n"
85 " vertices[0] = vec2(-1.0, -1.0);\n"
86 " vertices[1] = vec2( 1.0, -1.0);\n"
87 " vertices[2] = vec2( 0.0, 1.0);\n"
88 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
89 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050090
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070091static const char bindStateFragShaderText[] =
92 "#version 450\n"
93 "\n"
94 "layout(location = 0) out vec4 uFragColor;\n"
95 "void main(){\n"
96 " uFragColor = vec4(0,1,0,1);\n"
97 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050098
Mark Lobodzinskice751c62016-09-08 10:45:35 -060099static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
100 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
101 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600102
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600103// ErrorMonitor Usage:
104//
Dave Houltonfbf52152017-01-06 12:55:29 -0700105// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600106// encountered log messages, or a validation error enum identifying
107// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
108// will match all log messages. logMsg will return true for skipCall
109// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600110//
Dave Houltonfbf52152017-01-06 12:55:29 -0700111// Call VerifyFound to determine if all desired failure messages
112// were encountered. Call VerifyNotFound to determine if any unexpected
113// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600114class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700115 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700116 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700117 test_platform_thread_create_mutex(&mutex_);
118 test_platform_thread_lock_mutex(&mutex_);
119 Reset();
120 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600121 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600122
Dave Houltonfbf52152017-01-06 12:55:29 -0700123 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600124
Dave Houltonfbf52152017-01-06 12:55:29 -0700125 // Set monitor to pristine state
126 void Reset() {
127 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
128 bailout_ = NULL;
129 message_found_ = VK_FALSE;
130 failure_message_strings_.clear();
131 desired_message_strings_.clear();
132 desired_message_ids_.clear();
133 other_messages_.clear();
134 message_outstanding_count_ = 0;
135 }
136
137 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700138 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700139 test_platform_thread_lock_mutex(&mutex_);
140 desired_message_strings_.insert(msgString);
141 message_flags_ |= msgFlags;
142 message_outstanding_count_++;
143 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600144 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700146 // ErrorMonitor will look for an error message containing the specified string(s)
147 template <typename Iter>
148 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
149 for (; iter != end; ++iter) {
150 SetDesiredFailureMsg(msgFlags, *iter);
151 }
152 }
153
Dave Houltonfbf52152017-01-06 12:55:29 -0700154 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700155 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700156 test_platform_thread_lock_mutex(&mutex_);
157 desired_message_ids_.insert(msg_id);
158 message_flags_ |= msgFlags;
159 message_outstanding_count_++;
160 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600161 }
162
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700163 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600164 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700165 test_platform_thread_lock_mutex(&mutex_);
166 if (bailout_ != NULL) {
167 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600168 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600169 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600170 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600171
Dave Houltonfbf52152017-01-06 12:55:29 -0700172 for (auto desired_msg : desired_message_strings_) {
Karl Schultz05cc4e32016-10-12 13:25:23 -0600173 if (desired_msg.length() == 0) {
174 // An empty desired_msg string "" indicates a positive test - not expecting an error.
175 // Return true to avoid calling layers/driver with this error.
176 // And don't erase the "" string, so it remains if another error is found.
177 result = VK_TRUE;
Tony Barbourae58dba2016-12-13 16:30:36 -0700178 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700179 message_found_ = VK_TRUE;
180 failure_message_strings_.insert(errorString);
Karl Schultz05cc4e32016-10-12 13:25:23 -0600181 } else if (errorString.find(desired_msg) != string::npos) {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600182 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700183 message_outstanding_count_--;
184 failure_message_strings_.insert(errorString);
185 message_found_ = VK_TRUE;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600186 result = VK_TRUE;
187 // We only want one match for each expected error so remove from set here
188 // Since we're about the break the loop it's ok to remove from set we're iterating over
Dave Houltonfbf52152017-01-06 12:55:29 -0700189 desired_message_strings_.erase(desired_msg);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600190 break;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600191 }
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600192 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700193 for (auto desired_id : desired_message_ids_) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600194 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
195 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
196 // Return true to avoid calling layers/driver with this error.
197 result = VK_TRUE;
198 } else if (desired_id == message_code) {
199 // Double-check that the string matches the error enum
200 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
201 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700202 message_outstanding_count_--;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600203 result = VK_TRUE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700204 message_found_ = VK_TRUE;
205 desired_message_ids_.erase(desired_id);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600206 break;
207 } else {
208 // Treat this message as a regular unexpected error, but print a warning jic
209 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
210 errorString.c_str(), desired_id, validation_error_map[desired_id]);
211 }
212 }
213 }
214
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600215 if (!found_expected) {
Chris Forbes5b9442b2016-09-13 16:49:57 +1200216 printf("Unexpected: %s\n", msgString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700217 other_messages_.push_back(errorString);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600218 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700219 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600220 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600221 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600222
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700223 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600224
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700225 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600226
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700227 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600228
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700229 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700230
231 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600232
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700233 void DumpFailureMsgs(void) const {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600234 vector<string> otherMsgs = GetOtherFailureMsgs();
Tony Barbour59b42282016-11-03 13:31:28 -0600235 if (otherMsgs.size()) {
236 cout << "Other error messages logged for this test were:" << endl;
237 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
238 cout << " " << *iter << endl;
239 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600240 }
241 }
242
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600243 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200244
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600245 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700246 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600247 // Match ANY message matching specified type
248 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700249 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200250 }
251
252 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600253 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700254 if (!AllDesiredMsgsFound()) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200255 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700256 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700257 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600258 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700259 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700260 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600261 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200262 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700263 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200264 }
265
266 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600267 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700268 if (AnyDesiredMsgFound()) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200269 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700270 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700271 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600272 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200273 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700274 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200275 }
276
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700277 private:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700278 VkFlags message_flags_;
279 std::unordered_set<uint32_t> desired_message_ids_;
280 std::unordered_set<string> desired_message_strings_;
281 std::unordered_set<string> failure_message_strings_;
282 vector<string> other_messages_;
283 test_platform_thread_mutex mutex_;
284 bool *bailout_;
285 VkBool32 message_found_;
286 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600287};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500288
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600289static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
290 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
291 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600292 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
293 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600294 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600295 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600296 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600297}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500298
Karl Schultz6addd812016-02-02 17:17:23 -0700299class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700300 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600301 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
302 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700303 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600304 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
305 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700306 }
Tony Barbour300a6082015-04-07 13:44:53 -0600307
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600308 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
309 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700310 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600311 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700312 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600313 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700314 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600315 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
316 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
317 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700318 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
319 }
320 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
321 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
322 }
323
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700324 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700325 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600326 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600327
328 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600329 std::vector<const char *> instance_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600330 std::vector<const char *> instance_extension_names;
331 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600332
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700333 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600334 /*
335 * Since CreateDbgMsgCallback is an instance level extension call
336 * any extension / layer that utilizes that feature also needs
337 * to be enabled at create instance time.
338 */
Karl Schultz6addd812016-02-02 17:17:23 -0700339 // Use Threading layer first to protect others from
340 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700341 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600342 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800343 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700344 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800345 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600346 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700347 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600348
Ian Elliott2c1daf52016-05-12 09:41:46 -0600349 if (m_enableWSI) {
350 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
351 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
352#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
353#if defined(VK_USE_PLATFORM_ANDROID_KHR)
354 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700355#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600356#if defined(VK_USE_PLATFORM_MIR_KHR)
357 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700358#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600359#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
360 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700361#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600362#if defined(VK_USE_PLATFORM_WIN32_KHR)
363 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700364#endif // VK_USE_PLATFORM_WIN32_KHR
365#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600366#if defined(VK_USE_PLATFORM_XCB_KHR)
367 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
368#elif defined(VK_USE_PLATFORM_XLIB_KHR)
369 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700370#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600371 }
372
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600373 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600374 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800375 this->app_info.pApplicationName = "layer_tests";
376 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600377 this->app_info.pEngineName = "unittest";
378 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600379 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600380
Tony Barbour15524c32015-04-29 17:34:29 -0600381 m_errorMonitor = new ErrorMonitor;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600382 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600383 }
384
385 virtual void TearDown() {
386 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600387 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600388 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600389 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600390
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600391 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600392};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500393
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600394void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500395 // Create identity matrix
396 int i;
397 struct vktriangle_vs_uniform data;
398
399 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700400 glm::mat4 View = glm::mat4(1.0f);
401 glm::mat4 Model = glm::mat4(1.0f);
402 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500403 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700404 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500405
406 memcpy(&data.mvp, &MVP[0][0], matrixSize);
407
Karl Schultz6addd812016-02-02 17:17:23 -0700408 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600409 {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 -0500410 };
411
Karl Schultz6addd812016-02-02 17:17:23 -0700412 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500413 data.position[i][0] = tri_data[i].posX;
414 data.position[i][1] = tri_data[i].posY;
415 data.position[i][2] = tri_data[i].posZ;
416 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700417 data.color[i][0] = tri_data[i].r;
418 data.color[i][1] = tri_data[i].g;
419 data.color[i][2] = tri_data[i].b;
420 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500421 }
422
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500423 ASSERT_NO_FATAL_FAILURE(InitViewport());
424
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200425 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
426 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500427
Karl Schultz6addd812016-02-02 17:17:23 -0700428 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600429 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500430
431 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800432 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500433 pipelineobj.AddShader(&vs);
434 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600435 if (failMask & BsoFailLineWidth) {
436 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600437 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600438 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600439 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
440 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600441 }
442 if (failMask & BsoFailDepthBias) {
443 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600444 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600445 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600446 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600447 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600448 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600449 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700450 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700451 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600452 if (failMask & BsoFailViewport) {
453 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
454 }
455 if (failMask & BsoFailScissor) {
456 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
457 }
458 if (failMask & BsoFailBlend) {
459 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600460 VkPipelineColorBlendAttachmentState att_state = {};
461 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
462 att_state.blendEnable = VK_TRUE;
463 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600464 }
465 if (failMask & BsoFailDepthBounds) {
466 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
467 }
468 if (failMask & BsoFailStencilReadMask) {
469 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
470 }
471 if (failMask & BsoFailStencilWriteMask) {
472 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
473 }
474 if (failMask & BsoFailStencilReference) {
475 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
476 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500477
478 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600479 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500480
481 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700482 m_commandBuffer->BeginCommandBuffer();
483 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500484
Tony Barbourfe3351b2015-07-28 10:17:20 -0600485 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500486
487 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600488 if (failMask & BsoFailIndexBuffer) {
489 // Use DrawIndexed w/o an index buffer bound
490 DrawIndexed(3, 1, 0, 0, 0);
491 } else {
492 Draw(3, 1, 0, 0);
493 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500494
Mark Muellerd4914412016-06-13 17:52:06 -0600495 if (failMask & BsoFailCmdClearAttachments) {
496 VkClearAttachment color_attachment = {};
497 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700498 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600499 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
500
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600501 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600502 }
503
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500504 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700505 m_commandBuffer->EndRenderPass();
506 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600507 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500508}
509
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600510void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
511 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500512 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600513 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500514 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600515 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500516 }
517
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800518 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700519 // Make sure depthWriteEnable is set so that Depth fail test will work
520 // correctly
521 // Make sure stencilTestEnable is set so that Stencil fail test will work
522 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600523 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800524 stencil.failOp = VK_STENCIL_OP_KEEP;
525 stencil.passOp = VK_STENCIL_OP_KEEP;
526 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
527 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600528
529 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
530 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600531 ds_ci.pNext = NULL;
532 ds_ci.depthTestEnable = VK_FALSE;
533 ds_ci.depthWriteEnable = VK_TRUE;
534 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
535 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600536 if (failMask & BsoFailDepthBounds) {
537 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600538 ds_ci.maxDepthBounds = 0.0f;
539 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600540 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600541 ds_ci.stencilTestEnable = VK_TRUE;
542 ds_ci.front = stencil;
543 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600544
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600545 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600546 pipelineobj.SetViewport(m_viewports);
547 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800548 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600549 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600550 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800551 commandBuffer->BindPipeline(pipelineobj);
552 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500553}
554
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600555class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700556 public:
557 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600558};
559
Ian Elliott2c1daf52016-05-12 09:41:46 -0600560class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700561 public:
562 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600563 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600564};
565
Mark Muellerdfe37552016-07-07 14:47:42 -0600566class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700567 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600568 enum eTestEnFlags {
569 eDoubleDelete,
570 eInvalidDeviceOffset,
571 eInvalidMemoryOffset,
572 eBindNullBuffer,
573 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600574 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600575 };
576
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600577 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600578
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600579 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
580 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600581 return true;
582 }
583 VkDeviceSize offset_limit = 0;
584 if (eInvalidMemoryOffset == aTestFlag) {
585 VkBuffer vulkanBuffer;
586 VkBufferCreateInfo buffer_create_info = {};
587 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
588 buffer_create_info.size = 32;
589 buffer_create_info.usage = aBufferUsage;
590
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600591 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600592 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600593
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600594 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600595 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
596 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600597 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
598 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600599 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600600 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600601 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600602 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600603 }
604 if (eOffsetAlignment < offset_limit) {
605 return true;
606 }
607 return false;
608 }
609
610 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600611 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
612 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600613 if (eBindNullBuffer == aTestFlag) {
614 VulkanMemory = 0;
615 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
616 } else {
617 VkBufferCreateInfo buffer_create_info = {};
618 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
619 buffer_create_info.size = 32;
620 buffer_create_info.usage = aBufferUsage;
621
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600622 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600623
624 CreateCurrent = true;
625
626 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600627 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600628
629 VkMemoryAllocateInfo memory_allocate_info = {};
630 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
631 memory_allocate_info.allocationSize = memory_requirements.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600632 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
633 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600634 if (!pass) {
635 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
636 return;
637 }
638
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600639 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600640 AllocateCurrent = true;
641 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600642 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
643 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600644 BoundCurrent = true;
645
646 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
647 }
648 }
649
650 ~VkBufferTest() {
651 if (CreateCurrent) {
652 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
653 }
654 if (AllocateCurrent) {
655 if (InvalidDeleteEn) {
656 union {
657 VkDeviceMemory device_memory;
658 unsigned long long index_access;
659 } bad_index;
660
661 bad_index.device_memory = VulkanMemory;
662 bad_index.index_access++;
663
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600664 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600665 }
666 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
667 }
668 }
669
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600670 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600671
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600672 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600673
674 void TestDoubleDestroy() {
675 // Destroy the buffer but leave the flag set, which will cause
676 // the buffer to be destroyed again in the destructor.
677 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
678 }
679
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700680 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600681 bool AllocateCurrent;
682 bool BoundCurrent;
683 bool CreateCurrent;
684 bool InvalidDeleteEn;
685
686 VkBuffer VulkanBuffer;
687 VkDevice VulkanDevice;
688 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600689};
690
691class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700692 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600693 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600694 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700695 : BoundCurrent(false),
696 AttributeCount(aAttributeCount),
697 BindingCount(aBindingCount),
698 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600699 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600700 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
701 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700702 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600703
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600704 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
705 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600706
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600707 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
708 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
709 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
710 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
711 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600712
713 unsigned i = 0;
714 do {
715 VertexInputAttributeDescription[i].binding = BindId;
716 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600717 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
718 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600719 i++;
720 } while (AttributeCount < i);
721
722 i = 0;
723 do {
724 VertexInputBindingDescription[i].binding = BindId;
725 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600727 i++;
728 } while (BindingCount < i);
729 }
730
731 ~VkVerticesObj() {
732 if (VertexInputAttributeDescription) {
733 delete[] VertexInputAttributeDescription;
734 }
735 if (VertexInputBindingDescription) {
736 delete[] VertexInputBindingDescription;
737 }
738 }
739
740 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600741 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
742 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600743 return true;
744 }
745
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600746 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600747 VkDeviceSize *offsetList;
748 unsigned offsetCount;
749
750 if (aOffsetCount) {
751 offsetList = aOffsetList;
752 offsetCount = aOffsetCount;
753 } else {
754 offsetList = new VkDeviceSize[1]();
755 offsetCount = 1;
756 }
757
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600758 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600759 BoundCurrent = true;
760
761 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600762 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600763 }
764 }
765
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700766 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600767 static uint32_t BindIdGenerator;
768
769 bool BoundCurrent;
770 unsigned AttributeCount;
771 unsigned BindingCount;
772 uint32_t BindId;
773
774 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
775 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
776 VkVertexInputBindingDescription *VertexInputBindingDescription;
777 VkConstantBufferObj VulkanMemoryBuffer;
778};
779
780uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500781// ********************************************************************************************************************
782// ********************************************************************************************************************
783// ********************************************************************************************************************
784// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600785TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700786 TEST_DESCRIPTION(
787 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
788 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600789
790 ASSERT_NO_FATAL_FAILURE(InitState());
791
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600793 // Specify NULL for a pointer to a handle
794 // Expected to trigger an error with
795 // parameter_validation::validate_required_pointer
796 vkGetPhysicalDeviceFeatures(gpu(), NULL);
797 m_errorMonitor->VerifyFound();
798
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
800 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600801 // Specify NULL for pointer to array count
802 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600803 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600804 m_errorMonitor->VerifyFound();
805
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600807 // Specify 0 for a required array count
808 // Expected to trigger an error with parameter_validation::validate_array
809 VkViewport view_port = {};
810 m_commandBuffer->SetViewport(0, 0, &view_port);
811 m_errorMonitor->VerifyFound();
812
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600814 // Specify NULL for a required array
815 // Expected to trigger an error with parameter_validation::validate_array
816 m_commandBuffer->SetViewport(0, 1, NULL);
817 m_errorMonitor->VerifyFound();
818
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600820 // Specify VK_NULL_HANDLE for a required handle
821 // Expected to trigger an error with
822 // parameter_validation::validate_required_handle
823 vkUnmapMemory(device(), VK_NULL_HANDLE);
824 m_errorMonitor->VerifyFound();
825
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
827 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600828 // Specify VK_NULL_HANDLE for a required handle array entry
829 // Expected to trigger an error with
830 // parameter_validation::validate_required_handle_array
831 VkFence fence = VK_NULL_HANDLE;
832 vkResetFences(device(), 1, &fence);
833 m_errorMonitor->VerifyFound();
834
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600836 // Specify NULL for a required struct pointer
837 // Expected to trigger an error with
838 // parameter_validation::validate_struct_type
839 VkDeviceMemory memory = VK_NULL_HANDLE;
840 vkAllocateMemory(device(), NULL, NULL, &memory);
841 m_errorMonitor->VerifyFound();
842
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600844 // Specify 0 for a required VkFlags parameter
845 // Expected to trigger an error with parameter_validation::validate_flags
846 m_commandBuffer->SetStencilReference(0, 0);
847 m_errorMonitor->VerifyFound();
848
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600849 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 -0600850 // Specify 0 for a required VkFlags array entry
851 // Expected to trigger an error with
852 // parameter_validation::validate_flags_array
853 VkSemaphore semaphore = VK_NULL_HANDLE;
854 VkPipelineStageFlags stageFlags = 0;
855 VkSubmitInfo submitInfo = {};
856 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
857 submitInfo.waitSemaphoreCount = 1;
858 submitInfo.pWaitSemaphores = &semaphore;
859 submitInfo.pWaitDstStageMask = &stageFlags;
860 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
861 m_errorMonitor->VerifyFound();
862}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600863
Dustin Gravesfce74c02016-05-10 11:42:58 -0600864TEST_F(VkLayerTest, ReservedParameter) {
865 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
866
867 ASSERT_NO_FATAL_FAILURE(InitState());
868
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600870 // Specify 0 for a reserved VkFlags parameter
871 // Expected to trigger an error with
872 // parameter_validation::validate_reserved_flags
873 VkEvent event_handle = VK_NULL_HANDLE;
874 VkEventCreateInfo event_info = {};
875 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
876 event_info.flags = 1;
877 vkCreateEvent(device(), &event_info, NULL, &event_handle);
878 m_errorMonitor->VerifyFound();
879}
880
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600881TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700882 TEST_DESCRIPTION(
883 "Specify an invalid VkStructureType for a Vulkan "
884 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600885
886 ASSERT_NO_FATAL_FAILURE(InitState());
887
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600889 // Zero struct memory, effectively setting sType to
890 // VK_STRUCTURE_TYPE_APPLICATION_INFO
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkMemoryAllocateInfo alloc_info = {};
894 VkDeviceMemory memory = VK_NULL_HANDLE;
895 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
896 m_errorMonitor->VerifyFound();
897
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600899 // Zero struct memory, effectively setting sType to
900 // VK_STRUCTURE_TYPE_APPLICATION_INFO
901 // Expected to trigger an error with
902 // parameter_validation::validate_struct_type_array
903 VkSubmitInfo submit_info = {};
904 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
905 m_errorMonitor->VerifyFound();
906}
907
908TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600909 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600910
911 ASSERT_NO_FATAL_FAILURE(InitState());
912
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600914 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600915 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600916 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600917 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600918 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600919 // Zero-initialization will provide the correct sType
920 VkApplicationInfo app_info = {};
921 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
922 event_alloc_info.pNext = &app_info;
923 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
924 m_errorMonitor->VerifyFound();
925
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
927 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600928 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
929 // a function that has allowed pNext structure types and specify
930 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600931 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600932 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600933 VkMemoryAllocateInfo memory_alloc_info = {};
934 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
935 memory_alloc_info.pNext = &app_info;
936 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600937 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600938}
Dustin Graves5d33d532016-05-09 16:21:12 -0600939
940TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600941 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600942
943 ASSERT_NO_FATAL_FAILURE(InitState());
944
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
946 "does not fall within the begin..end "
947 "range of the core VkFormat "
948 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600949 // Specify an invalid VkFormat value
950 // Expected to trigger an error with
951 // parameter_validation::validate_ranged_enum
952 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600953 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600954 m_errorMonitor->VerifyFound();
955
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600956 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 -0600957 // Specify an invalid VkFlags bitmask value
958 // Expected to trigger an error with parameter_validation::validate_flags
959 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600960 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
961 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600962 m_errorMonitor->VerifyFound();
963
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600964 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 -0600965 // Specify an invalid VkFlags array entry
966 // Expected to trigger an error with
967 // parameter_validation::validate_flags_array
968 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600969 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -0600970 VkSubmitInfo submit_info = {};
971 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
972 submit_info.waitSemaphoreCount = 1;
973 submit_info.pWaitSemaphores = &semaphore;
974 submit_info.pWaitDstStageMask = &stage_flags;
975 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
976 m_errorMonitor->VerifyFound();
977
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -0600979 // Specify an invalid VkBool32 value
980 // Expected to trigger a warning with
981 // parameter_validation::validate_bool32
982 VkSampler sampler = VK_NULL_HANDLE;
983 VkSamplerCreateInfo sampler_info = {};
984 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
985 sampler_info.pNext = NULL;
986 sampler_info.magFilter = VK_FILTER_NEAREST;
987 sampler_info.minFilter = VK_FILTER_NEAREST;
988 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
989 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
990 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
991 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
992 sampler_info.mipLodBias = 1.0;
993 sampler_info.maxAnisotropy = 1;
994 sampler_info.compareEnable = VK_FALSE;
995 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
996 sampler_info.minLod = 1.0;
997 sampler_info.maxLod = 1.0;
998 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
999 sampler_info.unnormalizedCoordinates = VK_FALSE;
1000 // Not VK_TRUE or VK_FALSE
1001 sampler_info.anisotropyEnable = 3;
1002 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1003 m_errorMonitor->VerifyFound();
1004}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001005
1006TEST_F(VkLayerTest, FailedReturnValue) {
1007 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1008
1009 ASSERT_NO_FATAL_FAILURE(InitState());
1010
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001011 // Find an unsupported image format
1012 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1013 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1014 VkFormat format = static_cast<VkFormat>(f);
1015 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001016 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001017 unsupported = format;
1018 break;
1019 }
1020 }
1021
1022 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1024 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001025 // Specify an unsupported VkFormat value to generate a
1026 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1027 // Expected to trigger a warning from
1028 // parameter_validation::validate_result
1029 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001030 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1031 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001032 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1033 m_errorMonitor->VerifyFound();
1034 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001035}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001036
1037TEST_F(VkLayerTest, UpdateBufferAlignment) {
1038 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001039 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001040
1041 ASSERT_NO_FATAL_FAILURE(InitState());
1042
1043 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1044 vk_testing::Buffer buffer;
1045 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1046
Tony Barbour552f6c02016-12-21 14:34:07 -07001047 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001048 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001050 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1051 m_errorMonitor->VerifyFound();
1052
1053 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001055 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1056 m_errorMonitor->VerifyFound();
1057
1058 // Introduce failure by using dataSize that is < 0
1059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001060 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001061 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1062 m_errorMonitor->VerifyFound();
1063
1064 // Introduce failure by using dataSize that is > 65536
1065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001066 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001067 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1068 m_errorMonitor->VerifyFound();
1069
Tony Barbour552f6c02016-12-21 14:34:07 -07001070 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001071}
1072
1073TEST_F(VkLayerTest, FillBufferAlignment) {
1074 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1075
1076 ASSERT_NO_FATAL_FAILURE(InitState());
1077
1078 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1079 vk_testing::Buffer buffer;
1080 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1081
Tony Barbour552f6c02016-12-21 14:34:07 -07001082 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001083
1084 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001086 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1087 m_errorMonitor->VerifyFound();
1088
1089 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001091 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1092 m_errorMonitor->VerifyFound();
1093
1094 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001096 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1097 m_errorMonitor->VerifyFound();
1098
Tony Barbour552f6c02016-12-21 14:34:07 -07001099 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001100}
Dustin Graves40f35822016-06-23 11:12:53 -06001101
Cortd889ff92016-07-27 09:51:27 -07001102TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1103 VkResult err;
1104
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001105 TEST_DESCRIPTION(
1106 "Attempt to use a non-solid polygon fill mode in a "
1107 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001108
1109 ASSERT_NO_FATAL_FAILURE(InitState());
1110 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1111
1112 std::vector<const char *> device_extension_names;
1113 auto features = m_device->phy().features();
1114 // Artificially disable support for non-solid fill modes
1115 features.fillModeNonSolid = false;
1116 // The sacrificial device object
1117 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1118
1119 VkRenderpassObj render_pass(&test_device);
1120
1121 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1122 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1123 pipeline_layout_ci.setLayoutCount = 0;
1124 pipeline_layout_ci.pSetLayouts = NULL;
1125
1126 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001127 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001128 ASSERT_VK_SUCCESS(err);
1129
1130 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1131 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1132 rs_ci.pNext = nullptr;
1133 rs_ci.lineWidth = 1.0f;
1134 rs_ci.rasterizerDiscardEnable = true;
1135
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001136 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1137 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001138
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001139 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1141 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001142 {
1143 VkPipelineObj pipe(&test_device);
1144 pipe.AddShader(&vs);
1145 pipe.AddShader(&fs);
1146 pipe.AddColorAttachment();
1147 // Introduce failure by setting unsupported polygon mode
1148 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1149 pipe.SetRasterization(&rs_ci);
1150 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1151 }
1152 m_errorMonitor->VerifyFound();
1153
1154 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1156 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001157 {
1158 VkPipelineObj pipe(&test_device);
1159 pipe.AddShader(&vs);
1160 pipe.AddShader(&fs);
1161 pipe.AddColorAttachment();
1162 // Introduce failure by setting unsupported polygon mode
1163 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1164 pipe.SetRasterization(&rs_ci);
1165 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1166 }
1167 m_errorMonitor->VerifyFound();
1168
Cortd889ff92016-07-27 09:51:27 -07001169 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1170}
1171
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001172#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001173TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001174{
1175 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001176 VkFenceCreateInfo fenceInfo = {};
1177 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1178 fenceInfo.pNext = NULL;
1179 fenceInfo.flags = 0;
1180
Mike Weiblencce7ec72016-10-17 19:33:05 -06001181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001182
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001183 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001184
1185 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1186 vk_testing::Buffer buffer;
1187 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001188
Tony Barbourfe3351b2015-07-28 10:17:20 -06001189 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001190 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001191 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001192
1193 testFence.init(*m_device, fenceInfo);
1194
1195 // Bypass framework since it does the waits automatically
1196 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001197 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001198 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1199 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001200 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001201 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001202 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001203 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001204 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001205 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001206 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001207
1208 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001209 ASSERT_VK_SUCCESS( err );
1210
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001211 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001212 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001213
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001214 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001215}
1216
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001217TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001218{
1219 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001220 VkFenceCreateInfo fenceInfo = {};
1221 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1222 fenceInfo.pNext = NULL;
1223 fenceInfo.flags = 0;
1224
Mike Weiblencce7ec72016-10-17 19:33:05 -06001225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001226
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001227 ASSERT_NO_FATAL_FAILURE(InitState());
1228 ASSERT_NO_FATAL_FAILURE(InitViewport());
1229 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1230
Tony Barbourfe3351b2015-07-28 10:17:20 -06001231 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001232 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001233 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001234
1235 testFence.init(*m_device, fenceInfo);
1236
1237 // Bypass framework since it does the waits automatically
1238 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001239 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001240 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1241 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001242 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001243 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001244 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001245 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001246 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001247 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001248 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001249
1250 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001251 ASSERT_VK_SUCCESS( err );
1252
Jon Ashburnf19916e2016-01-11 13:12:43 -07001253 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001254 VkCommandBufferBeginInfo info = {};
1255 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1256 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001257 info.renderPass = VK_NULL_HANDLE;
1258 info.subpass = 0;
1259 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001260 info.occlusionQueryEnable = VK_FALSE;
1261 info.queryFlags = 0;
1262 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001263
1264 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001265 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001266
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001267 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001268}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001269#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001270
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001271TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1272 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1273
1274 ASSERT_NO_FATAL_FAILURE(InitState());
1275
1276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1277 VkBuffer buffer;
1278 VkBufferCreateInfo buf_info = {};
1279 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1280 buf_info.pNext = NULL;
1281 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1282 buf_info.size = 2048;
1283 buf_info.queueFamilyIndexCount = 0;
1284 buf_info.pQueueFamilyIndices = NULL;
1285 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1286 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1287 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1288 m_errorMonitor->VerifyFound();
1289
1290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1291 VkImage image;
1292 VkImageCreateInfo image_create_info = {};
1293 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1294 image_create_info.pNext = NULL;
1295 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1296 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1297 image_create_info.extent.width = 512;
1298 image_create_info.extent.height = 64;
1299 image_create_info.extent.depth = 1;
1300 image_create_info.mipLevels = 1;
1301 image_create_info.arrayLayers = 1;
1302 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1303 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1304 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1305 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1306 image_create_info.queueFamilyIndexCount = 0;
1307 image_create_info.pQueueFamilyIndices = NULL;
1308 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1309 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1310 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1311 m_errorMonitor->VerifyFound();
1312}
1313
Dave Houlton829c0d82017-01-24 15:09:17 -07001314TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1315 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1316
1317 // Determine which device feature are available
1318 VkPhysicalDeviceFeatures available_features;
1319 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1320
1321 // Mask out device features we don't want
1322 VkPhysicalDeviceFeatures desired_features = available_features;
1323 desired_features.sparseResidencyImage2D = VK_FALSE;
1324 desired_features.sparseResidencyImage3D = VK_FALSE;
1325 ASSERT_NO_FATAL_FAILURE(InitState(&desired_features));
1326
1327 VkImage image = VK_NULL_HANDLE;
1328 VkResult result = VK_RESULT_MAX_ENUM;
1329 VkImageCreateInfo image_create_info = {};
1330 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1331 image_create_info.pNext = NULL;
1332 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1333 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1334 image_create_info.extent.width = 512;
1335 image_create_info.extent.height = 1;
1336 image_create_info.extent.depth = 1;
1337 image_create_info.mipLevels = 1;
1338 image_create_info.arrayLayers = 1;
1339 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1340 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1341 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1342 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1343 image_create_info.queueFamilyIndexCount = 0;
1344 image_create_info.pQueueFamilyIndices = NULL;
1345 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1346 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1347
1348 // 1D image w/ sparse residency is an error
1349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1350 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1351 m_errorMonitor->VerifyFound();
1352 if (VK_SUCCESS == result) {
1353 vkDestroyImage(m_device->device(), image, NULL);
1354 image = VK_NULL_HANDLE;
1355 }
1356
1357 // 2D image w/ sparse residency when feature isn't available
1358 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1359 image_create_info.extent.height = 64;
1360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1361 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1362 m_errorMonitor->VerifyFound();
1363 if (VK_SUCCESS == result) {
1364 vkDestroyImage(m_device->device(), image, NULL);
1365 image = VK_NULL_HANDLE;
1366 }
1367
1368 // 3D image w/ sparse residency when feature isn't available
1369 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1370 image_create_info.extent.depth = 8;
1371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1372 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1373 m_errorMonitor->VerifyFound();
1374 if (VK_SUCCESS == result) {
1375 vkDestroyImage(m_device->device(), image, NULL);
1376 image = VK_NULL_HANDLE;
1377 }
1378}
1379
1380TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1381 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1382
1383 // Determine which device feature are available
1384 VkPhysicalDeviceFeatures available_features;
1385 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1386
1387 // These tests all require that the device support sparse residency for 2D images
1388 if (VK_TRUE != available_features.sparseResidencyImage2D) {
1389 return;
1390 }
1391
1392 // Mask out device features we don't want
1393 VkPhysicalDeviceFeatures desired_features = available_features;
1394 desired_features.sparseResidency2Samples = VK_FALSE;
1395 desired_features.sparseResidency4Samples = VK_FALSE;
1396 desired_features.sparseResidency8Samples = VK_FALSE;
1397 desired_features.sparseResidency16Samples = VK_FALSE;
1398 ASSERT_NO_FATAL_FAILURE(InitState(&desired_features));
1399
1400 VkImage image = VK_NULL_HANDLE;
1401 VkResult result = VK_RESULT_MAX_ENUM;
1402 VkImageCreateInfo image_create_info = {};
1403 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1404 image_create_info.pNext = NULL;
1405 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1406 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1407 image_create_info.extent.width = 64;
1408 image_create_info.extent.height = 64;
1409 image_create_info.extent.depth = 1;
1410 image_create_info.mipLevels = 1;
1411 image_create_info.arrayLayers = 1;
1412 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1413 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1414 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1415 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1416 image_create_info.queueFamilyIndexCount = 0;
1417 image_create_info.pQueueFamilyIndices = NULL;
1418 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1419 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1420
1421 // 2D image w/ sparse residency and linear tiling is an error
1422 m_errorMonitor->SetDesiredFailureMsg(
1423 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1424 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1425 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1426 m_errorMonitor->VerifyFound();
1427 if (VK_SUCCESS == result) {
1428 vkDestroyImage(m_device->device(), image, NULL);
1429 image = VK_NULL_HANDLE;
1430 }
1431 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1432
1433 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1434 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1436 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1437 m_errorMonitor->VerifyFound();
1438 if (VK_SUCCESS == result) {
1439 vkDestroyImage(m_device->device(), image, NULL);
1440 image = VK_NULL_HANDLE;
1441 }
1442
1443 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1445 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1446 m_errorMonitor->VerifyFound();
1447 if (VK_SUCCESS == result) {
1448 vkDestroyImage(m_device->device(), image, NULL);
1449 image = VK_NULL_HANDLE;
1450 }
1451
1452 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1454 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1455 m_errorMonitor->VerifyFound();
1456 if (VK_SUCCESS == result) {
1457 vkDestroyImage(m_device->device(), image, NULL);
1458 image = VK_NULL_HANDLE;
1459 }
1460
1461 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1463 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1464 m_errorMonitor->VerifyFound();
1465 if (VK_SUCCESS == result) {
1466 vkDestroyImage(m_device->device(), image, NULL);
1467 image = VK_NULL_HANDLE;
1468 }
1469}
1470
Tobin Ehlisf11be982016-05-11 13:52:53 -06001471TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001472 TEST_DESCRIPTION(
1473 "Create a buffer and image, allocate memory, and bind the "
1474 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001475 VkResult err;
1476 bool pass;
1477 ASSERT_NO_FATAL_FAILURE(InitState());
1478
Tobin Ehlis077ded32016-05-12 17:39:13 -06001479 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001480 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001481 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001482 VkDeviceMemory mem; // buffer will be bound first
1483 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001484 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001485 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001486
1487 VkBufferCreateInfo buf_info = {};
1488 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1489 buf_info.pNext = NULL;
1490 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1491 buf_info.size = 256;
1492 buf_info.queueFamilyIndexCount = 0;
1493 buf_info.pQueueFamilyIndices = NULL;
1494 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1495 buf_info.flags = 0;
1496 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1497 ASSERT_VK_SUCCESS(err);
1498
Tobin Ehlis077ded32016-05-12 17:39:13 -06001499 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001500
1501 VkImageCreateInfo image_create_info = {};
1502 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1503 image_create_info.pNext = NULL;
1504 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1505 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1506 image_create_info.extent.width = 64;
1507 image_create_info.extent.height = 64;
1508 image_create_info.extent.depth = 1;
1509 image_create_info.mipLevels = 1;
1510 image_create_info.arrayLayers = 1;
1511 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001512 // Image tiling must be optimal to trigger error when aliasing linear buffer
1513 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001514 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1515 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1516 image_create_info.queueFamilyIndexCount = 0;
1517 image_create_info.pQueueFamilyIndices = NULL;
1518 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1519 image_create_info.flags = 0;
1520
Tobin Ehlisf11be982016-05-11 13:52:53 -06001521 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1522 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001523 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1524 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001525
Tobin Ehlis077ded32016-05-12 17:39:13 -06001526 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1527
1528 VkMemoryAllocateInfo alloc_info = {};
1529 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1530 alloc_info.pNext = NULL;
1531 alloc_info.memoryTypeIndex = 0;
1532 // Ensure memory is big enough for both bindings
1533 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001534 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1535 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001536 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001537 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001538 vkDestroyImage(m_device->device(), image, NULL);
1539 return;
1540 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001541 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1542 ASSERT_VK_SUCCESS(err);
1543 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1544 ASSERT_VK_SUCCESS(err);
1545
Rene Lindsayd14f5572016-12-16 14:57:18 -07001546 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1547
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001549 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001550 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1551 m_errorMonitor->VerifyFound();
1552
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001553 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001554 // aliasing buffer2
1555 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1556 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001557 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1558 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001559 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001560 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001562 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001563 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001564 m_errorMonitor->VerifyFound();
1565
1566 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001567 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001568 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001569 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001570 vkFreeMemory(m_device->device(), mem, NULL);
1571 vkFreeMemory(m_device->device(), mem_img, NULL);
1572}
1573
Tobin Ehlis35372522016-05-12 08:32:31 -06001574TEST_F(VkLayerTest, InvalidMemoryMapping) {
1575 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1576 VkResult err;
1577 bool pass;
1578 ASSERT_NO_FATAL_FAILURE(InitState());
1579
1580 VkBuffer buffer;
1581 VkDeviceMemory mem;
1582 VkMemoryRequirements mem_reqs;
1583
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001584 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1585
Tobin Ehlis35372522016-05-12 08:32:31 -06001586 VkBufferCreateInfo buf_info = {};
1587 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1588 buf_info.pNext = NULL;
1589 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1590 buf_info.size = 256;
1591 buf_info.queueFamilyIndexCount = 0;
1592 buf_info.pQueueFamilyIndices = NULL;
1593 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1594 buf_info.flags = 0;
1595 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1596 ASSERT_VK_SUCCESS(err);
1597
1598 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1599 VkMemoryAllocateInfo alloc_info = {};
1600 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1601 alloc_info.pNext = NULL;
1602 alloc_info.memoryTypeIndex = 0;
1603
1604 // Ensure memory is big enough for both bindings
1605 static const VkDeviceSize allocation_size = 0x10000;
1606 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001607 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 -06001608 if (!pass) {
1609 vkDestroyBuffer(m_device->device(), buffer, NULL);
1610 return;
1611 }
1612 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1613 ASSERT_VK_SUCCESS(err);
1614
1615 uint8_t *pData;
1616 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001617 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 -06001618 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1619 m_errorMonitor->VerifyFound();
1620 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001621 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001622 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1624 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1625 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001626 m_errorMonitor->VerifyFound();
1627
1628 // Unmap the memory to avoid re-map error
1629 vkUnmapMemory(m_device->device(), mem);
1630 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1632 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1633 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001634 m_errorMonitor->VerifyFound();
1635 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1637 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001638 m_errorMonitor->VerifyFound();
1639 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001640 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001641 vkUnmapMemory(m_device->device(), mem);
1642 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001643
Tobin Ehlis35372522016-05-12 08:32:31 -06001644 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001645 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001646 ASSERT_VK_SUCCESS(err);
1647 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001648 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001649 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001650 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001652 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1653 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001654
Tobin Ehlis35372522016-05-12 08:32:31 -06001655 // Now flush range that oversteps mapped range
1656 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001657 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001658 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001659 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001660 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1662 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1663 m_errorMonitor->VerifyFound();
1664
1665 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1666 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001667 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001668 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001669 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001670 mmr.size = VK_WHOLE_SIZE;
1671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001672 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1673 m_errorMonitor->VerifyFound();
1674
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001675#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001676 // Some platforms have an atomsize of 1 which makes the test meaningless
1677 if (atom_size > 3) {
1678 // Now with an offset NOT a multiple of the device limit
1679 vkUnmapMemory(m_device->device(), mem);
1680 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1681 ASSERT_VK_SUCCESS(err);
1682 mmr.offset = 3; // Not a multiple of atom_size
1683 mmr.size = VK_WHOLE_SIZE;
1684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1685 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1686 m_errorMonitor->VerifyFound();
1687
1688 // Now with a size NOT a multiple of the device limit
1689 vkUnmapMemory(m_device->device(), mem);
1690 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1691 ASSERT_VK_SUCCESS(err);
1692 mmr.offset = atom_size;
1693 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1695 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1696 m_errorMonitor->VerifyFound();
1697 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001698#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001699 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1700 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001701 if (!pass) {
1702 vkFreeMemory(m_device->device(), mem, NULL);
1703 vkDestroyBuffer(m_device->device(), buffer, NULL);
1704 return;
1705 }
1706 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1707 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1708
1709 vkDestroyBuffer(m_device->device(), buffer, NULL);
1710 vkFreeMemory(m_device->device(), mem, NULL);
1711}
1712
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001713#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001714TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1715 VkResult err;
1716 bool pass;
1717
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001718 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1719 // following declaration (which is temporarily being moved below):
1720 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001721 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001722 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001723 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001724 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001725 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001726 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001727
1728 ASSERT_NO_FATAL_FAILURE(InitState());
1729
Ian Elliott3f06ce52016-04-29 14:46:21 -06001730#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1731#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1732 // Use the functions from the VK_KHR_android_surface extension without
1733 // enabling that extension:
1734
1735 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001736 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1738 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001739 pass = (err != VK_SUCCESS);
1740 ASSERT_TRUE(pass);
1741 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001742#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001743
Ian Elliott3f06ce52016-04-29 14:46:21 -06001744#if defined(VK_USE_PLATFORM_MIR_KHR)
1745 // Use the functions from the VK_KHR_mir_surface extension without enabling
1746 // that extension:
1747
1748 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001749 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001750 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001751 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1752 pass = (err != VK_SUCCESS);
1753 ASSERT_TRUE(pass);
1754 m_errorMonitor->VerifyFound();
1755
1756 // Tell whether an mir_connection supports presentation:
1757 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001758 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1759 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001760 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001761#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001762
Ian Elliott3f06ce52016-04-29 14:46:21 -06001763#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1764 // Use the functions from the VK_KHR_wayland_surface extension without
1765 // enabling that extension:
1766
1767 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001768 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
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 = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001771 pass = (err != VK_SUCCESS);
1772 ASSERT_TRUE(pass);
1773 m_errorMonitor->VerifyFound();
1774
1775 // Tell whether an wayland_display supports presentation:
1776 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1778 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001779 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001780#endif // VK_USE_PLATFORM_WAYLAND_KHR
1781#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001782
Ian Elliott3f06ce52016-04-29 14:46:21 -06001783#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001784 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1785 // TO NON-LINUX PLATFORMS:
1786 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001787 // Use the functions from the VK_KHR_win32_surface extension without
1788 // enabling that extension:
1789
1790 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001791 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1793 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001794 pass = (err != VK_SUCCESS);
1795 ASSERT_TRUE(pass);
1796 m_errorMonitor->VerifyFound();
1797
1798 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001800 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001801 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001802// Set this (for now, until all platforms are supported and tested):
1803#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001804#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001805#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001806 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1807 // TO NON-LINUX PLATFORMS:
1808 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001809#endif
1810#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001811 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1812 // that extension:
1813
1814 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001815 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001817 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1818 pass = (err != VK_SUCCESS);
1819 ASSERT_TRUE(pass);
1820 m_errorMonitor->VerifyFound();
1821
1822 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001823 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001824 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1826 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001827 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001828// Set this (for now, until all platforms are supported and tested):
1829#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001830#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001831
Ian Elliott12630812016-04-29 14:35:43 -06001832#if defined(VK_USE_PLATFORM_XLIB_KHR)
1833 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1834 // that extension:
1835
1836 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001837 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001839 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1840 pass = (err != VK_SUCCESS);
1841 ASSERT_TRUE(pass);
1842 m_errorMonitor->VerifyFound();
1843
1844 // Tell whether an Xlib VisualID supports presentation:
1845 Display *dpy = NULL;
1846 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001848 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1849 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001850// Set this (for now, until all platforms are supported and tested):
1851#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001852#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001853
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001854// Use the functions from the VK_KHR_surface extension without enabling
1855// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001856
Ian Elliott489eec02016-05-05 14:12:44 -06001857#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001858 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001860 vkDestroySurfaceKHR(instance(), surface, NULL);
1861 m_errorMonitor->VerifyFound();
1862
1863 // Check if surface supports presentation:
1864 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001866 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1867 pass = (err != VK_SUCCESS);
1868 ASSERT_TRUE(pass);
1869 m_errorMonitor->VerifyFound();
1870
1871 // Check surface capabilities:
1872 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1874 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001875 pass = (err != VK_SUCCESS);
1876 ASSERT_TRUE(pass);
1877 m_errorMonitor->VerifyFound();
1878
1879 // Check surface formats:
1880 uint32_t format_count = 0;
1881 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1883 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001884 pass = (err != VK_SUCCESS);
1885 ASSERT_TRUE(pass);
1886 m_errorMonitor->VerifyFound();
1887
1888 // Check surface present modes:
1889 uint32_t present_mode_count = 0;
1890 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1892 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001893 pass = (err != VK_SUCCESS);
1894 ASSERT_TRUE(pass);
1895 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001896#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001897
Ian Elliott1c32c772016-04-28 14:47:13 -06001898 // Use the functions from the VK_KHR_swapchain extension without enabling
1899 // that extension:
1900
1901 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001903 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1904 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001905 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001906 pass = (err != VK_SUCCESS);
1907 ASSERT_TRUE(pass);
1908 m_errorMonitor->VerifyFound();
1909
1910 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1912 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001913 pass = (err != VK_SUCCESS);
1914 ASSERT_TRUE(pass);
1915 m_errorMonitor->VerifyFound();
1916
Chris Forbeseb7d5502016-09-13 18:19:21 +12001917 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1918 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1919 VkFence fence;
1920 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1921
Ian Elliott1c32c772016-04-28 14:47:13 -06001922 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001924 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001925 pass = (err != VK_SUCCESS);
1926 ASSERT_TRUE(pass);
1927 m_errorMonitor->VerifyFound();
1928
Chris Forbeseb7d5502016-09-13 18:19:21 +12001929 vkDestroyFence(m_device->device(), fence, nullptr);
1930
Ian Elliott1c32c772016-04-28 14:47:13 -06001931 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001932 //
1933 // NOTE: Currently can't test this because a real swapchain is needed (as
1934 // opposed to the fake one we created) in order for the layer to lookup the
1935 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001936
1937 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001939 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1940 m_errorMonitor->VerifyFound();
1941}
Chris Forbes09368e42016-10-13 11:59:22 +13001942#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001943
Karl Schultz6addd812016-02-02 17:17:23 -07001944TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1945 VkResult err;
1946 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001947
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1949 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001950
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001951 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001952
1953 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001954 VkImage image;
1955 VkDeviceMemory mem;
1956 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001957
Karl Schultz6addd812016-02-02 17:17:23 -07001958 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1959 const int32_t tex_width = 32;
1960 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001961
Tony Barboureb254902015-07-15 12:50:33 -06001962 VkImageCreateInfo image_create_info = {};
1963 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001964 image_create_info.pNext = NULL;
1965 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1966 image_create_info.format = tex_format;
1967 image_create_info.extent.width = tex_width;
1968 image_create_info.extent.height = tex_height;
1969 image_create_info.extent.depth = 1;
1970 image_create_info.mipLevels = 1;
1971 image_create_info.arrayLayers = 1;
1972 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1973 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1974 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1975 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12001976 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001977
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001978 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001979 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001980 mem_alloc.pNext = NULL;
1981 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001982
Chia-I Wuf7458c52015-10-26 21:10:41 +08001983 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001984 ASSERT_VK_SUCCESS(err);
1985
Karl Schultz6addd812016-02-02 17:17:23 -07001986 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001987
Mark Lobodzinski23065352015-05-29 09:32:35 -05001988 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001989
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001990 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001991 if (!pass) { // If we can't find any unmappable memory this test doesn't
1992 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001993 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001994 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001995 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001996
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001997 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001998 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001999 ASSERT_VK_SUCCESS(err);
2000
2001 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002002 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002003 ASSERT_VK_SUCCESS(err);
2004
2005 // Map memory as if to initialize the image
2006 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002007 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002008
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002009 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002010
Chia-I Wuf7458c52015-10-26 21:10:41 +08002011 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002012 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002013}
2014
Karl Schultz6addd812016-02-02 17:17:23 -07002015TEST_F(VkLayerTest, RebindMemory) {
2016 VkResult err;
2017 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002018
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002020
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002021 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002022
2023 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002024 VkImage image;
2025 VkDeviceMemory mem1;
2026 VkDeviceMemory mem2;
2027 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002028
Karl Schultz6addd812016-02-02 17:17:23 -07002029 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2030 const int32_t tex_width = 32;
2031 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002032
Tony Barboureb254902015-07-15 12:50:33 -06002033 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002034 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2035 image_create_info.pNext = NULL;
2036 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2037 image_create_info.format = tex_format;
2038 image_create_info.extent.width = tex_width;
2039 image_create_info.extent.height = tex_height;
2040 image_create_info.extent.depth = 1;
2041 image_create_info.mipLevels = 1;
2042 image_create_info.arrayLayers = 1;
2043 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2044 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2045 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2046 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002047
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002048 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002049 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2050 mem_alloc.pNext = NULL;
2051 mem_alloc.allocationSize = 0;
2052 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002053
Karl Schultz6addd812016-02-02 17:17:23 -07002054 // Introduce failure, do NOT set memProps to
2055 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002056 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002057 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002058 ASSERT_VK_SUCCESS(err);
2059
Karl Schultz6addd812016-02-02 17:17:23 -07002060 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002061
2062 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002063 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002064 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002065
2066 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002067 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002068 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002069 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002070 ASSERT_VK_SUCCESS(err);
2071
2072 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002073 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002074 ASSERT_VK_SUCCESS(err);
2075
Karl Schultz6addd812016-02-02 17:17:23 -07002076 // Introduce validation failure, try to bind a different memory object to
2077 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002078 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002079
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002080 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002081
Chia-I Wuf7458c52015-10-26 21:10:41 +08002082 vkDestroyImage(m_device->device(), image, NULL);
2083 vkFreeMemory(m_device->device(), mem1, NULL);
2084 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002085}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002086
Karl Schultz6addd812016-02-02 17:17:23 -07002087TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002088 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002089
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2091 "submitted in SIGNALED state. Fences "
2092 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002093
2094 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002095 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2096 fenceInfo.pNext = NULL;
2097 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002098
Tony Barbour300a6082015-04-07 13:44:53 -06002099 ASSERT_NO_FATAL_FAILURE(InitState());
2100 ASSERT_NO_FATAL_FAILURE(InitViewport());
2101 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2102
Tony Barbour552f6c02016-12-21 14:34:07 -07002103 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002104 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002105 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002106
2107 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002108
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002109 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002110 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2111 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002112 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002113 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002114 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002115 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002116 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002117 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002118 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002119
2120 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002121 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002122
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002123 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002124}
Chris Forbes4e44c912016-06-16 10:20:00 +12002125
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002126TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002127 TEST_DESCRIPTION(
2128 "Specify wrong usage for image then create conflicting view of image "
2129 "Initialize buffer with wrong usage then perform copy expecting errors "
2130 "from both the image and the buffer (2 calls)");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002132
2133 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002134
2135 auto format = VK_FORMAT_D24_UNORM_S8_UINT;
2136
Tony Barbourf92621a2016-05-02 14:28:12 -06002137 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002138 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002139 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002140 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002141
Tony Barbourf92621a2016-05-02 14:28:12 -06002142 VkImageView dsv;
2143 VkImageViewCreateInfo dsvci = {};
2144 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2145 dsvci.image = image.handle();
2146 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002147 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002148 dsvci.subresourceRange.layerCount = 1;
2149 dsvci.subresourceRange.baseMipLevel = 0;
2150 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002151 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002152
Tony Barbourf92621a2016-05-02 14:28:12 -06002153 // Create a view with depth / stencil aspect for image with different usage
2154 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002155
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002156 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002157
2158 // Initialize buffer with TRANSFER_DST usage
2159 vk_testing::Buffer buffer;
2160 VkMemoryPropertyFlags reqs = 0;
2161 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2162 VkBufferImageCopy region = {};
2163 region.bufferRowLength = 128;
2164 region.bufferImageHeight = 128;
2165 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2166 region.imageSubresource.layerCount = 1;
2167 region.imageExtent.height = 16;
2168 region.imageExtent.width = 16;
2169 region.imageExtent.depth = 1;
2170
Tony Barbourf92621a2016-05-02 14:28:12 -06002171 // Buffer usage not set to TRANSFER_SRC and image usage not set to
2172 // TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002173 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002174
Chris Forbesda581202016-10-06 18:25:26 +13002175 // two separate errors from this call:
2176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2178
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002179 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2180 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002181 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002182}
Tony Barbour75d79f02016-08-30 09:39:07 -06002183
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002184TEST_F(VkLayerTest, LeakAnObject) {
2185 VkResult err;
2186
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002187 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002188
2189 // Note that we have to create a new device since destroying the
2190 // framework's device causes Teardown() to fail and just calling Teardown
2191 // will destroy the errorMonitor.
2192
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002194
2195 ASSERT_NO_FATAL_FAILURE(InitState());
2196
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002197 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002198 std::vector<VkDeviceQueueCreateInfo> queue_info;
2199 queue_info.reserve(queue_props.size());
2200 std::vector<std::vector<float>> queue_priorities;
2201 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2202 VkDeviceQueueCreateInfo qi = {};
2203 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2204 qi.pNext = NULL;
2205 qi.queueFamilyIndex = i;
2206 qi.queueCount = queue_props[i].queueCount;
2207 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2208 qi.pQueuePriorities = queue_priorities[i].data();
2209 queue_info.push_back(qi);
2210 }
2211
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002212 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002213
2214 // The sacrificial device object
2215 VkDevice testDevice;
2216 VkDeviceCreateInfo device_create_info = {};
2217 auto features = m_device->phy().features();
2218 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2219 device_create_info.pNext = NULL;
2220 device_create_info.queueCreateInfoCount = queue_info.size();
2221 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002222 device_create_info.enabledLayerCount = 0;
2223 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002224 device_create_info.pEnabledFeatures = &features;
2225 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2226 ASSERT_VK_SUCCESS(err);
2227
2228 VkFence fence;
2229 VkFenceCreateInfo fence_create_info = {};
2230 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2231 fence_create_info.pNext = NULL;
2232 fence_create_info.flags = 0;
2233 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2234 ASSERT_VK_SUCCESS(err);
2235
2236 // Induce failure by not calling vkDestroyFence
2237 vkDestroyDevice(testDevice, NULL);
2238 m_errorMonitor->VerifyFound();
2239}
2240
2241TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002242 TEST_DESCRIPTION(
2243 "Allocate command buffers from one command pool and "
2244 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002245
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002246 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002247
Cody Northropc31a84f2016-08-22 10:41:47 -06002248 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002249 VkCommandPool command_pool_one;
2250 VkCommandPool command_pool_two;
2251
2252 VkCommandPoolCreateInfo pool_create_info{};
2253 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2254 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2255 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2256
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002257 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002258
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002259 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002260
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002261 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002262 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002263 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002264 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002265 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002266 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002267 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002268
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002269 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002270
2271 m_errorMonitor->VerifyFound();
2272
2273 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2274 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2275}
2276
2277TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2278 VkResult err;
2279
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002280 TEST_DESCRIPTION(
2281 "Allocate descriptor sets from one DS pool and "
2282 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002283
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002285
2286 ASSERT_NO_FATAL_FAILURE(InitState());
2287 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2288
2289 VkDescriptorPoolSize ds_type_count = {};
2290 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2291 ds_type_count.descriptorCount = 1;
2292
2293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2295 ds_pool_ci.pNext = NULL;
2296 ds_pool_ci.flags = 0;
2297 ds_pool_ci.maxSets = 1;
2298 ds_pool_ci.poolSizeCount = 1;
2299 ds_pool_ci.pPoolSizes = &ds_type_count;
2300
2301 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002302 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002303 ASSERT_VK_SUCCESS(err);
2304
2305 // Create a second descriptor pool
2306 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002307 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002308 ASSERT_VK_SUCCESS(err);
2309
2310 VkDescriptorSetLayoutBinding dsl_binding = {};
2311 dsl_binding.binding = 0;
2312 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2313 dsl_binding.descriptorCount = 1;
2314 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2315 dsl_binding.pImmutableSamplers = NULL;
2316
2317 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2318 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2319 ds_layout_ci.pNext = NULL;
2320 ds_layout_ci.bindingCount = 1;
2321 ds_layout_ci.pBindings = &dsl_binding;
2322
2323 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002324 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002325 ASSERT_VK_SUCCESS(err);
2326
2327 VkDescriptorSet descriptorSet;
2328 VkDescriptorSetAllocateInfo alloc_info = {};
2329 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2330 alloc_info.descriptorSetCount = 1;
2331 alloc_info.descriptorPool = ds_pool_one;
2332 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002333 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002334 ASSERT_VK_SUCCESS(err);
2335
2336 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2337
2338 m_errorMonitor->VerifyFound();
2339
2340 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2341 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2342 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2343}
2344
2345TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002347
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002348 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002349
2350 ASSERT_NO_FATAL_FAILURE(InitState());
2351
2352 // Pass bogus handle into GetImageMemoryRequirements
2353 VkMemoryRequirements mem_reqs;
2354 uint64_t fakeImageHandle = 0xCADECADE;
2355 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2356
2357 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2358
2359 m_errorMonitor->VerifyFound();
2360}
2361
Karl Schultz6addd812016-02-02 17:17:23 -07002362TEST_F(VkLayerTest, PipelineNotBound) {
2363 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002364
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002365 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002366
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002368
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002369 ASSERT_NO_FATAL_FAILURE(InitState());
2370 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002371
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002372 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002373 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2374 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002375
2376 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002377 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2378 ds_pool_ci.pNext = NULL;
2379 ds_pool_ci.maxSets = 1;
2380 ds_pool_ci.poolSizeCount = 1;
2381 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002382
2383 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002384 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002385 ASSERT_VK_SUCCESS(err);
2386
2387 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002388 dsl_binding.binding = 0;
2389 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2390 dsl_binding.descriptorCount = 1;
2391 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2392 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002393
2394 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002395 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2396 ds_layout_ci.pNext = NULL;
2397 ds_layout_ci.bindingCount = 1;
2398 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002399
2400 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002401 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002402 ASSERT_VK_SUCCESS(err);
2403
2404 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002405 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002406 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002407 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002408 alloc_info.descriptorPool = ds_pool;
2409 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002410 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002411 ASSERT_VK_SUCCESS(err);
2412
2413 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002414 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2415 pipeline_layout_ci.pNext = NULL;
2416 pipeline_layout_ci.setLayoutCount = 1;
2417 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002418
2419 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002420 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002421 ASSERT_VK_SUCCESS(err);
2422
Mark Youngad779052016-01-06 14:26:04 -07002423 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002424
Tony Barbour552f6c02016-12-21 14:34:07 -07002425 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002426 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002427
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002428 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002429
Chia-I Wuf7458c52015-10-26 21:10:41 +08002430 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2431 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2432 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002433}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002434
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002435TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2436 VkResult err;
2437
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002438 TEST_DESCRIPTION(
2439 "Test validation check for an invalid memory type index "
2440 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002441
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002442 ASSERT_NO_FATAL_FAILURE(InitState());
2443
2444 // Create an image, allocate memory, set a bad typeIndex and then try to
2445 // bind it
2446 VkImage image;
2447 VkDeviceMemory mem;
2448 VkMemoryRequirements mem_reqs;
2449 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2450 const int32_t tex_width = 32;
2451 const int32_t tex_height = 32;
2452
2453 VkImageCreateInfo image_create_info = {};
2454 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_OPTIMAL;
2465 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2466 image_create_info.flags = 0;
2467
2468 VkMemoryAllocateInfo mem_alloc = {};
2469 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2470 mem_alloc.pNext = NULL;
2471 mem_alloc.allocationSize = 0;
2472 mem_alloc.memoryTypeIndex = 0;
2473
2474 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2475 ASSERT_VK_SUCCESS(err);
2476
2477 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2478 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002479
2480 // Introduce Failure, select invalid TypeIndex
2481 VkPhysicalDeviceMemoryProperties memory_info;
2482
2483 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2484 unsigned int i;
2485 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2486 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2487 mem_alloc.memoryTypeIndex = i;
2488 break;
2489 }
2490 }
2491 if (i >= memory_info.memoryTypeCount) {
2492 printf("No invalid memory type index could be found; skipped.\n");
2493 vkDestroyImage(m_device->device(), image, NULL);
2494 return;
2495 }
2496
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002497 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 -06002498
2499 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2500 ASSERT_VK_SUCCESS(err);
2501
2502 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2503 (void)err;
2504
2505 m_errorMonitor->VerifyFound();
2506
2507 vkDestroyImage(m_device->device(), image, NULL);
2508 vkFreeMemory(m_device->device(), mem, NULL);
2509}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002510
Karl Schultz6addd812016-02-02 17:17:23 -07002511TEST_F(VkLayerTest, BindInvalidMemory) {
2512 VkResult err;
2513 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002514
2515 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002516
Cortf801b982017-01-17 18:10:21 -08002517 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -07002518 const int32_t tex_width = 32;
2519 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002520
2521 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002522 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2523 image_create_info.pNext = NULL;
2524 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2525 image_create_info.format = tex_format;
2526 image_create_info.extent.width = tex_width;
2527 image_create_info.extent.height = tex_height;
2528 image_create_info.extent.depth = 1;
2529 image_create_info.mipLevels = 1;
2530 image_create_info.arrayLayers = 1;
2531 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002532 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002533 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2534 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002535
Cortf801b982017-01-17 18:10:21 -08002536 VkBufferCreateInfo buffer_create_info = {};
2537 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2538 buffer_create_info.pNext = NULL;
2539 buffer_create_info.flags = 0;
2540 buffer_create_info.size = tex_width;
2541 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2542 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002543
Cortf801b982017-01-17 18:10:21 -08002544 // Create an image/buffer, allocate memory, free it, and then try to bind it
2545 {
2546 VkImage image = VK_NULL_HANDLE;
2547 VkBuffer buffer = VK_NULL_HANDLE;
2548 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2549 ASSERT_VK_SUCCESS(err);
2550 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2551 ASSERT_VK_SUCCESS(err);
2552 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2553 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2554 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002555
Cortf801b982017-01-17 18:10:21 -08002556 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2557 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2558 image_mem_alloc.allocationSize = image_mem_reqs.size;
2559 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2560 ASSERT_TRUE(pass);
2561 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2562 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2563 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2564 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002565
Cortf801b982017-01-17 18:10:21 -08002566 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2567 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2568 ASSERT_VK_SUCCESS(err);
2569 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2570 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002571
Cortf801b982017-01-17 18:10:21 -08002572 vkFreeMemory(device(), image_mem, NULL);
2573 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002574
Cortf801b982017-01-17 18:10:21 -08002575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2576 err = vkBindImageMemory(device(), image, image_mem, 0);
2577 (void)err; // This may very well return an error.
2578 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002579
Cortf801b982017-01-17 18:10:21 -08002580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2581 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2582 (void)err; // This may very well return an error.
2583 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002584
Cortf801b982017-01-17 18:10:21 -08002585 vkDestroyImage(m_device->device(), image, NULL);
2586 vkDestroyBuffer(m_device->device(), buffer, NULL);
2587 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002588
2589 // Try to bind memory to an object that already has a memory binding
2590 {
2591 VkImage image = VK_NULL_HANDLE;
2592 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2593 ASSERT_VK_SUCCESS(err);
2594 VkBuffer buffer = VK_NULL_HANDLE;
2595 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2596 ASSERT_VK_SUCCESS(err);
2597 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2598 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2599 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2600 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2601 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2602 image_alloc_info.allocationSize = image_mem_reqs.size;
2603 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2604 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2605 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2606 ASSERT_TRUE(pass);
2607 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2608 ASSERT_TRUE(pass);
2609 VkDeviceMemory image_mem, buffer_mem;
2610 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2611 ASSERT_VK_SUCCESS(err);
2612 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2613 ASSERT_VK_SUCCESS(err);
2614
2615 err = vkBindImageMemory(device(), image, image_mem, 0);
2616 ASSERT_VK_SUCCESS(err);
2617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2618 err = vkBindImageMemory(device(), image, image_mem, 0);
2619 (void)err; // This may very well return an error.
2620 m_errorMonitor->VerifyFound();
2621
2622 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2623 ASSERT_VK_SUCCESS(err);
2624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2625 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2626 (void)err; // This may very well return an error.
2627 m_errorMonitor->VerifyFound();
2628
2629 vkFreeMemory(device(), image_mem, NULL);
2630 vkFreeMemory(device(), buffer_mem, NULL);
2631 vkDestroyImage(device(), image, NULL);
2632 vkDestroyBuffer(device(), buffer, NULL);
2633 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002634
Cort6c7dff72017-01-27 18:34:50 -08002635 // Try to bind memory to an object with an out-of-range memoryOffset
2636 {
2637 VkImage image = VK_NULL_HANDLE;
2638 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2639 ASSERT_VK_SUCCESS(err);
2640 VkBuffer buffer = VK_NULL_HANDLE;
2641 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2642 ASSERT_VK_SUCCESS(err);
2643 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2644 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2645 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2646 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2647 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2648 image_alloc_info.allocationSize = image_mem_reqs.size;
2649 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2650 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2651 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2652 ASSERT_TRUE(pass);
2653 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2654 ASSERT_TRUE(pass);
2655 VkDeviceMemory image_mem, buffer_mem;
2656 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2657 ASSERT_VK_SUCCESS(err);
2658 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2659 ASSERT_VK_SUCCESS(err);
2660
2661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2662 VkDeviceSize image_offset = (image_mem_reqs.size + (image_mem_reqs.alignment - 1)) & ~(image_mem_reqs.alignment - 1);
2663 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2664 (void)err; // This may very well return an error.
2665 m_errorMonitor->VerifyFound();
2666
2667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2668 VkDeviceSize buffer_offset = (buffer_mem_reqs.size + (buffer_mem_reqs.alignment - 1)) & ~(buffer_mem_reqs.alignment - 1);
2669 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2670 (void)err; // This may very well return an error.
2671 m_errorMonitor->VerifyFound();
2672
2673 vkFreeMemory(device(), image_mem, NULL);
2674 vkFreeMemory(device(), buffer_mem, NULL);
2675 vkDestroyImage(device(), image, NULL);
2676 vkDestroyBuffer(device(), buffer, NULL);
2677 }
2678
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002679 // Try to bind memory to an image created with sparse memory flags
2680 {
2681 VkImageCreateInfo sparse_image_create_info = image_create_info;
2682 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2683 VkImageFormatProperties image_format_properties = {};
2684 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2685 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2686 sparse_image_create_info.usage, sparse_image_create_info.flags,
2687 &image_format_properties);
2688 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2689 // most likely means sparse formats aren't supported here; skip this test.
2690 } else {
2691 ASSERT_VK_SUCCESS(err);
2692 if (image_format_properties.maxExtent.width == 0) {
2693 printf("sparse image format not supported; skipped.\n");
2694 return;
2695 } else {
2696 VkImage sparse_image = VK_NULL_HANDLE;
2697 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2698 ASSERT_VK_SUCCESS(err);
2699 VkMemoryRequirements sparse_mem_reqs = {};
2700 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2701 if (sparse_mem_reqs.memoryTypeBits != 0) {
2702 VkMemoryAllocateInfo sparse_mem_alloc = {};
2703 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2704 sparse_mem_alloc.pNext = NULL;
2705 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2706 sparse_mem_alloc.memoryTypeIndex = 0;
2707 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2708 ASSERT_TRUE(pass);
2709 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2710 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2711 ASSERT_VK_SUCCESS(err);
2712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2713 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2714 // This may very well return an error.
2715 (void)err;
2716 m_errorMonitor->VerifyFound();
2717 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2718 }
2719 vkDestroyImage(m_device->device(), sparse_image, NULL);
2720 }
2721 }
2722 }
2723
2724 // Try to bind memory to a buffer created with sparse memory flags
2725 {
2726 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2727 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2728 if (!m_device->phy().features().sparseResidencyBuffer) {
2729 // most likely means sparse formats aren't supported here; skip this test.
2730 } else {
2731 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2732 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2733 ASSERT_VK_SUCCESS(err);
2734 VkMemoryRequirements sparse_mem_reqs = {};
2735 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2736 if (sparse_mem_reqs.memoryTypeBits != 0) {
2737 VkMemoryAllocateInfo sparse_mem_alloc = {};
2738 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2739 sparse_mem_alloc.pNext = NULL;
2740 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2741 sparse_mem_alloc.memoryTypeIndex = 0;
2742 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2743 ASSERT_TRUE(pass);
2744 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2745 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2746 ASSERT_VK_SUCCESS(err);
2747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2748 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2749 // This may very well return an error.
2750 (void)err;
2751 m_errorMonitor->VerifyFound();
2752 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2753 }
2754 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2755 }
2756 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002757}
2758
Karl Schultz6addd812016-02-02 17:17:23 -07002759TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2760 VkResult err;
2761 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002762
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002764
Tobin Ehlisec598302015-09-15 15:02:17 -06002765 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002766
Karl Schultz6addd812016-02-02 17:17:23 -07002767 // Create an image object, allocate memory, destroy the object and then try
2768 // to bind it
2769 VkImage image;
2770 VkDeviceMemory mem;
2771 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002772
Karl Schultz6addd812016-02-02 17:17:23 -07002773 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2774 const int32_t tex_width = 32;
2775 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002776
2777 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002778 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2779 image_create_info.pNext = NULL;
2780 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2781 image_create_info.format = tex_format;
2782 image_create_info.extent.width = tex_width;
2783 image_create_info.extent.height = tex_height;
2784 image_create_info.extent.depth = 1;
2785 image_create_info.mipLevels = 1;
2786 image_create_info.arrayLayers = 1;
2787 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2788 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2789 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2790 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002791
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002792 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002793 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2794 mem_alloc.pNext = NULL;
2795 mem_alloc.allocationSize = 0;
2796 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002797
Chia-I Wuf7458c52015-10-26 21:10:41 +08002798 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002799 ASSERT_VK_SUCCESS(err);
2800
Karl Schultz6addd812016-02-02 17:17:23 -07002801 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002802
2803 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002804 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002805 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002806
2807 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002808 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002809 ASSERT_VK_SUCCESS(err);
2810
2811 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002812 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002813 ASSERT_VK_SUCCESS(err);
2814
2815 // Now Try to bind memory to this destroyed object
2816 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2817 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002818 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002819
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002820 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002821
Chia-I Wuf7458c52015-10-26 21:10:41 +08002822 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002823}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002824
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002825TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
2826 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
2827
2828 ASSERT_NO_FATAL_FAILURE(InitState());
2829 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2830
2831 VkVertexInputBindingDescription input_binding;
2832 memset(&input_binding, 0, sizeof(input_binding));
2833
2834 VkVertexInputAttributeDescription input_attribs;
2835 memset(&input_attribs, 0, sizeof(input_attribs));
2836
2837 // Pick a really bad format for this purpose and make sure it should fail
2838 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
2839 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
2840 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
2841 printf("Format unsuitable for test; skipped.\n");
2842 return;
2843 }
2844
2845 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002846 char const *vsSource =
2847 "#version 450\n"
2848 "\n"
2849 "out gl_PerVertex {\n"
2850 " vec4 gl_Position;\n"
2851 "};\n"
2852 "void main(){\n"
2853 " gl_Position = vec4(1);\n"
2854 "}\n";
2855 char const *fsSource =
2856 "#version 450\n"
2857 "\n"
2858 "layout(location=0) out vec4 color;\n"
2859 "void main(){\n"
2860 " color = vec4(1);\n"
2861 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002862
2863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
2864 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2865 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2866
2867 VkPipelineObj pipe(m_device);
2868 pipe.AddColorAttachment();
2869 pipe.AddShader(&vs);
2870 pipe.AddShader(&fs);
2871
2872 pipe.AddVertexInputBindings(&input_binding, 1);
2873 pipe.AddVertexInputAttribs(&input_attribs, 1);
2874
2875 VkDescriptorSetObj descriptorSet(m_device);
2876 descriptorSet.AppendDummy();
2877 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
2878
2879 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
2880
2881 m_errorMonitor->VerifyFound();
2882}
2883
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002884TEST_F(VkLayerTest, ImageSampleCounts) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002885 TEST_DESCRIPTION(
2886 "Use bad sample counts in image transfer calls to trigger "
2887 "validation errors.");
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002888 ASSERT_NO_FATAL_FAILURE(InitState());
2889
2890 VkMemoryPropertyFlags reqs = 0;
2891 VkImageCreateInfo image_create_info = {};
2892 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2893 image_create_info.pNext = NULL;
2894 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2895 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
2896 image_create_info.extent.width = 256;
2897 image_create_info.extent.height = 256;
2898 image_create_info.extent.depth = 1;
2899 image_create_info.mipLevels = 1;
2900 image_create_info.arrayLayers = 1;
2901 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2902 image_create_info.flags = 0;
2903
2904 VkImageBlit blit_region = {};
2905 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2906 blit_region.srcSubresource.baseArrayLayer = 0;
2907 blit_region.srcSubresource.layerCount = 1;
2908 blit_region.srcSubresource.mipLevel = 0;
2909 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2910 blit_region.dstSubresource.baseArrayLayer = 0;
2911 blit_region.dstSubresource.layerCount = 1;
2912 blit_region.dstSubresource.mipLevel = 0;
2913
2914 // Create two images, the source with sampleCount = 2, and attempt to blit
2915 // between them
2916 {
2917 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002918 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002919 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002920 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002921 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002922 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002923 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002924 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002925 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2927 "was created with a sample count "
2928 "of VK_SAMPLE_COUNT_2_BIT but "
2929 "must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002930 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2931 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002932 m_errorMonitor->VerifyFound();
2933 m_commandBuffer->EndCommandBuffer();
2934 }
2935
2936 // Create two images, the dest with sampleCount = 4, and attempt to blit
2937 // between them
2938 {
2939 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002940 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002941 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002942 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002943 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002944 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002945 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002946 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002947 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2949 "was created with a sample count "
2950 "of VK_SAMPLE_COUNT_4_BIT but "
2951 "must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002952 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2953 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002954 m_errorMonitor->VerifyFound();
2955 m_commandBuffer->EndCommandBuffer();
2956 }
2957
2958 VkBufferImageCopy copy_region = {};
2959 copy_region.bufferRowLength = 128;
2960 copy_region.bufferImageHeight = 128;
2961 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2962 copy_region.imageSubresource.layerCount = 1;
2963 copy_region.imageExtent.height = 64;
2964 copy_region.imageExtent.width = 64;
2965 copy_region.imageExtent.depth = 1;
2966
2967 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
2968 // buffer to image
2969 {
2970 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002971 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
2972 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002973 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002974 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002975 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002976 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2978 "was created with a sample count "
2979 "of VK_SAMPLE_COUNT_8_BIT but "
2980 "must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002981 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
2982 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002983 m_errorMonitor->VerifyFound();
2984 m_commandBuffer->EndCommandBuffer();
2985 }
2986
2987 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
2988 // image to buffer
2989 {
2990 vk_testing::Buffer dst_buffer;
2991 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
2992 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002993 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002994 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002995 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002996 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2998 "was created with a sample count "
2999 "of VK_SAMPLE_COUNT_2_BIT but "
3000 "must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003001 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003002 dst_buffer.handle(), 1, &copy_region);
3003 m_errorMonitor->VerifyFound();
3004 m_commandBuffer->EndCommandBuffer();
3005 }
3006}
3007
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003008TEST_F(VkLayerTest, BlitImageFormats) {
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003009 ASSERT_NO_FATAL_FAILURE(InitState());
3010
3011 VkImageObj src_image(m_device);
3012 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
3013 VkImageObj dst_image(m_device);
3014 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
3015 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06003016 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 -06003017
3018 VkImageBlit blitRegion = {};
3019 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3020 blitRegion.srcSubresource.baseArrayLayer = 0;
3021 blitRegion.srcSubresource.layerCount = 1;
3022 blitRegion.srcSubresource.mipLevel = 0;
3023 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3024 blitRegion.dstSubresource.baseArrayLayer = 0;
3025 blitRegion.dstSubresource.layerCount = 1;
3026 blitRegion.dstSubresource.mipLevel = 0;
3027
Dave Houlton34df4cb2016-12-01 16:43:06 -07003028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3029
3030 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3031 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003032
3033 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003034 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003035 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(), dst_image.layout(), 1,
3036 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003037
3038 m_errorMonitor->VerifyFound();
3039
Dave Houlton34df4cb2016-12-01 16:43:06 -07003040 // Test should generate 2 VU failures
3041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003043
3044 // Unsigned int vs signed int
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003045 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(), dst_image2.layout(), 1,
3046 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003047
Dave Houlton34df4cb2016-12-01 16:43:06 -07003048 // TODO: Note that this only verifies that at least one of the VU enums was found
3049 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003050 m_errorMonitor->VerifyFound();
3051
Tony Barbour552f6c02016-12-21 14:34:07 -07003052 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003053}
3054
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003055TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3056 VkResult err;
3057 bool pass;
3058
3059 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
3060 ASSERT_NO_FATAL_FAILURE(InitState());
3061
3062 // If w/d/h granularity is 1, test is not meaningful
3063 // TODO: When virtual device limits are available, create a set of limits for this test that
3064 // will always have a granularity of > 1 for w, h, and d
3065 auto index = m_device->graphics_queue_node_index_;
3066 auto queue_family_properties = m_device->phy().queue_properties();
3067
3068 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3069 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3070 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3071 return;
3072 }
3073
3074 // Create two images of different types and try to copy between them
3075 VkImage srcImage;
3076 VkImage dstImage;
3077 VkDeviceMemory srcMem;
3078 VkDeviceMemory destMem;
3079 VkMemoryRequirements memReqs;
3080
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003081 VkImageCreateInfo image_create_info = {};
3082 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3083 image_create_info.pNext = NULL;
3084 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3085 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3086 image_create_info.extent.width = 32;
3087 image_create_info.extent.height = 32;
3088 image_create_info.extent.depth = 1;
3089 image_create_info.mipLevels = 1;
3090 image_create_info.arrayLayers = 4;
3091 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3092 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3093 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3094 image_create_info.flags = 0;
3095
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003096 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003097 ASSERT_VK_SUCCESS(err);
3098
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003099 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003100 ASSERT_VK_SUCCESS(err);
3101
3102 // Allocate memory
3103 VkMemoryAllocateInfo memAlloc = {};
3104 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3105 memAlloc.pNext = NULL;
3106 memAlloc.allocationSize = 0;
3107 memAlloc.memoryTypeIndex = 0;
3108
3109 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3110 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003111 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003112 ASSERT_TRUE(pass);
3113 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3114 ASSERT_VK_SUCCESS(err);
3115
3116 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3117 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003118 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003119 ASSERT_VK_SUCCESS(err);
3120 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3121 ASSERT_VK_SUCCESS(err);
3122
3123 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3124 ASSERT_VK_SUCCESS(err);
3125 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3126 ASSERT_VK_SUCCESS(err);
3127
Tony Barbour552f6c02016-12-21 14:34:07 -07003128 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003129 VkImageCopy copyRegion;
3130 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3131 copyRegion.srcSubresource.mipLevel = 0;
3132 copyRegion.srcSubresource.baseArrayLayer = 0;
3133 copyRegion.srcSubresource.layerCount = 1;
3134 copyRegion.srcOffset.x = 0;
3135 copyRegion.srcOffset.y = 0;
3136 copyRegion.srcOffset.z = 0;
3137 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3138 copyRegion.dstSubresource.mipLevel = 0;
3139 copyRegion.dstSubresource.baseArrayLayer = 0;
3140 copyRegion.dstSubresource.layerCount = 1;
3141 copyRegion.dstOffset.x = 0;
3142 copyRegion.dstOffset.y = 0;
3143 copyRegion.dstOffset.z = 0;
3144 copyRegion.extent.width = 1;
3145 copyRegion.extent.height = 1;
3146 copyRegion.extent.depth = 1;
3147
3148 // Introduce failure by setting srcOffset to a bad granularity value
3149 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003150 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3151 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003152 m_errorMonitor->VerifyFound();
3153
3154 // Introduce failure by setting extent to a bad granularity value
3155 copyRegion.srcOffset.y = 0;
3156 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003157 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3158 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003159 m_errorMonitor->VerifyFound();
3160
3161 // Now do some buffer/image copies
3162 vk_testing::Buffer buffer;
3163 VkMemoryPropertyFlags reqs = 0;
3164 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3165 VkBufferImageCopy region = {};
3166 region.bufferOffset = 0;
3167 region.bufferRowLength = 3;
3168 region.bufferImageHeight = 128;
3169 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3170 region.imageSubresource.layerCount = 1;
3171 region.imageExtent.height = 16;
3172 region.imageExtent.width = 16;
3173 region.imageExtent.depth = 1;
3174 region.imageOffset.x = 0;
3175 region.imageOffset.y = 0;
3176 region.imageOffset.z = 0;
3177
3178 // Introduce failure by setting bufferRowLength to a bad granularity value
3179 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3181 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3182 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003183 m_errorMonitor->VerifyFound();
3184 region.bufferRowLength = 128;
3185
3186 // Introduce failure by setting bufferOffset to a bad granularity value
3187 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3189 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3190 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003191 m_errorMonitor->VerifyFound();
3192 region.bufferOffset = 0;
3193
3194 // Introduce failure by setting bufferImageHeight to a bad granularity value
3195 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3197 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3198 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003199 m_errorMonitor->VerifyFound();
3200 region.bufferImageHeight = 128;
3201
3202 // Introduce failure by setting imageExtent to a bad granularity value
3203 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3205 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3206 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003207 m_errorMonitor->VerifyFound();
3208 region.imageExtent.width = 16;
3209
3210 // Introduce failure by setting imageOffset to a bad granularity value
3211 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3213 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3214 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003215 m_errorMonitor->VerifyFound();
3216
Tony Barbour552f6c02016-12-21 14:34:07 -07003217 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003218
3219 vkDestroyImage(m_device->device(), srcImage, NULL);
3220 vkDestroyImage(m_device->device(), dstImage, NULL);
3221 vkFreeMemory(m_device->device(), srcMem, NULL);
3222 vkFreeMemory(m_device->device(), destMem, NULL);
3223}
3224
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003225TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003226 TEST_DESCRIPTION(
3227 "Submit command buffer created using one queue family and "
3228 "attempt to submit them on a queue created in a different "
3229 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003230
Cody Northropc31a84f2016-08-22 10:41:47 -06003231 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003232 // This test is meaningless unless we have multiple queue families
3233 auto queue_family_properties = m_device->phy().queue_properties();
3234 if (queue_family_properties.size() < 2) {
3235 return;
3236 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003238 // Get safe index of another queue family
3239 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
3240 ASSERT_NO_FATAL_FAILURE(InitState());
3241 // Create a second queue using a different queue family
3242 VkQueue other_queue;
3243 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3244
3245 // Record an empty cmd buffer
3246 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3247 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3248 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3249 vkEndCommandBuffer(m_commandBuffer->handle());
3250
3251 // And submit on the wrong queue
3252 VkSubmitInfo submit_info = {};
3253 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3254 submit_info.commandBufferCount = 1;
3255 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003256 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003257
3258 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003259}
3260
Chris Forbes4c24a922016-11-16 08:59:10 +13003261TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
3262 ASSERT_NO_FATAL_FAILURE(InitState());
3263
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003264 // There are no attachments, but refer to attachment 0.
3265 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003266 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003267 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003268 };
3269
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003270 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003271 VkRenderPass rp;
3272
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003273 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003275 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3276 m_errorMonitor->VerifyFound();
3277}
3278
Chris Forbesa58c4522016-09-28 15:19:39 +13003279TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3280 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
3281 ASSERT_NO_FATAL_FAILURE(InitState());
3282
3283 // A renderpass with two subpasses, both writing the same attachment.
3284 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003285 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3286 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3287 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003288 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003289 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003290 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003291 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3292 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003293 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003294 VkSubpassDependency dep = {0,
3295 1,
3296 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3297 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3298 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3299 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3300 VK_DEPENDENCY_BY_REGION_BIT};
3301 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003302 VkRenderPass rp;
3303 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3304 ASSERT_VK_SUCCESS(err);
3305
3306 VkImageObj image(m_device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003307 image.init_no_layout(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003308 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3309
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003310 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003311 VkFramebuffer fb;
3312 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3313 ASSERT_VK_SUCCESS(err);
3314
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003315 char const *vsSource =
3316 "#version 450\n"
3317 "void main() { gl_Position = vec4(1); }\n";
3318 char const *fsSource =
3319 "#version 450\n"
3320 "layout(location=0) out vec4 color;\n"
3321 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003322
3323 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3324 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3325 VkPipelineObj pipe(m_device);
3326 pipe.AddColorAttachment();
3327 pipe.AddShader(&vs);
3328 pipe.AddShader(&fs);
3329 VkViewport view_port = {};
3330 m_viewports.push_back(view_port);
3331 pipe.SetViewport(m_viewports);
3332 VkRect2D rect = {};
3333 m_scissors.push_back(rect);
3334 pipe.SetScissor(m_scissors);
3335
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003336 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003337 VkPipelineLayout pl;
3338 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3339 ASSERT_VK_SUCCESS(err);
3340 pipe.CreateVKPipeline(pl, rp);
3341
Tony Barbour552f6c02016-12-21 14:34:07 -07003342 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003343
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003344 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3345 nullptr,
3346 rp,
3347 fb,
3348 {{
3349 0, 0,
3350 },
3351 {32, 32}},
3352 0,
3353 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003354
3355 // subtest 1: bind in the wrong subpass
3356 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3357 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003359 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3360 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3361 m_errorMonitor->VerifyFound();
3362
3363 vkCmdEndRenderPass(m_commandBuffer->handle());
3364
3365 // subtest 2: bind in correct subpass, then transition to next subpass
3366 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3367 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3368 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003370 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3371 m_errorMonitor->VerifyFound();
3372
3373 vkCmdEndRenderPass(m_commandBuffer->handle());
3374
Tony Barbour552f6c02016-12-21 14:34:07 -07003375 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003376
3377 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3378 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3379 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3380}
3381
Tony Barbour4e919972016-08-09 13:27:40 -06003382TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003383 TEST_DESCRIPTION(
3384 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3385 "with extent outside of framebuffer");
Tony Barbour4e919972016-08-09 13:27:40 -06003386 ASSERT_NO_FATAL_FAILURE(InitState());
3387 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3388
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3390 "Cannot execute a render pass with renderArea "
3391 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003392
3393 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3394 m_renderPassBeginInfo.renderArea.extent.width = 257;
3395 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003396 m_commandBuffer->BeginCommandBuffer();
3397 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003398 m_errorMonitor->VerifyFound();
3399}
3400
3401TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003402 TEST_DESCRIPTION(
3403 "Generate INDEPENDENT_BLEND by disabling independent "
3404 "blend and then specifying different blend states for two "
3405 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003406 VkPhysicalDeviceFeatures features = {};
3407 features.independentBlend = VK_FALSE;
Cody Northropc31a84f2016-08-22 10:41:47 -06003408 ASSERT_NO_FATAL_FAILURE(InitState(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003409
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3411 "Invalid Pipeline CreateInfo: If independent blend feature not "
3412 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003413
Cody Northropc31a84f2016-08-22 10:41:47 -06003414 VkDescriptorSetObj descriptorSet(m_device);
3415 descriptorSet.AppendDummy();
3416 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003417
Cody Northropc31a84f2016-08-22 10:41:47 -06003418 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003419 // Create a renderPass with two color attachments
3420 VkAttachmentReference attachments[2] = {};
3421 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3422 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3423
3424 VkSubpassDescription subpass = {};
3425 subpass.pColorAttachments = attachments;
3426 subpass.colorAttachmentCount = 2;
3427
3428 VkRenderPassCreateInfo rpci = {};
3429 rpci.subpassCount = 1;
3430 rpci.pSubpasses = &subpass;
3431 rpci.attachmentCount = 1;
3432
3433 VkAttachmentDescription attach_desc = {};
3434 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3435 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3436 attach_desc.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3437 attach_desc.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3438
3439 rpci.pAttachments = &attach_desc;
3440 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3441
3442 VkRenderPass renderpass;
3443 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003444 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003445 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003446
Cody Northropc31a84f2016-08-22 10:41:47 -06003447 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3448 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3449 att_state1.blendEnable = VK_TRUE;
3450 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3451 att_state2.blendEnable = VK_FALSE;
3452 pipeline.AddColorAttachment(0, &att_state1);
3453 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003454 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003455 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003456 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003457}
3458
Mike Weiblen40b160e2017-02-06 19:21:52 -07003459// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3460TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3461 TEST_DESCRIPTION(
3462 "Create a graphics pipeline that is incompatible with the requirements "
3463 "of its contained Renderpass/subpasses.");
3464 ASSERT_NO_FATAL_FAILURE(InitState());
3465
3466 VkDescriptorSetObj ds_obj(m_device);
3467 ds_obj.AppendDummy();
3468 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3469
3470 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3471
3472 VkPipelineColorBlendAttachmentState att_state1 = {};
3473 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3474 att_state1.blendEnable = VK_TRUE;
3475
3476 VkRenderpassObj rp_obj(m_device);
3477
3478 {
3479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3480 VkPipelineObj pipeline(m_device);
3481 pipeline.AddShader(&vs_obj);
3482 pipeline.AddColorAttachment(0, &att_state1);
3483
3484 VkGraphicsPipelineCreateInfo info = {};
3485 pipeline.InitGraphicsPipelineCreateInfo(&info);
3486 info.pColorBlendState = nullptr;
3487
3488 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3489 m_errorMonitor->VerifyFound();
3490 }
3491}
3492
Chris Forbes26ec2122016-11-29 08:58:33 +13003493#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003494TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3495 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3496 "depth attachments in subpass");
Cody Northropc31a84f2016-08-22 10:41:47 -06003497 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour4e919972016-08-09 13:27:40 -06003498
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3500 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003501
3502 // Create a renderPass with a single color attachment
3503 VkAttachmentReference attach = {};
3504 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3505 VkSubpassDescription subpass = {};
3506 VkRenderPassCreateInfo rpci = {};
3507 rpci.subpassCount = 1;
3508 rpci.pSubpasses = &subpass;
3509 rpci.attachmentCount = 1;
3510 VkAttachmentDescription attach_desc = {};
3511 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3512 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3513 rpci.pAttachments = &attach_desc;
3514 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3515 VkRenderPass rp;
3516 subpass.pDepthStencilAttachment = &attach;
3517 subpass.pColorAttachments = NULL;
3518 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3519 m_errorMonitor->VerifyFound();
3520}
Chris Forbes26ec2122016-11-29 08:58:33 +13003521#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003522
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003523TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003524 TEST_DESCRIPTION(
3525 "Create a framebuffer where a subpass has a preserve "
3526 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003527
3528 ASSERT_NO_FATAL_FAILURE(InitState());
3529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3530
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003531 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003532
3533 VkAttachmentReference color_attach = {};
3534 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3535 color_attach.attachment = 0;
3536 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3537 VkSubpassDescription subpass = {};
3538 subpass.colorAttachmentCount = 1;
3539 subpass.pColorAttachments = &color_attach;
3540 subpass.preserveAttachmentCount = 1;
3541 subpass.pPreserveAttachments = &preserve_attachment;
3542
3543 VkRenderPassCreateInfo rpci = {};
3544 rpci.subpassCount = 1;
3545 rpci.pSubpasses = &subpass;
3546 rpci.attachmentCount = 1;
3547 VkAttachmentDescription attach_desc = {};
3548 attach_desc.format = VK_FORMAT_UNDEFINED;
3549 rpci.pAttachments = &attach_desc;
3550 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3551 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003552 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003553
3554 m_errorMonitor->VerifyFound();
3555
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003556 if (result == VK_SUCCESS) {
3557 vkDestroyRenderPass(m_device->device(), rp, NULL);
3558 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003559}
3560
Chris Forbesc5389742016-06-29 11:49:23 +12003561TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003562 TEST_DESCRIPTION(
3563 "Ensure that CreateRenderPass produces a validation error "
3564 "when the source of a subpass multisample resolve "
3565 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003566
Chris Forbesc5389742016-06-29 11:49:23 +12003567 ASSERT_NO_FATAL_FAILURE(InitState());
3568
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3570 "Subpass 0 requests multisample resolve from attachment 0 which has "
3571 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003572
3573 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003574 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3575 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3576 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3577 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3578 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3579 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003580 };
3581
3582 VkAttachmentReference color = {
3583 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3584 };
3585
3586 VkAttachmentReference resolve = {
3587 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3588 };
3589
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003590 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003591
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003592 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003593
3594 VkRenderPass rp;
3595 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3596
3597 m_errorMonitor->VerifyFound();
3598
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003599 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003600}
3601
3602TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003603 TEST_DESCRIPTION(
3604 "Ensure CreateRenderPass produces a validation error "
3605 "when a subpass multisample resolve operation is "
3606 "requested, and the destination of that resolve has "
3607 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003608
Chris Forbesc5389742016-06-29 11:49:23 +12003609 ASSERT_NO_FATAL_FAILURE(InitState());
3610
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3612 "Subpass 0 requests multisample resolve into attachment 1, which "
3613 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003614
3615 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003616 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3617 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3618 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3619 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3620 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3621 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003622 };
3623
3624 VkAttachmentReference color = {
3625 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3626 };
3627
3628 VkAttachmentReference resolve = {
3629 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3630 };
3631
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003632 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003633
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003634 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003635
3636 VkRenderPass rp;
3637 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3638
3639 m_errorMonitor->VerifyFound();
3640
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003641 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003642}
3643
Chris Forbes3f128ef2016-06-29 14:58:53 +12003644TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003645 TEST_DESCRIPTION(
3646 "Ensure CreateRenderPass produces a validation error "
3647 "when the color and depth attachments used by a subpass "
3648 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003649
Chris Forbes3f128ef2016-06-29 14:58:53 +12003650 ASSERT_NO_FATAL_FAILURE(InitState());
3651
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3653 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003654
3655 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003656 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3657 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3658 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3659 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3660 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3661 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003662 };
3663
3664 VkAttachmentReference color[] = {
3665 {
3666 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3667 },
3668 {
3669 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3670 },
3671 };
3672
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003673 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003674
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003675 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003676
3677 VkRenderPass rp;
3678 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3679
3680 m_errorMonitor->VerifyFound();
3681
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003682 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003683}
3684
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003685TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003686 TEST_DESCRIPTION(
3687 "Hit errors when attempting to create a framebuffer :\n"
3688 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3689 " 2. Use a color image as depthStencil attachment\n"
3690 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3691 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3692 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3693 " 6. Framebuffer attachment where dimensions don't match\n"
3694 " 7. Framebuffer attachment w/o identity swizzle\n"
3695 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003696
3697 ASSERT_NO_FATAL_FAILURE(InitState());
3698 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3699
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003700 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3701 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
3702 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003703
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003704 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003705 VkAttachmentReference attach = {};
3706 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3707 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003708 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003709 VkRenderPassCreateInfo rpci = {};
3710 rpci.subpassCount = 1;
3711 rpci.pSubpasses = &subpass;
3712 rpci.attachmentCount = 1;
3713 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003714 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003715 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003716 rpci.pAttachments = &attach_desc;
3717 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3718 VkRenderPass rp;
3719 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3720 ASSERT_VK_SUCCESS(err);
3721
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003722 VkImageView ivs[2];
3723 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3724 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003725 VkFramebufferCreateInfo fb_info = {};
3726 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3727 fb_info.pNext = NULL;
3728 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003729 // Set mis-matching attachmentCount
3730 fb_info.attachmentCount = 2;
3731 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003732 fb_info.width = 100;
3733 fb_info.height = 100;
3734 fb_info.layers = 1;
3735
3736 VkFramebuffer fb;
3737 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3738
3739 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003740 if (err == VK_SUCCESS) {
3741 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3742 }
3743 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003744
3745 // Create a renderPass with a depth-stencil attachment created with
3746 // IMAGE_USAGE_COLOR_ATTACHMENT
3747 // Add our color attachment to pDepthStencilAttachment
3748 subpass.pDepthStencilAttachment = &attach;
3749 subpass.pColorAttachments = NULL;
3750 VkRenderPass rp_ds;
3751 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3752 ASSERT_VK_SUCCESS(err);
3753 // Set correct attachment count, but attachment has COLOR usage bit set
3754 fb_info.attachmentCount = 1;
3755 fb_info.renderPass = rp_ds;
3756
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003757 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003758 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3759
3760 m_errorMonitor->VerifyFound();
3761 if (err == VK_SUCCESS) {
3762 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3763 }
3764 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003765
3766 // Create new renderpass with alternate attachment format from fb
3767 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3768 subpass.pDepthStencilAttachment = NULL;
3769 subpass.pColorAttachments = &attach;
3770 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3771 ASSERT_VK_SUCCESS(err);
3772
3773 // Cause error due to mis-matched formats between rp & fb
3774 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3775 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3777 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003778 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3779
3780 m_errorMonitor->VerifyFound();
3781 if (err == VK_SUCCESS) {
3782 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3783 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003784 vkDestroyRenderPass(m_device->device(), rp, NULL);
3785
3786 // Create new renderpass with alternate sample count from fb
3787 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3788 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3789 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3790 ASSERT_VK_SUCCESS(err);
3791
3792 // Cause error due to mis-matched sample count between rp & fb
3793 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3795 " has VK_SAMPLE_COUNT_1_BIT samples "
3796 "that do not match the "
3797 "VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003798 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3799
3800 m_errorMonitor->VerifyFound();
3801 if (err == VK_SUCCESS) {
3802 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3803 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003804
3805 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003806
3807 // Create a custom imageView with non-1 mip levels
3808 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003809 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 -06003810 ASSERT_TRUE(image.initialized());
3811
3812 VkImageView view;
3813 VkImageViewCreateInfo ivci = {};
3814 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3815 ivci.image = image.handle();
3816 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3817 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3818 ivci.subresourceRange.layerCount = 1;
3819 ivci.subresourceRange.baseMipLevel = 0;
3820 // Set level count 2 (only 1 is allowed for FB attachment)
3821 ivci.subresourceRange.levelCount = 2;
3822 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3823 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3824 ASSERT_VK_SUCCESS(err);
3825 // Re-create renderpass to have matching sample count
3826 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3827 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3828 ASSERT_VK_SUCCESS(err);
3829
3830 fb_info.renderPass = rp;
3831 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003833 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3834
3835 m_errorMonitor->VerifyFound();
3836 if (err == VK_SUCCESS) {
3837 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3838 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003839 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003840 // Update view to original color buffer and grow FB dimensions too big
3841 fb_info.pAttachments = ivs;
3842 fb_info.height = 1024;
3843 fb_info.width = 1024;
3844 fb_info.layers = 2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3846 " Attachment dimensions must be at "
3847 "least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003848 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3849
3850 m_errorMonitor->VerifyFound();
3851 if (err == VK_SUCCESS) {
3852 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3853 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003854 // Create view attachment with non-identity swizzle
3855 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3856 ivci.image = image.handle();
3857 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3858 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3859 ivci.subresourceRange.layerCount = 1;
3860 ivci.subresourceRange.baseMipLevel = 0;
3861 ivci.subresourceRange.levelCount = 1;
3862 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3863 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
3864 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
3865 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
3866 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
3867 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3868 ASSERT_VK_SUCCESS(err);
3869
3870 fb_info.pAttachments = &view;
3871 fb_info.height = 100;
3872 fb_info.width = 100;
3873 fb_info.layers = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3875 " has non-identy swizzle. All "
3876 "framebuffer attachments must have "
3877 "been created with the identity "
3878 "swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003879 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3880
3881 m_errorMonitor->VerifyFound();
3882 if (err == VK_SUCCESS) {
3883 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3884 }
3885 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003886 // reset attachment to color attachment
3887 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003888
3889 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003890 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003891 fb_info.height = 100;
3892 fb_info.layers = 1;
3893 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
3894 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3895
3896 m_errorMonitor->VerifyFound();
3897 if (err == VK_SUCCESS) {
3898 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3899 }
3900
3901 // Request fb that exceeds max height
3902 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003903 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003904 fb_info.layers = 1;
3905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
3906 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3907
3908 m_errorMonitor->VerifyFound();
3909 if (err == VK_SUCCESS) {
3910 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3911 }
3912
3913 // Request fb that exceeds max layers
3914 fb_info.width = 100;
3915 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003916 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003918 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3919
3920 m_errorMonitor->VerifyFound();
3921 if (err == VK_SUCCESS) {
3922 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3923 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003924
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003925 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003926}
3927
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003928TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003929 TEST_DESCRIPTION(
3930 "Run a simple draw calls to validate failure when Depth Bias dynamic "
3931 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003932
Cody Northropc31a84f2016-08-22 10:41:47 -06003933 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003934 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
3936 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003937 m_errorMonitor->VerifyFound();
3938}
3939
3940TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003941 TEST_DESCRIPTION(
3942 "Run a simple draw calls to validate failure when Line Width dynamic "
3943 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003944
Cody Northropc31a84f2016-08-22 10:41:47 -06003945 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003946 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
3948 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003949 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003950}
3951
3952TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003953 TEST_DESCRIPTION(
3954 "Run a simple draw calls to validate failure when Viewport dynamic "
3955 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003956
Cody Northropc31a84f2016-08-22 10:41:47 -06003957 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003958 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3960 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003961 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003962 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003963}
3964
3965TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003966 TEST_DESCRIPTION(
3967 "Run a simple draw calls to validate failure when Scissor dynamic "
3968 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003969
Cody Northropc31a84f2016-08-22 10:41:47 -06003970 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003971 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003972 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3973 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003974 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003975 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003976}
3977
Cortd713fe82016-07-27 09:51:27 -07003978TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003979 TEST_DESCRIPTION(
3980 "Run a simple draw calls to validate failure when Blend Constants "
3981 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003982
3983 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003984 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3986 "Dynamic blend constants state not set for this command buffer");
3987 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06003988 m_errorMonitor->VerifyFound();
3989}
3990
3991TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003992 TEST_DESCRIPTION(
3993 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
3994 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003995
3996 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003997 if (!m_device->phy().features().depthBounds) {
3998 printf("Device does not support depthBounds test; skipped.\n");
3999 return;
4000 }
4001 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4003 "Dynamic depth bounds state not set for this command buffer");
4004 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004005 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004006}
4007
4008TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004009 TEST_DESCRIPTION(
4010 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4011 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004012
4013 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004014 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4016 "Dynamic stencil read mask state not set for this command buffer");
4017 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004018 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004019}
4020
4021TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004022 TEST_DESCRIPTION(
4023 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4024 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004025
4026 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004027 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4029 "Dynamic stencil write mask state not set for this command buffer");
4030 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004031 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004032}
4033
4034TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004035 TEST_DESCRIPTION(
4036 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4037 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004038
4039 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004040 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4042 "Dynamic stencil reference state not set for this command buffer");
4043 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004044 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004045}
4046
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004047TEST_F(VkLayerTest, IndexBufferNotBound) {
4048 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004049
4050 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4052 "Index buffer object not bound to this command buffer when Indexed ");
4053 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004054 m_errorMonitor->VerifyFound();
4055}
4056
Karl Schultz6addd812016-02-02 17:17:23 -07004057TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4059 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4060 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004061
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004062 ASSERT_NO_FATAL_FAILURE(InitState());
4063 ASSERT_NO_FATAL_FAILURE(InitViewport());
4064 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4065
Karl Schultz6addd812016-02-02 17:17:23 -07004066 // We luck out b/c by default the framework creates CB w/ the
4067 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004068 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004069 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004070 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004071
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004072 // Bypass framework since it does the waits automatically
4073 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004074 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004075 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4076 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004077 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004078 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004079 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004080 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004081 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004082 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004083 submit_info.pSignalSemaphores = NULL;
4084
Chris Forbes40028e22016-06-13 09:59:34 +12004085 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004086 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004087 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004088
Karl Schultz6addd812016-02-02 17:17:23 -07004089 // Cause validation error by re-submitting cmd buffer that should only be
4090 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004091 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004092 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004093
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004094 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004095}
4096
Karl Schultz6addd812016-02-02 17:17:23 -07004097TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004098 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004099 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004100
4101 ASSERT_NO_FATAL_FAILURE(InitState());
4102 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004103
Karl Schultz6addd812016-02-02 17:17:23 -07004104 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4105 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004106 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004107 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004108 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004109
4110 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004111 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4112 ds_pool_ci.pNext = NULL;
4113 ds_pool_ci.flags = 0;
4114 ds_pool_ci.maxSets = 1;
4115 ds_pool_ci.poolSizeCount = 1;
4116 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004117
4118 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004119 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004120 ASSERT_VK_SUCCESS(err);
4121
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004122 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4123 dsl_binding_samp.binding = 0;
4124 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4125 dsl_binding_samp.descriptorCount = 1;
4126 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4127 dsl_binding_samp.pImmutableSamplers = NULL;
4128
4129 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4130 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4131 ds_layout_ci.pNext = NULL;
4132 ds_layout_ci.bindingCount = 1;
4133 ds_layout_ci.pBindings = &dsl_binding_samp;
4134
4135 VkDescriptorSetLayout ds_layout_samp;
4136 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4137 ASSERT_VK_SUCCESS(err);
4138
4139 // Try to allocate 2 sets when pool only has 1 set
4140 VkDescriptorSet descriptor_sets[2];
4141 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4142 VkDescriptorSetAllocateInfo alloc_info = {};
4143 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4144 alloc_info.descriptorSetCount = 2;
4145 alloc_info.descriptorPool = ds_pool;
4146 alloc_info.pSetLayouts = set_layouts;
4147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4148 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4149 m_errorMonitor->VerifyFound();
4150
4151 alloc_info.descriptorSetCount = 1;
4152 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004153 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004154 dsl_binding.binding = 0;
4155 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4156 dsl_binding.descriptorCount = 1;
4157 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4158 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004159
Karl Schultz6addd812016-02-02 17:17:23 -07004160 ds_layout_ci.bindingCount = 1;
4161 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004162
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004163 VkDescriptorSetLayout ds_layout_ub;
4164 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004165 ASSERT_VK_SUCCESS(err);
4166
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004167 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004168 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004169 alloc_info.pSetLayouts = &ds_layout_ub;
4170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4171 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004172
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004173 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004174
Karl Schultz2825ab92016-12-02 08:23:14 -07004175 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004176 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004177 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004178}
4179
Karl Schultz6addd812016-02-02 17:17:23 -07004180TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4181 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004182
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004184
Tobin Ehlise735c692015-10-08 13:13:50 -06004185 ASSERT_NO_FATAL_FAILURE(InitState());
4186 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004187
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004188 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004189 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4190 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004191
4192 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004193 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4194 ds_pool_ci.pNext = NULL;
4195 ds_pool_ci.maxSets = 1;
4196 ds_pool_ci.poolSizeCount = 1;
4197 ds_pool_ci.flags = 0;
4198 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4199 // app can only call vkResetDescriptorPool on this pool.;
4200 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004201
4202 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004203 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004204 ASSERT_VK_SUCCESS(err);
4205
4206 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004207 dsl_binding.binding = 0;
4208 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4209 dsl_binding.descriptorCount = 1;
4210 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4211 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004212
4213 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004214 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4215 ds_layout_ci.pNext = NULL;
4216 ds_layout_ci.bindingCount = 1;
4217 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004218
4219 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004220 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004221 ASSERT_VK_SUCCESS(err);
4222
4223 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004224 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004225 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004226 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004227 alloc_info.descriptorPool = ds_pool;
4228 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004229 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004230 ASSERT_VK_SUCCESS(err);
4231
4232 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004233 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004234
Chia-I Wuf7458c52015-10-26 21:10:41 +08004235 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4236 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004237}
4238
Karl Schultz6addd812016-02-02 17:17:23 -07004239TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004240 // Attempt to clear Descriptor Pool with bad object.
4241 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004242
4243 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004244 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004245 uint64_t fake_pool_handle = 0xbaad6001;
4246 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4247 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004248 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004249}
4250
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004251TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004252 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4253 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004254 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004255 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004256
4257 uint64_t fake_set_handle = 0xbaad6001;
4258 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004259 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004261
4262 ASSERT_NO_FATAL_FAILURE(InitState());
4263
4264 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4265 layout_bindings[0].binding = 0;
4266 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4267 layout_bindings[0].descriptorCount = 1;
4268 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4269 layout_bindings[0].pImmutableSamplers = NULL;
4270
4271 VkDescriptorSetLayout descriptor_set_layout;
4272 VkDescriptorSetLayoutCreateInfo dslci = {};
4273 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4274 dslci.pNext = NULL;
4275 dslci.bindingCount = 1;
4276 dslci.pBindings = layout_bindings;
4277 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004278 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004279
4280 VkPipelineLayout pipeline_layout;
4281 VkPipelineLayoutCreateInfo plci = {};
4282 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4283 plci.pNext = NULL;
4284 plci.setLayoutCount = 1;
4285 plci.pSetLayouts = &descriptor_set_layout;
4286 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004287 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004288
Tony Barbour552f6c02016-12-21 14:34:07 -07004289 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004290 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4291 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004292 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004293 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004294 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4295 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004296}
4297
Karl Schultz6addd812016-02-02 17:17:23 -07004298TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004299 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4300 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004301 uint64_t fake_layout_handle = 0xbaad6001;
4302 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Cody Northropc31a84f2016-08-22 10:41:47 -06004304 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06004305 VkPipelineLayout pipeline_layout;
4306 VkPipelineLayoutCreateInfo plci = {};
4307 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4308 plci.pNext = NULL;
4309 plci.setLayoutCount = 1;
4310 plci.pSetLayouts = &bad_layout;
4311 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4312
4313 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004314}
4315
Mark Muellerd4914412016-06-13 17:52:06 -06004316TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004317 TEST_DESCRIPTION(
4318 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4319 "1) A uniform buffer update must have a valid buffer index."
4320 "2) When using an array of descriptors in a single WriteDescriptor,"
4321 " the descriptor types and stageflags must all be the same."
4322 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004323
Mike Weiblena6666382017-01-05 15:16:11 -07004324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004325
4326 ASSERT_NO_FATAL_FAILURE(InitState());
4327 VkDescriptorPoolSize ds_type_count[4] = {};
4328 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4329 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004330 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004331 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004332 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004333 ds_type_count[2].descriptorCount = 1;
4334 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4335 ds_type_count[3].descriptorCount = 1;
4336
4337 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4338 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4339 ds_pool_ci.maxSets = 1;
4340 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4341 ds_pool_ci.pPoolSizes = ds_type_count;
4342
4343 VkDescriptorPool ds_pool;
4344 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4345 ASSERT_VK_SUCCESS(err);
4346
Mark Muellerb9896722016-06-16 09:54:29 -06004347 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004348 layout_binding[0].binding = 0;
4349 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4350 layout_binding[0].descriptorCount = 1;
4351 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4352 layout_binding[0].pImmutableSamplers = NULL;
4353
4354 layout_binding[1].binding = 1;
4355 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4356 layout_binding[1].descriptorCount = 1;
4357 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4358 layout_binding[1].pImmutableSamplers = NULL;
4359
4360 VkSamplerCreateInfo sampler_ci = {};
4361 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4362 sampler_ci.pNext = NULL;
4363 sampler_ci.magFilter = VK_FILTER_NEAREST;
4364 sampler_ci.minFilter = VK_FILTER_NEAREST;
4365 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4366 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4367 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4368 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4369 sampler_ci.mipLodBias = 1.0;
4370 sampler_ci.anisotropyEnable = VK_FALSE;
4371 sampler_ci.maxAnisotropy = 1;
4372 sampler_ci.compareEnable = VK_FALSE;
4373 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4374 sampler_ci.minLod = 1.0;
4375 sampler_ci.maxLod = 1.0;
4376 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4377 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4378 VkSampler sampler;
4379
4380 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4381 ASSERT_VK_SUCCESS(err);
4382
4383 layout_binding[2].binding = 2;
4384 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4385 layout_binding[2].descriptorCount = 1;
4386 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4387 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4388
Mark Muellerd4914412016-06-13 17:52:06 -06004389 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4390 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4391 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4392 ds_layout_ci.pBindings = layout_binding;
4393 VkDescriptorSetLayout ds_layout;
4394 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4395 ASSERT_VK_SUCCESS(err);
4396
4397 VkDescriptorSetAllocateInfo alloc_info = {};
4398 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4399 alloc_info.descriptorSetCount = 1;
4400 alloc_info.descriptorPool = ds_pool;
4401 alloc_info.pSetLayouts = &ds_layout;
4402 VkDescriptorSet descriptorSet;
4403 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4404 ASSERT_VK_SUCCESS(err);
4405
4406 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4407 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4408 pipeline_layout_ci.pNext = NULL;
4409 pipeline_layout_ci.setLayoutCount = 1;
4410 pipeline_layout_ci.pSetLayouts = &ds_layout;
4411
4412 VkPipelineLayout pipeline_layout;
4413 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4414 ASSERT_VK_SUCCESS(err);
4415
Mark Mueller5c838ce2016-06-16 09:54:29 -06004416 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004417 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4418 descriptor_write.dstSet = descriptorSet;
4419 descriptor_write.dstBinding = 0;
4420 descriptor_write.descriptorCount = 1;
4421 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4422
Mark Mueller5c838ce2016-06-16 09:54:29 -06004423 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004424 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4425 m_errorMonitor->VerifyFound();
4426
4427 // Create a buffer to update the descriptor with
4428 uint32_t qfi = 0;
4429 VkBufferCreateInfo buffCI = {};
4430 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4431 buffCI.size = 1024;
4432 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4433 buffCI.queueFamilyIndexCount = 1;
4434 buffCI.pQueueFamilyIndices = &qfi;
4435
4436 VkBuffer dyub;
4437 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4438 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004439
Tony Barboure132c5f2016-12-12 11:50:20 -07004440 VkDeviceMemory mem;
4441 VkMemoryRequirements mem_reqs;
4442 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4443
4444 VkMemoryAllocateInfo mem_alloc_info = {};
4445 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4446 mem_alloc_info.allocationSize = mem_reqs.size;
4447 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4448 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4449 ASSERT_VK_SUCCESS(err);
4450
4451 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4452 ASSERT_VK_SUCCESS(err);
4453
4454 VkDescriptorBufferInfo buffInfo[2] = {};
4455 buffInfo[0].buffer = dyub;
4456 buffInfo[0].offset = 0;
4457 buffInfo[0].range = 1024;
4458 buffInfo[1].buffer = dyub;
4459 buffInfo[1].offset = 0;
4460 buffInfo[1].range = 1024;
4461 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004462 descriptor_write.descriptorCount = 2;
4463
Mark Mueller5c838ce2016-06-16 09:54:29 -06004464 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004466 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4467 m_errorMonitor->VerifyFound();
4468
Mark Mueller5c838ce2016-06-16 09:54:29 -06004469 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4470 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004471 descriptor_write.dstBinding = 1;
4472 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004473
Mark Mueller5c838ce2016-06-16 09:54:29 -06004474 // Make pImageInfo index non-null to avoid complaints of it missing
4475 VkDescriptorImageInfo imageInfo = {};
4476 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4477 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004479 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4480 m_errorMonitor->VerifyFound();
4481
Mark Muellerd4914412016-06-13 17:52:06 -06004482 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004483 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004484 vkDestroySampler(m_device->device(), sampler, NULL);
4485 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4486 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4487 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4488}
4489
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004490TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004491 TEST_DESCRIPTION(
4492 "Attempt to draw with a command buffer that is invalid "
4493 "due to a buffer dependency being destroyed.");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004494 ASSERT_NO_FATAL_FAILURE(InitState());
4495
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004496 VkBuffer buffer;
4497 VkDeviceMemory mem;
4498 VkMemoryRequirements mem_reqs;
4499
4500 VkBufferCreateInfo buf_info = {};
4501 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004502 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004503 buf_info.size = 256;
4504 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4505 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4506 ASSERT_VK_SUCCESS(err);
4507
4508 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4509
4510 VkMemoryAllocateInfo alloc_info = {};
4511 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4512 alloc_info.allocationSize = 256;
4513 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004514 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 -06004515 if (!pass) {
4516 vkDestroyBuffer(m_device->device(), buffer, NULL);
4517 return;
4518 }
4519 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4520 ASSERT_VK_SUCCESS(err);
4521
4522 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4523 ASSERT_VK_SUCCESS(err);
4524
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004525 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004526 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004527 m_commandBuffer->EndCommandBuffer();
4528
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004530 // Destroy buffer dependency prior to submit to cause ERROR
4531 vkDestroyBuffer(m_device->device(), buffer, NULL);
4532
4533 VkSubmitInfo submit_info = {};
4534 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4535 submit_info.commandBufferCount = 1;
4536 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4537 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4538
4539 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004540 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004541 vkFreeMemory(m_device->handle(), mem, NULL);
4542}
4543
Tobin Ehlisea413442016-09-28 10:23:59 -06004544TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4545 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4546
4547 ASSERT_NO_FATAL_FAILURE(InitState());
4548 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4549
4550 VkDescriptorPoolSize ds_type_count;
4551 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4552 ds_type_count.descriptorCount = 1;
4553
4554 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4555 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4556 ds_pool_ci.maxSets = 1;
4557 ds_pool_ci.poolSizeCount = 1;
4558 ds_pool_ci.pPoolSizes = &ds_type_count;
4559
4560 VkDescriptorPool ds_pool;
4561 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4562 ASSERT_VK_SUCCESS(err);
4563
4564 VkDescriptorSetLayoutBinding layout_binding;
4565 layout_binding.binding = 0;
4566 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4567 layout_binding.descriptorCount = 1;
4568 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4569 layout_binding.pImmutableSamplers = NULL;
4570
4571 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4572 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4573 ds_layout_ci.bindingCount = 1;
4574 ds_layout_ci.pBindings = &layout_binding;
4575 VkDescriptorSetLayout ds_layout;
4576 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4577 ASSERT_VK_SUCCESS(err);
4578
4579 VkDescriptorSetAllocateInfo alloc_info = {};
4580 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4581 alloc_info.descriptorSetCount = 1;
4582 alloc_info.descriptorPool = ds_pool;
4583 alloc_info.pSetLayouts = &ds_layout;
4584 VkDescriptorSet descriptor_set;
4585 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4586 ASSERT_VK_SUCCESS(err);
4587
4588 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4589 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4590 pipeline_layout_ci.pNext = NULL;
4591 pipeline_layout_ci.setLayoutCount = 1;
4592 pipeline_layout_ci.pSetLayouts = &ds_layout;
4593
4594 VkPipelineLayout pipeline_layout;
4595 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4596 ASSERT_VK_SUCCESS(err);
4597
4598 VkBuffer buffer;
4599 uint32_t queue_family_index = 0;
4600 VkBufferCreateInfo buffer_create_info = {};
4601 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4602 buffer_create_info.size = 1024;
4603 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4604 buffer_create_info.queueFamilyIndexCount = 1;
4605 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4606
4607 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4608 ASSERT_VK_SUCCESS(err);
4609
4610 VkMemoryRequirements memory_reqs;
4611 VkDeviceMemory buffer_memory;
4612
4613 VkMemoryAllocateInfo memory_info = {};
4614 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4615 memory_info.allocationSize = 0;
4616 memory_info.memoryTypeIndex = 0;
4617
4618 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4619 memory_info.allocationSize = memory_reqs.size;
4620 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4621 ASSERT_TRUE(pass);
4622
4623 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4624 ASSERT_VK_SUCCESS(err);
4625 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4626 ASSERT_VK_SUCCESS(err);
4627
4628 VkBufferView view;
4629 VkBufferViewCreateInfo bvci = {};
4630 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4631 bvci.buffer = buffer;
4632 bvci.format = VK_FORMAT_R8_UNORM;
4633 bvci.range = VK_WHOLE_SIZE;
4634
4635 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4636 ASSERT_VK_SUCCESS(err);
4637
4638 VkWriteDescriptorSet descriptor_write = {};
4639 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4640 descriptor_write.dstSet = descriptor_set;
4641 descriptor_write.dstBinding = 0;
4642 descriptor_write.descriptorCount = 1;
4643 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4644 descriptor_write.pTexelBufferView = &view;
4645
4646 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4647
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004648 char const *vsSource =
4649 "#version 450\n"
4650 "\n"
4651 "out gl_PerVertex { \n"
4652 " vec4 gl_Position;\n"
4653 "};\n"
4654 "void main(){\n"
4655 " gl_Position = vec4(1);\n"
4656 "}\n";
4657 char const *fsSource =
4658 "#version 450\n"
4659 "\n"
4660 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4661 "layout(location=0) out vec4 x;\n"
4662 "void main(){\n"
4663 " x = imageLoad(s, 0);\n"
4664 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004665 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4666 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4667 VkPipelineObj pipe(m_device);
4668 pipe.AddShader(&vs);
4669 pipe.AddShader(&fs);
4670 pipe.AddColorAttachment();
4671 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4672
4673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted buffer view ");
4674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4675
Tony Barbour552f6c02016-12-21 14:34:07 -07004676 m_commandBuffer->BeginCommandBuffer();
4677 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4678
Tobin Ehlisea413442016-09-28 10:23:59 -06004679 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4680 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4681 VkRect2D scissor = {{0, 0}, {16, 16}};
4682 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4683 // Bind pipeline to cmd buffer
4684 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4685 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4686 &descriptor_set, 0, nullptr);
4687 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004688 m_commandBuffer->EndRenderPass();
4689 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004690
4691 // Delete BufferView in order to invalidate cmd buffer
4692 vkDestroyBufferView(m_device->device(), view, NULL);
4693 // Now attempt submit of cmd buffer
4694 VkSubmitInfo submit_info = {};
4695 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4696 submit_info.commandBufferCount = 1;
4697 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4698 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4699 m_errorMonitor->VerifyFound();
4700
4701 // Clean-up
4702 vkDestroyBuffer(m_device->device(), buffer, NULL);
4703 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4704 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4705 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4706 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4707}
4708
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004709TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004710 TEST_DESCRIPTION(
4711 "Attempt to draw with a command buffer that is invalid "
4712 "due to an image dependency being destroyed.");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004713 ASSERT_NO_FATAL_FAILURE(InitState());
4714
4715 VkImage image;
4716 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4717 VkImageCreateInfo image_create_info = {};
4718 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4719 image_create_info.pNext = NULL;
4720 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4721 image_create_info.format = tex_format;
4722 image_create_info.extent.width = 32;
4723 image_create_info.extent.height = 32;
4724 image_create_info.extent.depth = 1;
4725 image_create_info.mipLevels = 1;
4726 image_create_info.arrayLayers = 1;
4727 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4728 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004729 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004730 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004731 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004732 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004733 // Have to bind memory to image before recording cmd in cmd buffer using it
4734 VkMemoryRequirements mem_reqs;
4735 VkDeviceMemory image_mem;
4736 bool pass;
4737 VkMemoryAllocateInfo mem_alloc = {};
4738 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4739 mem_alloc.pNext = NULL;
4740 mem_alloc.memoryTypeIndex = 0;
4741 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4742 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004743 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004744 ASSERT_TRUE(pass);
4745 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4746 ASSERT_VK_SUCCESS(err);
4747 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4748 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004749
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004750 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004751 VkClearColorValue ccv;
4752 ccv.float32[0] = 1.0f;
4753 ccv.float32[1] = 1.0f;
4754 ccv.float32[2] = 1.0f;
4755 ccv.float32[3] = 1.0f;
4756 VkImageSubresourceRange isr = {};
4757 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004758 isr.baseArrayLayer = 0;
4759 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004760 isr.layerCount = 1;
4761 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004762 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004763 m_commandBuffer->EndCommandBuffer();
4764
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004766 // Destroy image dependency prior to submit to cause ERROR
4767 vkDestroyImage(m_device->device(), image, NULL);
4768
4769 VkSubmitInfo submit_info = {};
4770 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4771 submit_info.commandBufferCount = 1;
4772 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4773 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4774
4775 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004776 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004777}
4778
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004779TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004780 TEST_DESCRIPTION(
4781 "Attempt to draw with a command buffer that is invalid "
4782 "due to a framebuffer image dependency being destroyed.");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004783 VkFormatProperties format_properties;
4784 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004785 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4786 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004787 return;
4788 }
4789
4790 ASSERT_NO_FATAL_FAILURE(InitState());
4791 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4792
4793 VkImageCreateInfo image_ci = {};
4794 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4795 image_ci.pNext = NULL;
4796 image_ci.imageType = VK_IMAGE_TYPE_2D;
4797 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4798 image_ci.extent.width = 32;
4799 image_ci.extent.height = 32;
4800 image_ci.extent.depth = 1;
4801 image_ci.mipLevels = 1;
4802 image_ci.arrayLayers = 1;
4803 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4804 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004805 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004806 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4807 image_ci.flags = 0;
4808 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004809 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004810
4811 VkMemoryRequirements memory_reqs;
4812 VkDeviceMemory image_memory;
4813 bool pass;
4814 VkMemoryAllocateInfo memory_info = {};
4815 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4816 memory_info.pNext = NULL;
4817 memory_info.allocationSize = 0;
4818 memory_info.memoryTypeIndex = 0;
4819 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4820 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004821 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004822 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004823 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004824 ASSERT_VK_SUCCESS(err);
4825 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4826 ASSERT_VK_SUCCESS(err);
4827
4828 VkImageViewCreateInfo ivci = {
4829 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4830 nullptr,
4831 0,
4832 image,
4833 VK_IMAGE_VIEW_TYPE_2D,
4834 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004835 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004836 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4837 };
4838 VkImageView view;
4839 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4840 ASSERT_VK_SUCCESS(err);
4841
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004842 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004843 VkFramebuffer fb;
4844 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4845 ASSERT_VK_SUCCESS(err);
4846
4847 // Just use default renderpass with our framebuffer
4848 m_renderPassBeginInfo.framebuffer = fb;
4849 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004850 m_commandBuffer->BeginCommandBuffer();
4851 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4852 m_commandBuffer->EndRenderPass();
4853 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004854 // Destroy image attached to framebuffer to invalidate cmd buffer
4855 vkDestroyImage(m_device->device(), image, NULL);
4856 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004858 QueueCommandBuffer(false);
4859 m_errorMonitor->VerifyFound();
4860
4861 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4862 vkDestroyImageView(m_device->device(), view, nullptr);
4863 vkFreeMemory(m_device->device(), image_memory, nullptr);
4864}
4865
Tobin Ehlisb329f992016-10-12 13:20:29 -06004866TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
4867 TEST_DESCRIPTION("Delete in-use framebuffer.");
4868 VkFormatProperties format_properties;
4869 VkResult err = VK_SUCCESS;
4870 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4871
4872 ASSERT_NO_FATAL_FAILURE(InitState());
4873 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4874
4875 VkImageObj image(m_device);
4876 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4877 ASSERT_TRUE(image.initialized());
4878 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
4879
4880 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4881 VkFramebuffer fb;
4882 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4883 ASSERT_VK_SUCCESS(err);
4884
4885 // Just use default renderpass with our framebuffer
4886 m_renderPassBeginInfo.framebuffer = fb;
4887 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004888 m_commandBuffer->BeginCommandBuffer();
4889 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4890 m_commandBuffer->EndRenderPass();
4891 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06004892 // Submit cmd buffer to put it in-flight
4893 VkSubmitInfo submit_info = {};
4894 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4895 submit_info.commandBufferCount = 1;
4896 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4897 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4898 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06004900 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4901 m_errorMonitor->VerifyFound();
4902 // Wait for queue to complete so we can safely destroy everything
4903 vkQueueWaitIdle(m_device->m_queue);
4904 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4905}
4906
Tobin Ehlis88becd72016-09-21 14:33:41 -06004907TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
4908 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
4909 VkFormatProperties format_properties;
4910 VkResult err = VK_SUCCESS;
4911 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06004912
4913 ASSERT_NO_FATAL_FAILURE(InitState());
4914 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4915
4916 VkImageCreateInfo image_ci = {};
4917 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4918 image_ci.pNext = NULL;
4919 image_ci.imageType = VK_IMAGE_TYPE_2D;
4920 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4921 image_ci.extent.width = 256;
4922 image_ci.extent.height = 256;
4923 image_ci.extent.depth = 1;
4924 image_ci.mipLevels = 1;
4925 image_ci.arrayLayers = 1;
4926 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4927 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06004928 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06004929 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4930 image_ci.flags = 0;
4931 VkImage image;
4932 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
4933
4934 VkMemoryRequirements memory_reqs;
4935 VkDeviceMemory image_memory;
4936 bool pass;
4937 VkMemoryAllocateInfo memory_info = {};
4938 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4939 memory_info.pNext = NULL;
4940 memory_info.allocationSize = 0;
4941 memory_info.memoryTypeIndex = 0;
4942 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4943 memory_info.allocationSize = memory_reqs.size;
4944 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4945 ASSERT_TRUE(pass);
4946 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
4947 ASSERT_VK_SUCCESS(err);
4948 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4949 ASSERT_VK_SUCCESS(err);
4950
4951 VkImageViewCreateInfo ivci = {
4952 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4953 nullptr,
4954 0,
4955 image,
4956 VK_IMAGE_VIEW_TYPE_2D,
4957 VK_FORMAT_B8G8R8A8_UNORM,
4958 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
4959 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4960 };
4961 VkImageView view;
4962 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4963 ASSERT_VK_SUCCESS(err);
4964
4965 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4966 VkFramebuffer fb;
4967 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4968 ASSERT_VK_SUCCESS(err);
4969
4970 // Just use default renderpass with our framebuffer
4971 m_renderPassBeginInfo.framebuffer = fb;
4972 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004973 m_commandBuffer->BeginCommandBuffer();
4974 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4975 m_commandBuffer->EndRenderPass();
4976 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06004977 // Submit cmd buffer to put it (and attached imageView) in-flight
4978 VkSubmitInfo submit_info = {};
4979 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4980 submit_info.commandBufferCount = 1;
4981 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4982 // Submit cmd buffer to put framebuffer and children in-flight
4983 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4984 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06004986 vkDestroyImage(m_device->device(), image, NULL);
4987 m_errorMonitor->VerifyFound();
4988 // Wait for queue to complete so we can safely destroy image and other objects
4989 vkQueueWaitIdle(m_device->m_queue);
4990 vkDestroyImage(m_device->device(), image, NULL);
4991 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4992 vkDestroyImageView(m_device->device(), view, nullptr);
4993 vkFreeMemory(m_device->device(), image_memory, nullptr);
4994}
4995
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06004996TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
4997 TEST_DESCRIPTION("Delete in-use renderPass.");
4998
4999 ASSERT_NO_FATAL_FAILURE(InitState());
5000 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5001
5002 // Create simple renderpass
5003 VkAttachmentReference attach = {};
5004 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5005 VkSubpassDescription subpass = {};
5006 subpass.pColorAttachments = &attach;
5007 VkRenderPassCreateInfo rpci = {};
5008 rpci.subpassCount = 1;
5009 rpci.pSubpasses = &subpass;
5010 rpci.attachmentCount = 1;
5011 VkAttachmentDescription attach_desc = {};
5012 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5013 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5014 rpci.pAttachments = &attach_desc;
5015 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5016 VkRenderPass rp;
5017 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5018 ASSERT_VK_SUCCESS(err);
5019
5020 // Create a pipeline that uses the given renderpass
5021 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5022 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5023
5024 VkPipelineLayout pipeline_layout;
5025 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5026 ASSERT_VK_SUCCESS(err);
5027
5028 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5029 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5030 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005031 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005032 vp_state_ci.pViewports = &vp;
5033 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005034 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005035 vp_state_ci.pScissors = &scissors;
5036
5037 VkPipelineShaderStageCreateInfo shaderStages[2];
5038 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5039
5040 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005041 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005042 // but add it to be able to run on more devices
5043 shaderStages[0] = vs.GetStageCreateInfo();
5044 shaderStages[1] = fs.GetStageCreateInfo();
5045
5046 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5047 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5048
5049 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5050 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5051 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5052
5053 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5054 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5055 rs_ci.rasterizerDiscardEnable = true;
5056 rs_ci.lineWidth = 1.0f;
5057
5058 VkPipelineColorBlendAttachmentState att = {};
5059 att.blendEnable = VK_FALSE;
5060 att.colorWriteMask = 0xf;
5061
5062 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5063 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5064 cb_ci.attachmentCount = 1;
5065 cb_ci.pAttachments = &att;
5066
5067 VkGraphicsPipelineCreateInfo gp_ci = {};
5068 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5069 gp_ci.stageCount = 2;
5070 gp_ci.pStages = shaderStages;
5071 gp_ci.pVertexInputState = &vi_ci;
5072 gp_ci.pInputAssemblyState = &ia_ci;
5073 gp_ci.pViewportState = &vp_state_ci;
5074 gp_ci.pRasterizationState = &rs_ci;
5075 gp_ci.pColorBlendState = &cb_ci;
5076 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5077 gp_ci.layout = pipeline_layout;
5078 gp_ci.renderPass = rp;
5079
5080 VkPipelineCacheCreateInfo pc_ci = {};
5081 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5082
5083 VkPipeline pipeline;
5084 VkPipelineCache pipe_cache;
5085 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5086 ASSERT_VK_SUCCESS(err);
5087
5088 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5089 ASSERT_VK_SUCCESS(err);
5090 // Bind pipeline to cmd buffer, will also bind renderpass
5091 m_commandBuffer->BeginCommandBuffer();
5092 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5093 m_commandBuffer->EndCommandBuffer();
5094
5095 VkSubmitInfo submit_info = {};
5096 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5097 submit_info.commandBufferCount = 1;
5098 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5099 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5100
5101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5102 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5103 m_errorMonitor->VerifyFound();
5104
5105 // Wait for queue to complete so we can safely destroy everything
5106 vkQueueWaitIdle(m_device->m_queue);
5107 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5108 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5109 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5110 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5111}
5112
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005113TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005114 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005115 ASSERT_NO_FATAL_FAILURE(InitState());
5116
5117 VkImage image;
5118 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5119 VkImageCreateInfo image_create_info = {};
5120 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5121 image_create_info.pNext = NULL;
5122 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5123 image_create_info.format = tex_format;
5124 image_create_info.extent.width = 32;
5125 image_create_info.extent.height = 32;
5126 image_create_info.extent.depth = 1;
5127 image_create_info.mipLevels = 1;
5128 image_create_info.arrayLayers = 1;
5129 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5130 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005131 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005132 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005133 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005134 ASSERT_VK_SUCCESS(err);
5135 // Have to bind memory to image before recording cmd in cmd buffer using it
5136 VkMemoryRequirements mem_reqs;
5137 VkDeviceMemory image_mem;
5138 bool pass;
5139 VkMemoryAllocateInfo mem_alloc = {};
5140 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5141 mem_alloc.pNext = NULL;
5142 mem_alloc.memoryTypeIndex = 0;
5143 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5144 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005145 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005146 ASSERT_TRUE(pass);
5147 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5148 ASSERT_VK_SUCCESS(err);
5149
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005150 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005152 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005153
5154 m_commandBuffer->BeginCommandBuffer();
5155 VkClearColorValue ccv;
5156 ccv.float32[0] = 1.0f;
5157 ccv.float32[1] = 1.0f;
5158 ccv.float32[2] = 1.0f;
5159 ccv.float32[3] = 1.0f;
5160 VkImageSubresourceRange isr = {};
5161 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5162 isr.baseArrayLayer = 0;
5163 isr.baseMipLevel = 0;
5164 isr.layerCount = 1;
5165 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005166 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005167 m_commandBuffer->EndCommandBuffer();
5168
5169 m_errorMonitor->VerifyFound();
5170 vkDestroyImage(m_device->device(), image, NULL);
5171 vkFreeMemory(m_device->device(), image_mem, nullptr);
5172}
5173
5174TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005175 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005176 ASSERT_NO_FATAL_FAILURE(InitState());
5177
5178 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005179 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 -06005180 VK_IMAGE_TILING_OPTIMAL, 0);
5181 ASSERT_TRUE(image.initialized());
5182
5183 VkBuffer buffer;
5184 VkDeviceMemory mem;
5185 VkMemoryRequirements mem_reqs;
5186
5187 VkBufferCreateInfo buf_info = {};
5188 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005189 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005190 buf_info.size = 256;
5191 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5192 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5193 ASSERT_VK_SUCCESS(err);
5194
5195 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5196
5197 VkMemoryAllocateInfo alloc_info = {};
5198 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5199 alloc_info.allocationSize = 256;
5200 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005201 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 -06005202 if (!pass) {
5203 vkDestroyBuffer(m_device->device(), buffer, NULL);
5204 return;
5205 }
5206 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5207 ASSERT_VK_SUCCESS(err);
5208
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005209 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005211 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005212 VkBufferImageCopy region = {};
5213 region.bufferRowLength = 128;
5214 region.bufferImageHeight = 128;
5215 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5216
5217 region.imageSubresource.layerCount = 1;
5218 region.imageExtent.height = 4;
5219 region.imageExtent.width = 4;
5220 region.imageExtent.depth = 1;
5221 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005222 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5223 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005224 m_commandBuffer->EndCommandBuffer();
5225
5226 m_errorMonitor->VerifyFound();
5227
5228 vkDestroyBuffer(m_device->device(), buffer, NULL);
5229 vkFreeMemory(m_device->handle(), mem, NULL);
5230}
5231
Tobin Ehlis85940f52016-07-07 16:57:21 -06005232TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005233 TEST_DESCRIPTION(
5234 "Attempt to draw with a command buffer that is invalid "
5235 "due to an event dependency being destroyed.");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005236 ASSERT_NO_FATAL_FAILURE(InitState());
5237
5238 VkEvent event;
5239 VkEventCreateInfo evci = {};
5240 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5241 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5242 ASSERT_VK_SUCCESS(result);
5243
5244 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005245 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005246 m_commandBuffer->EndCommandBuffer();
5247
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005249 // Destroy event dependency prior to submit to cause ERROR
5250 vkDestroyEvent(m_device->device(), event, NULL);
5251
5252 VkSubmitInfo submit_info = {};
5253 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5254 submit_info.commandBufferCount = 1;
5255 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5256 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5257
5258 m_errorMonitor->VerifyFound();
5259}
5260
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005261TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005262 TEST_DESCRIPTION(
5263 "Attempt to draw with a command buffer that is invalid "
5264 "due to a query pool dependency being destroyed.");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005265 ASSERT_NO_FATAL_FAILURE(InitState());
5266
5267 VkQueryPool query_pool;
5268 VkQueryPoolCreateInfo qpci{};
5269 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5270 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5271 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005272 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005273 ASSERT_VK_SUCCESS(result);
5274
5275 m_commandBuffer->BeginCommandBuffer();
5276 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5277 m_commandBuffer->EndCommandBuffer();
5278
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005280 // Destroy query pool dependency prior to submit to cause ERROR
5281 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5282
5283 VkSubmitInfo submit_info = {};
5284 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5285 submit_info.commandBufferCount = 1;
5286 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5287 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5288
5289 m_errorMonitor->VerifyFound();
5290}
5291
Tobin Ehlis24130d92016-07-08 15:50:53 -06005292TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005293 TEST_DESCRIPTION(
5294 "Attempt to draw with a command buffer that is invalid "
5295 "due to a pipeline dependency being destroyed.");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005296 ASSERT_NO_FATAL_FAILURE(InitState());
5297 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5298
5299 VkResult err;
5300
5301 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5302 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5303
5304 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005305 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005306 ASSERT_VK_SUCCESS(err);
5307
5308 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5309 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5310 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005311 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005312 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005313 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005314 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005315 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005316
5317 VkPipelineShaderStageCreateInfo shaderStages[2];
5318 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5319
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005320 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005321 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005322 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005323 shaderStages[0] = vs.GetStageCreateInfo();
5324 shaderStages[1] = fs.GetStageCreateInfo();
5325
5326 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5327 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5328
5329 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5330 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5331 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5332
5333 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5334 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005335 rs_ci.rasterizerDiscardEnable = true;
5336 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005337
5338 VkPipelineColorBlendAttachmentState att = {};
5339 att.blendEnable = VK_FALSE;
5340 att.colorWriteMask = 0xf;
5341
5342 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5343 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5344 cb_ci.attachmentCount = 1;
5345 cb_ci.pAttachments = &att;
5346
5347 VkGraphicsPipelineCreateInfo gp_ci = {};
5348 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5349 gp_ci.stageCount = 2;
5350 gp_ci.pStages = shaderStages;
5351 gp_ci.pVertexInputState = &vi_ci;
5352 gp_ci.pInputAssemblyState = &ia_ci;
5353 gp_ci.pViewportState = &vp_state_ci;
5354 gp_ci.pRasterizationState = &rs_ci;
5355 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005356 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5357 gp_ci.layout = pipeline_layout;
5358 gp_ci.renderPass = renderPass();
5359
5360 VkPipelineCacheCreateInfo pc_ci = {};
5361 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5362
5363 VkPipeline pipeline;
5364 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005365 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005366 ASSERT_VK_SUCCESS(err);
5367
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005368 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005369 ASSERT_VK_SUCCESS(err);
5370
5371 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005372 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005373 m_commandBuffer->EndCommandBuffer();
5374 // Now destroy pipeline in order to cause error when submitting
5375 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5376
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005378
5379 VkSubmitInfo submit_info = {};
5380 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5381 submit_info.commandBufferCount = 1;
5382 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5383 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5384
5385 m_errorMonitor->VerifyFound();
5386 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5387 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5388}
5389
Tobin Ehlis31289162016-08-17 14:57:58 -06005390TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005391 TEST_DESCRIPTION(
5392 "Attempt to draw with a command buffer that is invalid "
5393 "due to a bound descriptor set with a buffer dependency "
5394 "being destroyed.");
Tobin Ehlis31289162016-08-17 14:57:58 -06005395 ASSERT_NO_FATAL_FAILURE(InitState());
5396 ASSERT_NO_FATAL_FAILURE(InitViewport());
5397 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5398
5399 VkDescriptorPoolSize ds_type_count = {};
5400 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5401 ds_type_count.descriptorCount = 1;
5402
5403 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5404 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5405 ds_pool_ci.pNext = NULL;
5406 ds_pool_ci.maxSets = 1;
5407 ds_pool_ci.poolSizeCount = 1;
5408 ds_pool_ci.pPoolSizes = &ds_type_count;
5409
5410 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005411 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005412 ASSERT_VK_SUCCESS(err);
5413
5414 VkDescriptorSetLayoutBinding dsl_binding = {};
5415 dsl_binding.binding = 0;
5416 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5417 dsl_binding.descriptorCount = 1;
5418 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5419 dsl_binding.pImmutableSamplers = NULL;
5420
5421 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5422 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5423 ds_layout_ci.pNext = NULL;
5424 ds_layout_ci.bindingCount = 1;
5425 ds_layout_ci.pBindings = &dsl_binding;
5426 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005427 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005428 ASSERT_VK_SUCCESS(err);
5429
5430 VkDescriptorSet descriptorSet;
5431 VkDescriptorSetAllocateInfo alloc_info = {};
5432 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5433 alloc_info.descriptorSetCount = 1;
5434 alloc_info.descriptorPool = ds_pool;
5435 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005436 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005437 ASSERT_VK_SUCCESS(err);
5438
5439 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5440 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5441 pipeline_layout_ci.pNext = NULL;
5442 pipeline_layout_ci.setLayoutCount = 1;
5443 pipeline_layout_ci.pSetLayouts = &ds_layout;
5444
5445 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005446 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005447 ASSERT_VK_SUCCESS(err);
5448
5449 // Create a buffer to update the descriptor with
5450 uint32_t qfi = 0;
5451 VkBufferCreateInfo buffCI = {};
5452 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5453 buffCI.size = 1024;
5454 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5455 buffCI.queueFamilyIndexCount = 1;
5456 buffCI.pQueueFamilyIndices = &qfi;
5457
5458 VkBuffer buffer;
5459 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5460 ASSERT_VK_SUCCESS(err);
5461 // Allocate memory and bind to buffer so we can make it to the appropriate
5462 // error
5463 VkMemoryAllocateInfo mem_alloc = {};
5464 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5465 mem_alloc.pNext = NULL;
5466 mem_alloc.allocationSize = 1024;
5467 mem_alloc.memoryTypeIndex = 0;
5468
5469 VkMemoryRequirements memReqs;
5470 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005471 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005472 if (!pass) {
5473 vkDestroyBuffer(m_device->device(), buffer, NULL);
5474 return;
5475 }
5476
5477 VkDeviceMemory mem;
5478 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5479 ASSERT_VK_SUCCESS(err);
5480 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5481 ASSERT_VK_SUCCESS(err);
5482 // Correctly update descriptor to avoid "NOT_UPDATED" error
5483 VkDescriptorBufferInfo buffInfo = {};
5484 buffInfo.buffer = buffer;
5485 buffInfo.offset = 0;
5486 buffInfo.range = 1024;
5487
5488 VkWriteDescriptorSet descriptor_write;
5489 memset(&descriptor_write, 0, sizeof(descriptor_write));
5490 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5491 descriptor_write.dstSet = descriptorSet;
5492 descriptor_write.dstBinding = 0;
5493 descriptor_write.descriptorCount = 1;
5494 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5495 descriptor_write.pBufferInfo = &buffInfo;
5496
5497 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5498
5499 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005500 char const *vsSource =
5501 "#version 450\n"
5502 "\n"
5503 "out gl_PerVertex { \n"
5504 " vec4 gl_Position;\n"
5505 "};\n"
5506 "void main(){\n"
5507 " gl_Position = vec4(1);\n"
5508 "}\n";
5509 char const *fsSource =
5510 "#version 450\n"
5511 "\n"
5512 "layout(location=0) out vec4 x;\n"
5513 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5514 "void main(){\n"
5515 " x = vec4(bar.y);\n"
5516 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005517 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5518 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5519 VkPipelineObj pipe(m_device);
5520 pipe.AddShader(&vs);
5521 pipe.AddShader(&fs);
5522 pipe.AddColorAttachment();
5523 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5524
Tony Barbour552f6c02016-12-21 14:34:07 -07005525 m_commandBuffer->BeginCommandBuffer();
5526 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005527 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5528 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5529 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005530
5531 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5532 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5533
Tobin Ehlis31289162016-08-17 14:57:58 -06005534 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005535 m_commandBuffer->EndRenderPass();
5536 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005538 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5539 vkDestroyBuffer(m_device->device(), buffer, NULL);
5540 // Attempt to submit cmd buffer
5541 VkSubmitInfo submit_info = {};
5542 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5543 submit_info.commandBufferCount = 1;
5544 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5545 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5546 m_errorMonitor->VerifyFound();
5547 // Cleanup
5548 vkFreeMemory(m_device->device(), mem, NULL);
5549
5550 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5551 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5552 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5553}
5554
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005555TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005556 TEST_DESCRIPTION(
5557 "Attempt to draw with a command buffer that is invalid "
5558 "due to a bound descriptor sets with a combined image "
5559 "sampler having their image, sampler, and descriptor set "
5560 "each respectively destroyed and then attempting to "
5561 "submit associated cmd buffers. Attempt to destroy a "
5562 "DescriptorSet that is in use.");
Rene Lindsayed88b732017-01-27 15:55:29 -07005563 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005564 ASSERT_NO_FATAL_FAILURE(InitViewport());
5565 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5566
5567 VkDescriptorPoolSize ds_type_count = {};
5568 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5569 ds_type_count.descriptorCount = 1;
5570
5571 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5572 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5573 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005574 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005575 ds_pool_ci.maxSets = 1;
5576 ds_pool_ci.poolSizeCount = 1;
5577 ds_pool_ci.pPoolSizes = &ds_type_count;
5578
5579 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005580 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005581 ASSERT_VK_SUCCESS(err);
5582
5583 VkDescriptorSetLayoutBinding dsl_binding = {};
5584 dsl_binding.binding = 0;
5585 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5586 dsl_binding.descriptorCount = 1;
5587 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5588 dsl_binding.pImmutableSamplers = NULL;
5589
5590 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5591 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5592 ds_layout_ci.pNext = NULL;
5593 ds_layout_ci.bindingCount = 1;
5594 ds_layout_ci.pBindings = &dsl_binding;
5595 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005596 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005597 ASSERT_VK_SUCCESS(err);
5598
5599 VkDescriptorSet descriptorSet;
5600 VkDescriptorSetAllocateInfo alloc_info = {};
5601 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5602 alloc_info.descriptorSetCount = 1;
5603 alloc_info.descriptorPool = ds_pool;
5604 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005605 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005606 ASSERT_VK_SUCCESS(err);
5607
5608 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5609 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5610 pipeline_layout_ci.pNext = NULL;
5611 pipeline_layout_ci.setLayoutCount = 1;
5612 pipeline_layout_ci.pSetLayouts = &ds_layout;
5613
5614 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005615 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005616 ASSERT_VK_SUCCESS(err);
5617
5618 // Create images to update the descriptor with
5619 VkImage image;
5620 VkImage image2;
5621 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5622 const int32_t tex_width = 32;
5623 const int32_t tex_height = 32;
5624 VkImageCreateInfo image_create_info = {};
5625 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5626 image_create_info.pNext = NULL;
5627 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5628 image_create_info.format = tex_format;
5629 image_create_info.extent.width = tex_width;
5630 image_create_info.extent.height = tex_height;
5631 image_create_info.extent.depth = 1;
5632 image_create_info.mipLevels = 1;
5633 image_create_info.arrayLayers = 1;
5634 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5635 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5636 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5637 image_create_info.flags = 0;
5638 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5639 ASSERT_VK_SUCCESS(err);
5640 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5641 ASSERT_VK_SUCCESS(err);
5642
5643 VkMemoryRequirements memory_reqs;
5644 VkDeviceMemory image_memory;
5645 bool pass;
5646 VkMemoryAllocateInfo memory_info = {};
5647 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5648 memory_info.pNext = NULL;
5649 memory_info.allocationSize = 0;
5650 memory_info.memoryTypeIndex = 0;
5651 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5652 // Allocate enough memory for both images
5653 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005654 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005655 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005656 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005657 ASSERT_VK_SUCCESS(err);
5658 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5659 ASSERT_VK_SUCCESS(err);
5660 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005661 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005662 ASSERT_VK_SUCCESS(err);
5663
5664 VkImageViewCreateInfo image_view_create_info = {};
5665 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5666 image_view_create_info.image = image;
5667 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5668 image_view_create_info.format = tex_format;
5669 image_view_create_info.subresourceRange.layerCount = 1;
5670 image_view_create_info.subresourceRange.baseMipLevel = 0;
5671 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005672 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005673
5674 VkImageView view;
5675 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005676 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005677 ASSERT_VK_SUCCESS(err);
5678 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005679 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005680 ASSERT_VK_SUCCESS(err);
5681 // Create Samplers
5682 VkSamplerCreateInfo sampler_ci = {};
5683 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5684 sampler_ci.pNext = NULL;
5685 sampler_ci.magFilter = VK_FILTER_NEAREST;
5686 sampler_ci.minFilter = VK_FILTER_NEAREST;
5687 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5688 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5689 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5690 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5691 sampler_ci.mipLodBias = 1.0;
5692 sampler_ci.anisotropyEnable = VK_FALSE;
5693 sampler_ci.maxAnisotropy = 1;
5694 sampler_ci.compareEnable = VK_FALSE;
5695 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5696 sampler_ci.minLod = 1.0;
5697 sampler_ci.maxLod = 1.0;
5698 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5699 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5700 VkSampler sampler;
5701 VkSampler sampler2;
5702 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5703 ASSERT_VK_SUCCESS(err);
5704 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5705 ASSERT_VK_SUCCESS(err);
5706 // Update descriptor with image and sampler
5707 VkDescriptorImageInfo img_info = {};
5708 img_info.sampler = sampler;
5709 img_info.imageView = view;
5710 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5711
5712 VkWriteDescriptorSet descriptor_write;
5713 memset(&descriptor_write, 0, sizeof(descriptor_write));
5714 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5715 descriptor_write.dstSet = descriptorSet;
5716 descriptor_write.dstBinding = 0;
5717 descriptor_write.descriptorCount = 1;
5718 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5719 descriptor_write.pImageInfo = &img_info;
5720
5721 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5722
5723 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005724 char const *vsSource =
5725 "#version 450\n"
5726 "\n"
5727 "out gl_PerVertex { \n"
5728 " vec4 gl_Position;\n"
5729 "};\n"
5730 "void main(){\n"
5731 " gl_Position = vec4(1);\n"
5732 "}\n";
5733 char const *fsSource =
5734 "#version 450\n"
5735 "\n"
5736 "layout(set=0, binding=0) uniform sampler2D s;\n"
5737 "layout(location=0) out vec4 x;\n"
5738 "void main(){\n"
5739 " x = texture(s, vec2(1));\n"
5740 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005741 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5742 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5743 VkPipelineObj pipe(m_device);
5744 pipe.AddShader(&vs);
5745 pipe.AddShader(&fs);
5746 pipe.AddColorAttachment();
5747 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5748
5749 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005750 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted sampler ");
Tony Barbour552f6c02016-12-21 14:34:07 -07005751 m_commandBuffer->BeginCommandBuffer();
5752 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005753 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5754 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5755 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005756 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5757 VkRect2D scissor = {{0, 0}, {16, 16}};
5758 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5759 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005760 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005761 m_commandBuffer->EndRenderPass();
5762 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005763 // Destroy sampler invalidates the cmd buffer, causing error on submit
5764 vkDestroySampler(m_device->device(), sampler, NULL);
5765 // Attempt to submit cmd buffer
5766 VkSubmitInfo submit_info = {};
5767 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5768 submit_info.commandBufferCount = 1;
5769 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5770 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5771 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005772
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005773 // Now re-update descriptor with valid sampler and delete image
5774 img_info.sampler = sampler2;
5775 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005776
5777 VkCommandBufferBeginInfo info = {};
5778 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5779 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5780
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005782 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005783 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005784 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5785 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5786 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005787 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5788 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005789 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005790 m_commandBuffer->EndRenderPass();
5791 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005792 // Destroy image invalidates the cmd buffer, causing error on submit
5793 vkDestroyImage(m_device->device(), image, NULL);
5794 // Attempt to submit cmd buffer
5795 submit_info = {};
5796 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5797 submit_info.commandBufferCount = 1;
5798 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5799 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5800 m_errorMonitor->VerifyFound();
5801 // Now update descriptor to be valid, but then free descriptor
5802 img_info.imageView = view2;
5803 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005804 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005805 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005806 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5807 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5808 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005809 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5810 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005811 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005812 m_commandBuffer->EndRenderPass();
5813 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07005814 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07005815
5816 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005818 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06005819 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07005820
5821 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07005822 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07005823 vkQueueWaitIdle(m_device->m_queue);
5824 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
5825
5826 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005827 submit_info = {};
5828 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5829 submit_info.commandBufferCount = 1;
5830 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07005831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005832 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5833 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07005834
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005835 // Cleanup
5836 vkFreeMemory(m_device->device(), image_memory, NULL);
5837 vkDestroySampler(m_device->device(), sampler2, NULL);
5838 vkDestroyImage(m_device->device(), image2, NULL);
5839 vkDestroyImageView(m_device->device(), view, NULL);
5840 vkDestroyImageView(m_device->device(), view2, NULL);
5841 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5842 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5843 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5844}
5845
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005846TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
5847 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
5848 ASSERT_NO_FATAL_FAILURE(InitState());
5849 ASSERT_NO_FATAL_FAILURE(InitViewport());
5850 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5851
5852 VkDescriptorPoolSize ds_type_count = {};
5853 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5854 ds_type_count.descriptorCount = 1;
5855
5856 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5857 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5858 ds_pool_ci.pNext = NULL;
5859 ds_pool_ci.maxSets = 1;
5860 ds_pool_ci.poolSizeCount = 1;
5861 ds_pool_ci.pPoolSizes = &ds_type_count;
5862
5863 VkDescriptorPool ds_pool;
5864 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5865 ASSERT_VK_SUCCESS(err);
5866
5867 VkDescriptorSetLayoutBinding dsl_binding = {};
5868 dsl_binding.binding = 0;
5869 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5870 dsl_binding.descriptorCount = 1;
5871 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5872 dsl_binding.pImmutableSamplers = NULL;
5873
5874 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5875 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5876 ds_layout_ci.pNext = NULL;
5877 ds_layout_ci.bindingCount = 1;
5878 ds_layout_ci.pBindings = &dsl_binding;
5879 VkDescriptorSetLayout ds_layout;
5880 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5881 ASSERT_VK_SUCCESS(err);
5882
5883 VkDescriptorSet descriptor_set;
5884 VkDescriptorSetAllocateInfo alloc_info = {};
5885 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5886 alloc_info.descriptorSetCount = 1;
5887 alloc_info.descriptorPool = ds_pool;
5888 alloc_info.pSetLayouts = &ds_layout;
5889 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
5890 ASSERT_VK_SUCCESS(err);
5891
5892 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5893 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5894 pipeline_layout_ci.pNext = NULL;
5895 pipeline_layout_ci.setLayoutCount = 1;
5896 pipeline_layout_ci.pSetLayouts = &ds_layout;
5897
5898 VkPipelineLayout pipeline_layout;
5899 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5900 ASSERT_VK_SUCCESS(err);
5901
5902 // Create image to update the descriptor with
5903 VkImageObj image(m_device);
5904 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5905 ASSERT_TRUE(image.initialized());
5906
5907 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5908 // Create Sampler
5909 VkSamplerCreateInfo sampler_ci = {};
5910 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5911 sampler_ci.pNext = NULL;
5912 sampler_ci.magFilter = VK_FILTER_NEAREST;
5913 sampler_ci.minFilter = VK_FILTER_NEAREST;
5914 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5915 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5916 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5917 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5918 sampler_ci.mipLodBias = 1.0;
5919 sampler_ci.anisotropyEnable = VK_FALSE;
5920 sampler_ci.maxAnisotropy = 1;
5921 sampler_ci.compareEnable = VK_FALSE;
5922 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5923 sampler_ci.minLod = 1.0;
5924 sampler_ci.maxLod = 1.0;
5925 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5926 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5927 VkSampler sampler;
5928 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5929 ASSERT_VK_SUCCESS(err);
5930 // Update descriptor with image and sampler
5931 VkDescriptorImageInfo img_info = {};
5932 img_info.sampler = sampler;
5933 img_info.imageView = view;
5934 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5935
5936 VkWriteDescriptorSet descriptor_write;
5937 memset(&descriptor_write, 0, sizeof(descriptor_write));
5938 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5939 descriptor_write.dstSet = descriptor_set;
5940 descriptor_write.dstBinding = 0;
5941 descriptor_write.descriptorCount = 1;
5942 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5943 descriptor_write.pImageInfo = &img_info;
5944
5945 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5946
5947 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005948 char const *vsSource =
5949 "#version 450\n"
5950 "\n"
5951 "out gl_PerVertex { \n"
5952 " vec4 gl_Position;\n"
5953 "};\n"
5954 "void main(){\n"
5955 " gl_Position = vec4(1);\n"
5956 "}\n";
5957 char const *fsSource =
5958 "#version 450\n"
5959 "\n"
5960 "layout(set=0, binding=0) uniform sampler2D s;\n"
5961 "layout(location=0) out vec4 x;\n"
5962 "void main(){\n"
5963 " x = texture(s, vec2(1));\n"
5964 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005965 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5966 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5967 VkPipelineObj pipe(m_device);
5968 pipe.AddShader(&vs);
5969 pipe.AddShader(&fs);
5970 pipe.AddColorAttachment();
5971 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5972
Tony Barbour552f6c02016-12-21 14:34:07 -07005973 m_commandBuffer->BeginCommandBuffer();
5974 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005975 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5976 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5977 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07005978
5979 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5980 VkRect2D scissor = {{0, 0}, {16, 16}};
5981 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5982 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
5983
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005984 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005985 m_commandBuffer->EndRenderPass();
5986 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005987 // Submit cmd buffer to put pool in-flight
5988 VkSubmitInfo submit_info = {};
5989 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5990 submit_info.commandBufferCount = 1;
5991 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5992 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5993 // Destroy pool while in-flight, causing error
5994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
5995 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5996 m_errorMonitor->VerifyFound();
5997 vkQueueWaitIdle(m_device->m_queue);
5998 // Cleanup
5999 vkDestroySampler(m_device->device(), sampler, NULL);
6000 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6001 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6002 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006003 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006004}
6005
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006006TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6007 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
6008 ASSERT_NO_FATAL_FAILURE(InitState());
6009 ASSERT_NO_FATAL_FAILURE(InitViewport());
6010 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6011
6012 VkDescriptorPoolSize ds_type_count = {};
6013 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6014 ds_type_count.descriptorCount = 1;
6015
6016 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6017 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6018 ds_pool_ci.pNext = NULL;
6019 ds_pool_ci.maxSets = 1;
6020 ds_pool_ci.poolSizeCount = 1;
6021 ds_pool_ci.pPoolSizes = &ds_type_count;
6022
6023 VkDescriptorPool ds_pool;
6024 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6025 ASSERT_VK_SUCCESS(err);
6026
6027 VkDescriptorSetLayoutBinding dsl_binding = {};
6028 dsl_binding.binding = 0;
6029 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6030 dsl_binding.descriptorCount = 1;
6031 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6032 dsl_binding.pImmutableSamplers = NULL;
6033
6034 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6035 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6036 ds_layout_ci.pNext = NULL;
6037 ds_layout_ci.bindingCount = 1;
6038 ds_layout_ci.pBindings = &dsl_binding;
6039 VkDescriptorSetLayout ds_layout;
6040 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6041 ASSERT_VK_SUCCESS(err);
6042
6043 VkDescriptorSet descriptorSet;
6044 VkDescriptorSetAllocateInfo alloc_info = {};
6045 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6046 alloc_info.descriptorSetCount = 1;
6047 alloc_info.descriptorPool = ds_pool;
6048 alloc_info.pSetLayouts = &ds_layout;
6049 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6050 ASSERT_VK_SUCCESS(err);
6051
6052 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6053 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6054 pipeline_layout_ci.pNext = NULL;
6055 pipeline_layout_ci.setLayoutCount = 1;
6056 pipeline_layout_ci.pSetLayouts = &ds_layout;
6057
6058 VkPipelineLayout pipeline_layout;
6059 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6060 ASSERT_VK_SUCCESS(err);
6061
6062 // Create images to update the descriptor with
6063 VkImage image;
6064 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6065 const int32_t tex_width = 32;
6066 const int32_t tex_height = 32;
6067 VkImageCreateInfo image_create_info = {};
6068 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6069 image_create_info.pNext = NULL;
6070 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6071 image_create_info.format = tex_format;
6072 image_create_info.extent.width = tex_width;
6073 image_create_info.extent.height = tex_height;
6074 image_create_info.extent.depth = 1;
6075 image_create_info.mipLevels = 1;
6076 image_create_info.arrayLayers = 1;
6077 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6078 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6079 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6080 image_create_info.flags = 0;
6081 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6082 ASSERT_VK_SUCCESS(err);
6083 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6084 VkMemoryRequirements memory_reqs;
6085 VkDeviceMemory image_memory;
6086 bool pass;
6087 VkMemoryAllocateInfo memory_info = {};
6088 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6089 memory_info.pNext = NULL;
6090 memory_info.allocationSize = 0;
6091 memory_info.memoryTypeIndex = 0;
6092 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6093 // Allocate enough memory for image
6094 memory_info.allocationSize = memory_reqs.size;
6095 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6096 ASSERT_TRUE(pass);
6097 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6098 ASSERT_VK_SUCCESS(err);
6099 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6100 ASSERT_VK_SUCCESS(err);
6101
6102 VkImageViewCreateInfo image_view_create_info = {};
6103 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6104 image_view_create_info.image = image;
6105 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6106 image_view_create_info.format = tex_format;
6107 image_view_create_info.subresourceRange.layerCount = 1;
6108 image_view_create_info.subresourceRange.baseMipLevel = 0;
6109 image_view_create_info.subresourceRange.levelCount = 1;
6110 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6111
6112 VkImageView view;
6113 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6114 ASSERT_VK_SUCCESS(err);
6115 // Create Samplers
6116 VkSamplerCreateInfo sampler_ci = {};
6117 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6118 sampler_ci.pNext = NULL;
6119 sampler_ci.magFilter = VK_FILTER_NEAREST;
6120 sampler_ci.minFilter = VK_FILTER_NEAREST;
6121 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6122 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6123 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6124 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6125 sampler_ci.mipLodBias = 1.0;
6126 sampler_ci.anisotropyEnable = VK_FALSE;
6127 sampler_ci.maxAnisotropy = 1;
6128 sampler_ci.compareEnable = VK_FALSE;
6129 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6130 sampler_ci.minLod = 1.0;
6131 sampler_ci.maxLod = 1.0;
6132 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6133 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6134 VkSampler sampler;
6135 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6136 ASSERT_VK_SUCCESS(err);
6137 // Update descriptor with image and sampler
6138 VkDescriptorImageInfo img_info = {};
6139 img_info.sampler = sampler;
6140 img_info.imageView = view;
6141 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6142
6143 VkWriteDescriptorSet descriptor_write;
6144 memset(&descriptor_write, 0, sizeof(descriptor_write));
6145 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6146 descriptor_write.dstSet = descriptorSet;
6147 descriptor_write.dstBinding = 0;
6148 descriptor_write.descriptorCount = 1;
6149 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6150 descriptor_write.pImageInfo = &img_info;
6151 // Break memory binding and attempt update
6152 vkFreeMemory(m_device->device(), image_memory, nullptr);
6153 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006154 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6156 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6157 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6158 m_errorMonitor->VerifyFound();
6159 // Cleanup
6160 vkDestroyImage(m_device->device(), image, NULL);
6161 vkDestroySampler(m_device->device(), sampler, NULL);
6162 vkDestroyImageView(m_device->device(), view, NULL);
6163 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6164 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6165 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6166}
6167
Karl Schultz6addd812016-02-02 17:17:23 -07006168TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006169 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6170 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006171 // Create a valid cmd buffer
6172 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006173 uint64_t fake_pipeline_handle = 0xbaad6001;
6174 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006175 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006176 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6177
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006179 m_commandBuffer->BeginCommandBuffer();
6180 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006181 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006182 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006183
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006184 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006185 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 -06006186 Draw(1, 0, 0, 0);
6187 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006188
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006189 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006191 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006192 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6193 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006194}
6195
Karl Schultz6addd812016-02-02 17:17:23 -07006196TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006197 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006198 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006199
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006201
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006202 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006203 ASSERT_NO_FATAL_FAILURE(InitViewport());
6204 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006205 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006206 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6207 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006208
6209 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006210 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6211 ds_pool_ci.pNext = NULL;
6212 ds_pool_ci.maxSets = 1;
6213 ds_pool_ci.poolSizeCount = 1;
6214 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006215
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006216 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006217 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006218 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006219
Tony Barboureb254902015-07-15 12:50:33 -06006220 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006221 dsl_binding.binding = 0;
6222 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6223 dsl_binding.descriptorCount = 1;
6224 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6225 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006226
Tony Barboureb254902015-07-15 12:50:33 -06006227 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006228 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6229 ds_layout_ci.pNext = NULL;
6230 ds_layout_ci.bindingCount = 1;
6231 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006232 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006233 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006234 ASSERT_VK_SUCCESS(err);
6235
6236 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006237 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006238 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006239 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006240 alloc_info.descriptorPool = ds_pool;
6241 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006242 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006243 ASSERT_VK_SUCCESS(err);
6244
Tony Barboureb254902015-07-15 12:50:33 -06006245 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006246 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6247 pipeline_layout_ci.pNext = NULL;
6248 pipeline_layout_ci.setLayoutCount = 1;
6249 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006250
6251 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006252 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006253 ASSERT_VK_SUCCESS(err);
6254
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006255 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006256 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006257 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006258 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006259
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006260 VkPipelineObj pipe(m_device);
6261 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006262 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006263 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006264 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006265
Tony Barbour552f6c02016-12-21 14:34:07 -07006266 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006267 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6268 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6269 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006270
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006271 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006272
Chia-I Wuf7458c52015-10-26 21:10:41 +08006273 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6274 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6275 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006276}
6277
Karl Schultz6addd812016-02-02 17:17:23 -07006278TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006279 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006280 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006281
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006283
6284 ASSERT_NO_FATAL_FAILURE(InitState());
6285 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006286 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6287 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006288
6289 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006290 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6291 ds_pool_ci.pNext = NULL;
6292 ds_pool_ci.maxSets = 1;
6293 ds_pool_ci.poolSizeCount = 1;
6294 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006295
6296 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006297 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006298 ASSERT_VK_SUCCESS(err);
6299
6300 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006301 dsl_binding.binding = 0;
6302 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6303 dsl_binding.descriptorCount = 1;
6304 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6305 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006306
6307 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006308 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6309 ds_layout_ci.pNext = NULL;
6310 ds_layout_ci.bindingCount = 1;
6311 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006312 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006313 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006314 ASSERT_VK_SUCCESS(err);
6315
6316 VkDescriptorSet descriptorSet;
6317 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006318 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006319 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006320 alloc_info.descriptorPool = ds_pool;
6321 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006322 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006323 ASSERT_VK_SUCCESS(err);
6324
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006325 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006326 VkWriteDescriptorSet descriptor_write;
6327 memset(&descriptor_write, 0, sizeof(descriptor_write));
6328 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6329 descriptor_write.dstSet = descriptorSet;
6330 descriptor_write.dstBinding = 0;
6331 descriptor_write.descriptorCount = 1;
6332 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6333 descriptor_write.pTexelBufferView = &view;
6334
6335 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6336
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006337 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006338
6339 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6340 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6341}
6342
Mark Youngd339ba32016-05-30 13:28:35 -06006343TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006344 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 -06006345
6346 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006348 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006349
6350 ASSERT_NO_FATAL_FAILURE(InitState());
6351
6352 // Create a buffer with no bound memory and then attempt to create
6353 // a buffer view.
6354 VkBufferCreateInfo buff_ci = {};
6355 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006356 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006357 buff_ci.size = 256;
6358 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6359 VkBuffer buffer;
6360 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6361 ASSERT_VK_SUCCESS(err);
6362
6363 VkBufferViewCreateInfo buff_view_ci = {};
6364 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6365 buff_view_ci.buffer = buffer;
6366 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6367 buff_view_ci.range = VK_WHOLE_SIZE;
6368 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006369 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006370
6371 m_errorMonitor->VerifyFound();
6372 vkDestroyBuffer(m_device->device(), buffer, NULL);
6373 // If last error is success, it still created the view, so delete it.
6374 if (err == VK_SUCCESS) {
6375 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6376 }
6377}
6378
Karl Schultz6addd812016-02-02 17:17:23 -07006379TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6380 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6381 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006382 // 1. No dynamicOffset supplied
6383 // 2. Too many dynamicOffsets supplied
6384 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006385 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6387 " requires 1 dynamicOffsets, but only "
6388 "0 dynamicOffsets are left in "
6389 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006390
6391 ASSERT_NO_FATAL_FAILURE(InitState());
6392 ASSERT_NO_FATAL_FAILURE(InitViewport());
6393 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6394
6395 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006396 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6397 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006398
6399 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006400 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6401 ds_pool_ci.pNext = NULL;
6402 ds_pool_ci.maxSets = 1;
6403 ds_pool_ci.poolSizeCount = 1;
6404 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006405
6406 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006407 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006408 ASSERT_VK_SUCCESS(err);
6409
6410 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006411 dsl_binding.binding = 0;
6412 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6413 dsl_binding.descriptorCount = 1;
6414 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6415 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006416
6417 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006418 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6419 ds_layout_ci.pNext = NULL;
6420 ds_layout_ci.bindingCount = 1;
6421 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006422 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006423 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006424 ASSERT_VK_SUCCESS(err);
6425
6426 VkDescriptorSet descriptorSet;
6427 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006428 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006429 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006430 alloc_info.descriptorPool = ds_pool;
6431 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006432 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006433 ASSERT_VK_SUCCESS(err);
6434
6435 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006436 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6437 pipeline_layout_ci.pNext = NULL;
6438 pipeline_layout_ci.setLayoutCount = 1;
6439 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006440
6441 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006442 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006443 ASSERT_VK_SUCCESS(err);
6444
6445 // Create a buffer to update the descriptor with
6446 uint32_t qfi = 0;
6447 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006448 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6449 buffCI.size = 1024;
6450 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6451 buffCI.queueFamilyIndexCount = 1;
6452 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006453
6454 VkBuffer dyub;
6455 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6456 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006457 // Allocate memory and bind to buffer so we can make it to the appropriate
6458 // error
6459 VkMemoryAllocateInfo mem_alloc = {};
6460 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6461 mem_alloc.pNext = NULL;
6462 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006463 mem_alloc.memoryTypeIndex = 0;
6464
6465 VkMemoryRequirements memReqs;
6466 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006467 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006468 if (!pass) {
6469 vkDestroyBuffer(m_device->device(), dyub, NULL);
6470 return;
6471 }
6472
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006473 VkDeviceMemory mem;
6474 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6475 ASSERT_VK_SUCCESS(err);
6476 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6477 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006478 // Correctly update descriptor to avoid "NOT_UPDATED" error
6479 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006480 buffInfo.buffer = dyub;
6481 buffInfo.offset = 0;
6482 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006483
6484 VkWriteDescriptorSet descriptor_write;
6485 memset(&descriptor_write, 0, sizeof(descriptor_write));
6486 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6487 descriptor_write.dstSet = descriptorSet;
6488 descriptor_write.dstBinding = 0;
6489 descriptor_write.descriptorCount = 1;
6490 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6491 descriptor_write.pBufferInfo = &buffInfo;
6492
6493 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6494
Tony Barbour552f6c02016-12-21 14:34:07 -07006495 m_commandBuffer->BeginCommandBuffer();
6496 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006497 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6498 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006499 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006500 uint32_t pDynOff[2] = {512, 756};
6501 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6503 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6504 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6505 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006506 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006507 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006508 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6509 " dynamic offset 512 combined with "
6510 "offset 0 and range 1024 that "
6511 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006512 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006513 char const *vsSource =
6514 "#version 450\n"
6515 "\n"
6516 "out gl_PerVertex { \n"
6517 " vec4 gl_Position;\n"
6518 "};\n"
6519 "void main(){\n"
6520 " gl_Position = vec4(1);\n"
6521 "}\n";
6522 char const *fsSource =
6523 "#version 450\n"
6524 "\n"
6525 "layout(location=0) out vec4 x;\n"
6526 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6527 "void main(){\n"
6528 " x = vec4(bar.y);\n"
6529 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006530 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6531 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6532 VkPipelineObj pipe(m_device);
6533 pipe.AddShader(&vs);
6534 pipe.AddShader(&fs);
6535 pipe.AddColorAttachment();
6536 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6537
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006538 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6539 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6540 VkRect2D scissor = {{0, 0}, {16, 16}};
6541 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6542
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006543 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006544 // This update should succeed, but offset size of 512 will overstep buffer
6545 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006546 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6547 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006548 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006549 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006550
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006551 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006552 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006553
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006554 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006555 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006556 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6557}
6558
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006559TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006560 TEST_DESCRIPTION(
6561 "Attempt to update a descriptor with a non-sparse buffer "
6562 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006563 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006565 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6567 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006568
6569 ASSERT_NO_FATAL_FAILURE(InitState());
6570 ASSERT_NO_FATAL_FAILURE(InitViewport());
6571 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6572
6573 VkDescriptorPoolSize ds_type_count = {};
6574 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6575 ds_type_count.descriptorCount = 1;
6576
6577 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6578 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6579 ds_pool_ci.pNext = NULL;
6580 ds_pool_ci.maxSets = 1;
6581 ds_pool_ci.poolSizeCount = 1;
6582 ds_pool_ci.pPoolSizes = &ds_type_count;
6583
6584 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006585 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006586 ASSERT_VK_SUCCESS(err);
6587
6588 VkDescriptorSetLayoutBinding dsl_binding = {};
6589 dsl_binding.binding = 0;
6590 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6591 dsl_binding.descriptorCount = 1;
6592 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6593 dsl_binding.pImmutableSamplers = NULL;
6594
6595 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6596 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6597 ds_layout_ci.pNext = NULL;
6598 ds_layout_ci.bindingCount = 1;
6599 ds_layout_ci.pBindings = &dsl_binding;
6600 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006601 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006602 ASSERT_VK_SUCCESS(err);
6603
6604 VkDescriptorSet descriptorSet;
6605 VkDescriptorSetAllocateInfo alloc_info = {};
6606 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6607 alloc_info.descriptorSetCount = 1;
6608 alloc_info.descriptorPool = ds_pool;
6609 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006610 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006611 ASSERT_VK_SUCCESS(err);
6612
6613 // Create a buffer to update the descriptor with
6614 uint32_t qfi = 0;
6615 VkBufferCreateInfo buffCI = {};
6616 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6617 buffCI.size = 1024;
6618 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6619 buffCI.queueFamilyIndexCount = 1;
6620 buffCI.pQueueFamilyIndices = &qfi;
6621
6622 VkBuffer dyub;
6623 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6624 ASSERT_VK_SUCCESS(err);
6625
6626 // Attempt to update descriptor without binding memory to it
6627 VkDescriptorBufferInfo buffInfo = {};
6628 buffInfo.buffer = dyub;
6629 buffInfo.offset = 0;
6630 buffInfo.range = 1024;
6631
6632 VkWriteDescriptorSet descriptor_write;
6633 memset(&descriptor_write, 0, sizeof(descriptor_write));
6634 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6635 descriptor_write.dstSet = descriptorSet;
6636 descriptor_write.dstBinding = 0;
6637 descriptor_write.descriptorCount = 1;
6638 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6639 descriptor_write.pBufferInfo = &buffInfo;
6640
6641 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6642 m_errorMonitor->VerifyFound();
6643
6644 vkDestroyBuffer(m_device->device(), dyub, NULL);
6645 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6646 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6647}
6648
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006649TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006650 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006651 ASSERT_NO_FATAL_FAILURE(InitState());
6652 ASSERT_NO_FATAL_FAILURE(InitViewport());
6653 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6654
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006655 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006656 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006657 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6658 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6659 pipeline_layout_ci.pushConstantRangeCount = 1;
6660 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6661
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006662 //
6663 // Check for invalid push constant ranges in pipeline layouts.
6664 //
6665 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006666 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006667 char const *msg;
6668 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006669
Karl Schultzc81037d2016-05-12 08:11:23 -06006670 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6671 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6672 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6673 "vkCreatePipelineLayout() call has push constants index 0 with "
6674 "size 0."},
6675 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6676 "vkCreatePipelineLayout() call has push constants index 0 with "
6677 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006678 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006679 "vkCreatePipelineLayout() call has push constants index 0 with "
6680 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006681 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006682 "vkCreatePipelineLayout() call has push constants index 0 with "
6683 "size 0."},
6684 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6685 "vkCreatePipelineLayout() call has push constants index 0 with "
6686 "offset 1. Offset must"},
6687 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6688 "vkCreatePipelineLayout() call has push constants index 0 "
6689 "with offset "},
6690 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6691 "vkCreatePipelineLayout() call has push constants "
6692 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006693 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006694 "vkCreatePipelineLayout() call has push constants index 0 "
6695 "with offset "},
6696 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6697 "vkCreatePipelineLayout() call has push "
6698 "constants index 0 with offset "},
6699 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6700 "vkCreatePipelineLayout() call has push "
6701 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006702 }};
6703
6704 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006705 for (const auto &iter : range_tests) {
6706 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6708 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006709 m_errorMonitor->VerifyFound();
6710 if (VK_SUCCESS == err) {
6711 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6712 }
6713 }
6714
6715 // Check for invalid stage flag
6716 pc_range.offset = 0;
6717 pc_range.size = 16;
6718 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006719 m_errorMonitor->SetDesiredFailureMsg(
6720 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6721 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006722 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006723 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006724 if (VK_SUCCESS == err) {
6725 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6726 }
6727
6728 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06006729 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006730 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006731 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006732 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006733 };
6734
Karl Schultzc81037d2016-05-12 08:11:23 -06006735 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006736 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6737 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6738 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6739 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6740 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006741 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 1:[0, 4)",
6742 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 2:[0, 4)",
6743 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 3:[0, 4)",
6744 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 4:[0, 4)",
6745 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[0, 4), 2:[0, 4)",
6746 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[0, 4), 3:[0, 4)",
6747 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[0, 4), 4:[0, 4)",
6748 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[0, 4), 3:[0, 4)",
6749 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[0, 4), 4:[0, 4)",
6750 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 3:[0, 4), 4:[0, 4)"}},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006751 {
6752 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6753 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6754 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6755 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6756 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006757 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 3:[12, 20), 4:[16, 20)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006758 },
6759 {
6760 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6761 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6762 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6763 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6764 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006765 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 1:[12, 20)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006766 },
6767 {
6768 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6769 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6770 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6771 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6772 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006773 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 3:[12, 20)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006774 },
6775 {
6776 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6777 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
6778 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
6779 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
6780 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006781 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 2:[4, 100)",
6782 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[32, 36), 2:[4, 100)",
6783 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[4, 100), 3:[40, 48)",
6784 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[4, 100), 4:[52, 56)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006785 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006786
Karl Schultzc81037d2016-05-12 08:11:23 -06006787 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006788 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006789 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006791 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006792 m_errorMonitor->VerifyFound();
6793 if (VK_SUCCESS == err) {
6794 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6795 }
6796 }
6797
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006798 //
6799 // CmdPushConstants tests
6800 //
Karl Schultzc81037d2016-05-12 08:11:23 -06006801 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006802
6803 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006804 const std::array<PipelineLayoutTestCase, 11> cmd_range_tests = {{
6805 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "vkCmdPushConstants: parameter size must be greater than 0"},
Karl Schultzc81037d2016-05-12 08:11:23 -06006806 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
Dave Houlton197211a2016-12-23 15:26:29 -07006807 "vkCmdPushConstants() call has push constants index 0 with size 1. "
6808 "Size must be a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006809 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Dave Houlton197211a2016-12-23 15:26:29 -07006810 "vkCmdPushConstants() call has push constants index 0 with size 1. "
6811 "Size must be a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006812 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006813 "vkCmdPushConstants() call has push constants with offset 1. "
6814 "Offset must be a multiple of 4."},
6815 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6816 "vkCmdPushConstants() call has push constants with offset 1. "
6817 "Offset must be a multiple of 4."},
6818 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6819 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6820 "0x1 not within flag-matching ranges in pipeline layout"},
6821 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
6822 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
6823 "0x1 not within flag-matching ranges in pipeline layout"},
6824 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
6825 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
6826 "0x1 not within flag-matching ranges in pipeline layout"},
6827 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
6828 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
6829 "0x1 not within flag-matching ranges in pipeline layout"},
6830 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6831 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
6832 "any of the ranges in pipeline layout"},
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006833 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06006834 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
6835 "any of the ranges in pipeline layout"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006836 }};
6837
Tony Barbour552f6c02016-12-21 14:34:07 -07006838 m_commandBuffer->BeginCommandBuffer();
6839 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006840
6841 // Setup ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006842 const VkPushConstantRange pc_range2[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006843 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006844 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006845 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006846 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006847 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006848 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006849 for (const auto &iter : cmd_range_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6851 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006852 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006853 m_errorMonitor->VerifyFound();
6854 }
6855
6856 // Check for invalid stage flag
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006858 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006859 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06006860 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006861
Karl Schultzc81037d2016-05-12 08:11:23 -06006862 // overlapping range tests with cmd
6863 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
6864 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6865 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6866 "0x1 not within flag-matching ranges in pipeline layout"},
6867 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6868 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
6869 "0x1 not within flag-matching ranges in pipeline layout"},
6870 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
6871 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
6872 "0x1 not within flag-matching ranges in pipeline layout"},
6873 }};
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006874 // Setup ranges: [0,16), [20,36), [36,44), [44,52), [80,92)
Karl Schultzc81037d2016-05-12 08:11:23 -06006875 const VkPushConstantRange pc_range3[] = {
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006876 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
6877 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12}, {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
Karl Schultzc81037d2016-05-12 08:11:23 -06006878 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006879 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range3) / sizeof(VkPushConstantRange);
Karl Schultzc81037d2016-05-12 08:11:23 -06006880 pipeline_layout_ci.pPushConstantRanges = pc_range3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006881 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzc81037d2016-05-12 08:11:23 -06006882 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006883 for (const auto &iter : cmd_overlap_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6885 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006886 iter.range.size, dummy_values);
6887 m_errorMonitor->VerifyFound();
6888 }
Karl Schultzc81037d2016-05-12 08:11:23 -06006889 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6890
Tony Barbour552f6c02016-12-21 14:34:07 -07006891 m_commandBuffer->EndRenderPass();
6892 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006893}
6894
Karl Schultz6addd812016-02-02 17:17:23 -07006895TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07006896 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07006897 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006898
6899 ASSERT_NO_FATAL_FAILURE(InitState());
6900 ASSERT_NO_FATAL_FAILURE(InitViewport());
6901 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6902
6903 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
6904 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006905 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6906 ds_type_count[0].descriptorCount = 10;
6907 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6908 ds_type_count[1].descriptorCount = 2;
6909 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6910 ds_type_count[2].descriptorCount = 2;
6911 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6912 ds_type_count[3].descriptorCount = 5;
6913 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
6914 // type
6915 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6916 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
6917 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006918
6919 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006920 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6921 ds_pool_ci.pNext = NULL;
6922 ds_pool_ci.maxSets = 5;
6923 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
6924 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006925
6926 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006927 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006928 ASSERT_VK_SUCCESS(err);
6929
6930 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
6931 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006932 dsl_binding[0].binding = 0;
6933 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6934 dsl_binding[0].descriptorCount = 5;
6935 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6936 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006937
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006938 // Create layout identical to set0 layout but w/ different stageFlags
6939 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006940 dsl_fs_stage_only.binding = 0;
6941 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6942 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006943 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
6944 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07006945 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006946 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006947 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6948 ds_layout_ci.pNext = NULL;
6949 ds_layout_ci.bindingCount = 1;
6950 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006951 static const uint32_t NUM_LAYOUTS = 4;
6952 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006953 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006954 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
6955 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006956 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006957 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006958 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006959 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006960 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006961 dsl_binding[0].binding = 0;
6962 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006963 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006964 dsl_binding[1].binding = 1;
6965 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6966 dsl_binding[1].descriptorCount = 2;
6967 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6968 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006969 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006970 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006971 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006972 ASSERT_VK_SUCCESS(err);
6973 dsl_binding[0].binding = 0;
6974 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006975 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006976 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006977 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006978 ASSERT_VK_SUCCESS(err);
6979 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006980 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006981 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006982 ASSERT_VK_SUCCESS(err);
6983
6984 static const uint32_t NUM_SETS = 4;
6985 VkDescriptorSet descriptorSet[NUM_SETS] = {};
6986 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006987 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006988 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006989 alloc_info.descriptorPool = ds_pool;
6990 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006991 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006992 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006993 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006994 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006995 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006996 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006997 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006998
6999 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007000 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7001 pipeline_layout_ci.pNext = NULL;
7002 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7003 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007004
7005 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007006 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007007 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007008 // Create pipelineLayout with only one setLayout
7009 pipeline_layout_ci.setLayoutCount = 1;
7010 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007011 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007012 ASSERT_VK_SUCCESS(err);
7013 // Create pipelineLayout with 2 descriptor setLayout at index 0
7014 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7015 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007016 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007017 ASSERT_VK_SUCCESS(err);
7018 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7019 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7020 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007021 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007022 ASSERT_VK_SUCCESS(err);
7023 // Create pipelineLayout with UB type, but stageFlags for FS only
7024 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7025 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007026 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007027 ASSERT_VK_SUCCESS(err);
7028 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7029 VkDescriptorSetLayout pl_bad_s0[2] = {};
7030 pl_bad_s0[0] = ds_layout_fs_only;
7031 pl_bad_s0[1] = ds_layout[1];
7032 pipeline_layout_ci.setLayoutCount = 2;
7033 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7034 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007035 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007036 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007037
Tobin Ehlis88452832015-12-03 09:40:56 -07007038 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007039 char const *vsSource =
7040 "#version 450\n"
7041 "\n"
7042 "out gl_PerVertex {\n"
7043 " vec4 gl_Position;\n"
7044 "};\n"
7045 "void main(){\n"
7046 " gl_Position = vec4(1);\n"
7047 "}\n";
7048 char const *fsSource =
7049 "#version 450\n"
7050 "\n"
7051 "layout(location=0) out vec4 x;\n"
7052 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7053 "void main(){\n"
7054 " x = vec4(bar.y);\n"
7055 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007056 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7057 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007058 VkPipelineObj pipe(m_device);
7059 pipe.AddShader(&vs);
7060 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007061 pipe.AddColorAttachment();
7062 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007063
Tony Barbour552f6c02016-12-21 14:34:07 -07007064 m_commandBuffer->BeginCommandBuffer();
7065 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007066
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007067 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007068 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7069 // of PSO
7070 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7071 // cmd_pipeline.c
7072 // due to the fact that cmd_alloc_dset_data() has not been called in
7073 // cmd_bind_graphics_pipeline()
7074 // TODO : Want to cause various binding incompatibility issues here to test
7075 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007076 // First cause various verify_layout_compatibility() fails
7077 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007078 // verify_set_layout_compatibility fail cases:
7079 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007081 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7082 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007083 m_errorMonitor->VerifyFound();
7084
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007085 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7087 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7088 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007089 m_errorMonitor->VerifyFound();
7090
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007091 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007092 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7093 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7095 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7096 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007097 m_errorMonitor->VerifyFound();
7098
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007099 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7100 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7102 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7103 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007104 m_errorMonitor->VerifyFound();
7105
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007106 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7107 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7109 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7110 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7111 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007112 m_errorMonitor->VerifyFound();
7113
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007114 // Cause INFO messages due to disturbing previously bound Sets
7115 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007116 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7117 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007118 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7120 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7121 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007122 m_errorMonitor->VerifyFound();
7123
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007124 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7125 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007126 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7128 " newly bound as set #0 so set #1 and "
7129 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007130 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7131 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007132 m_errorMonitor->VerifyFound();
7133
Tobin Ehlis10fad692016-07-07 12:00:36 -06007134 // Now that we're done actively using the pipelineLayout that gfx pipeline
7135 // was created with, we should be able to delete it. Do that now to verify
7136 // that validation obeys pipelineLayout lifetime
7137 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7138
Tobin Ehlis88452832015-12-03 09:40:56 -07007139 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007140 // 1. Error due to not binding required set (we actually use same code as
7141 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007142 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7143 &descriptorSet[0], 0, NULL);
7144 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7145 &descriptorSet[1], 0, NULL);
7146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007147
7148 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7149 VkRect2D scissor = {{0, 0}, {16, 16}};
7150 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7151 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7152
Tobin Ehlis88452832015-12-03 09:40:56 -07007153 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007154 m_errorMonitor->VerifyFound();
7155
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007156 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007157 // 2. Error due to bound set not being compatible with PSO's
7158 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007159 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7160 &descriptorSet[0], 0, NULL);
7161 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007162 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007163 m_errorMonitor->VerifyFound();
7164
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007165 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007166 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007167 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7168 }
7169 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007170 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7171 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7172}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007173
Karl Schultz6addd812016-02-02 17:17:23 -07007174TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7176 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007177
7178 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007179 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007180 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007181 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007182
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007183 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007184}
7185
Karl Schultz6addd812016-02-02 17:17:23 -07007186TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7187 VkResult err;
7188 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007189
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007191
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007192 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007193
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007194 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007195 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007196 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007197 cmd.commandPool = m_commandPool;
7198 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007199 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007200
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007201 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007202 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007203
7204 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007205 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007206 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7207
7208 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007209 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007210 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007211 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 -07007212 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007213
7214 // The error should be caught by validation of the BeginCommandBuffer call
7215 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7216
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007217 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007218 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007219}
7220
Karl Schultz6addd812016-02-02 17:17:23 -07007221TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007222 // Cause error due to Begin while recording CB
7223 // Then cause 2 errors for attempting to reset CB w/o having
7224 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7225 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007227
7228 ASSERT_NO_FATAL_FAILURE(InitState());
7229
7230 // Calls AllocateCommandBuffers
7231 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7232
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007233 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007234 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007235 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7236 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007237 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7238 cmd_buf_info.pNext = NULL;
7239 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007240 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007241
7242 // Begin CB to transition to recording state
7243 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7244 // Can't re-begin. This should trigger error
7245 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007246 m_errorMonitor->VerifyFound();
7247
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007249 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007250 // Reset attempt will trigger error due to incorrect CommandPool state
7251 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007252 m_errorMonitor->VerifyFound();
7253
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007255 // Transition CB to RECORDED state
7256 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7257 // Now attempting to Begin will implicitly reset, which triggers error
7258 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007259 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007260}
7261
Karl Schultz6addd812016-02-02 17:17:23 -07007262TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007263 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007264 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007265
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7267 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007268
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007269 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007270 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007271
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007272 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007273 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7274 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007275
7276 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007277 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7278 ds_pool_ci.pNext = NULL;
7279 ds_pool_ci.maxSets = 1;
7280 ds_pool_ci.poolSizeCount = 1;
7281 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007282
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007283 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007284 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007285 ASSERT_VK_SUCCESS(err);
7286
Tony Barboureb254902015-07-15 12:50:33 -06007287 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007288 dsl_binding.binding = 0;
7289 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7290 dsl_binding.descriptorCount = 1;
7291 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7292 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007293
Tony Barboureb254902015-07-15 12:50:33 -06007294 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007295 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7296 ds_layout_ci.pNext = NULL;
7297 ds_layout_ci.bindingCount = 1;
7298 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007299
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007300 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007301 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007302 ASSERT_VK_SUCCESS(err);
7303
7304 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007305 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007306 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007307 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007308 alloc_info.descriptorPool = ds_pool;
7309 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007310 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007311 ASSERT_VK_SUCCESS(err);
7312
Tony Barboureb254902015-07-15 12:50:33 -06007313 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007314 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7315 pipeline_layout_ci.setLayoutCount = 1;
7316 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007317
7318 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007319 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007320 ASSERT_VK_SUCCESS(err);
7321
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007322 VkViewport vp = {}; // Just need dummy vp to point to
7323 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007324
7325 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007326 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7327 vp_state_ci.scissorCount = 1;
7328 vp_state_ci.pScissors = &sc;
7329 vp_state_ci.viewportCount = 1;
7330 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007331
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007332 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7333 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7334 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7335 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7336 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7337 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007338 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007339 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007340 rs_state_ci.lineWidth = 1.0f;
7341
7342 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7343 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7344 vi_ci.pNext = nullptr;
7345 vi_ci.vertexBindingDescriptionCount = 0;
7346 vi_ci.pVertexBindingDescriptions = nullptr;
7347 vi_ci.vertexAttributeDescriptionCount = 0;
7348 vi_ci.pVertexAttributeDescriptions = nullptr;
7349
7350 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7351 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7352 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7353
7354 VkPipelineShaderStageCreateInfo shaderStages[2];
7355 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7356
7357 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7358 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7359 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
7360 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007361
Tony Barboureb254902015-07-15 12:50:33 -06007362 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007363 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7364 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007365 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007366 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7367 gp_ci.layout = pipeline_layout;
7368 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007369 gp_ci.pVertexInputState = &vi_ci;
7370 gp_ci.pInputAssemblyState = &ia_ci;
7371
7372 gp_ci.stageCount = 1;
7373 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007374
7375 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007376 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7377 pc_ci.initialDataSize = 0;
7378 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007379
7380 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007381 VkPipelineCache pipelineCache;
7382
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007383 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007384 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007385 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007386 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007387
Chia-I Wuf7458c52015-10-26 21:10:41 +08007388 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7389 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7390 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7391 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007392}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007393
Tobin Ehlis912df022015-09-17 08:46:18 -06007394/*// TODO : This test should be good, but needs Tess support in compiler to run
7395TEST_F(VkLayerTest, InvalidPatchControlPoints)
7396{
7397 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007398 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007399
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007401 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7402primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007403
Tobin Ehlis912df022015-09-17 08:46:18 -06007404 ASSERT_NO_FATAL_FAILURE(InitState());
7405 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007406
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007407 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007408 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007409 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007410
7411 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7412 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7413 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007414 ds_pool_ci.poolSizeCount = 1;
7415 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007416
7417 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007418 err = vkCreateDescriptorPool(m_device->device(),
7419VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007420 ASSERT_VK_SUCCESS(err);
7421
7422 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007423 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007424 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007425 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007426 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7427 dsl_binding.pImmutableSamplers = NULL;
7428
7429 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007430 ds_layout_ci.sType =
7431VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007432 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007433 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007434 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007435
7436 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007437 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7438&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007439 ASSERT_VK_SUCCESS(err);
7440
7441 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007442 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7443VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007444 ASSERT_VK_SUCCESS(err);
7445
7446 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007447 pipeline_layout_ci.sType =
7448VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007449 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007450 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007451 pipeline_layout_ci.pSetLayouts = &ds_layout;
7452
7453 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007454 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7455&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007456 ASSERT_VK_SUCCESS(err);
7457
7458 VkPipelineShaderStageCreateInfo shaderStages[3];
7459 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7460
Karl Schultz6addd812016-02-02 17:17:23 -07007461 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7462this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007463 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007464 VkShaderObj
7465tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7466this);
7467 VkShaderObj
7468te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7469this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007470
Karl Schultz6addd812016-02-02 17:17:23 -07007471 shaderStages[0].sType =
7472VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007473 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007474 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007475 shaderStages[1].sType =
7476VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007477 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007478 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007479 shaderStages[2].sType =
7480VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007481 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007482 shaderStages[2].shader = te.handle();
7483
7484 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007485 iaCI.sType =
7486VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007487 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007488
7489 VkPipelineTessellationStateCreateInfo tsCI = {};
7490 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7491 tsCI.patchControlPoints = 0; // This will cause an error
7492
7493 VkGraphicsPipelineCreateInfo gp_ci = {};
7494 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7495 gp_ci.pNext = NULL;
7496 gp_ci.stageCount = 3;
7497 gp_ci.pStages = shaderStages;
7498 gp_ci.pVertexInputState = NULL;
7499 gp_ci.pInputAssemblyState = &iaCI;
7500 gp_ci.pTessellationState = &tsCI;
7501 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007502 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007503 gp_ci.pMultisampleState = NULL;
7504 gp_ci.pDepthStencilState = NULL;
7505 gp_ci.pColorBlendState = NULL;
7506 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7507 gp_ci.layout = pipeline_layout;
7508 gp_ci.renderPass = renderPass();
7509
7510 VkPipelineCacheCreateInfo pc_ci = {};
7511 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7512 pc_ci.pNext = NULL;
7513 pc_ci.initialSize = 0;
7514 pc_ci.initialData = 0;
7515 pc_ci.maxSize = 0;
7516
7517 VkPipeline pipeline;
7518 VkPipelineCache pipelineCache;
7519
Karl Schultz6addd812016-02-02 17:17:23 -07007520 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7521&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007522 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007523 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7524&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007525
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007526 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007527
Chia-I Wuf7458c52015-10-26 21:10:41 +08007528 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7529 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7530 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7531 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007532}
7533*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007534
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007535TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007536 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007537
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007538 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007539
Tobin Ehlise68360f2015-10-01 11:15:13 -06007540 ASSERT_NO_FATAL_FAILURE(InitState());
7541 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007542
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007543 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007544 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7545 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007546
7547 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007548 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7549 ds_pool_ci.maxSets = 1;
7550 ds_pool_ci.poolSizeCount = 1;
7551 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007552
7553 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007554 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007555 ASSERT_VK_SUCCESS(err);
7556
7557 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007558 dsl_binding.binding = 0;
7559 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7560 dsl_binding.descriptorCount = 1;
7561 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007562
7563 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007564 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7565 ds_layout_ci.bindingCount = 1;
7566 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007567
7568 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007569 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007570 ASSERT_VK_SUCCESS(err);
7571
7572 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007573 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007574 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007575 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007576 alloc_info.descriptorPool = ds_pool;
7577 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007578 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007579 ASSERT_VK_SUCCESS(err);
7580
7581 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007582 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7583 pipeline_layout_ci.setLayoutCount = 1;
7584 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007585
7586 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007587 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007588 ASSERT_VK_SUCCESS(err);
7589
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007590 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007591 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007592 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007593 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007594 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007595 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007596
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007597 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7598 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7599 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7600 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7601 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7602 rs_state_ci.depthClampEnable = VK_FALSE;
7603 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7604 rs_state_ci.depthBiasEnable = VK_FALSE;
7605
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007606 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7607 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7608 vi_ci.pNext = nullptr;
7609 vi_ci.vertexBindingDescriptionCount = 0;
7610 vi_ci.pVertexBindingDescriptions = nullptr;
7611 vi_ci.vertexAttributeDescriptionCount = 0;
7612 vi_ci.pVertexAttributeDescriptions = nullptr;
7613
7614 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7615 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7616 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7617
7618 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7619 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7620 pipe_ms_state_ci.pNext = NULL;
7621 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7622 pipe_ms_state_ci.sampleShadingEnable = 0;
7623 pipe_ms_state_ci.minSampleShading = 1.0;
7624 pipe_ms_state_ci.pSampleMask = NULL;
7625
Cody Northropeb3a6c12015-10-05 14:44:45 -06007626 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007627 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007628
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007629 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007630 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007631 shaderStages[0] = vs.GetStageCreateInfo();
7632 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007633
7634 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007635 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7636 gp_ci.stageCount = 2;
7637 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007638 gp_ci.pVertexInputState = &vi_ci;
7639 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007640 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007641 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007642 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007643 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7644 gp_ci.layout = pipeline_layout;
7645 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007646
7647 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007648 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007649
7650 VkPipeline pipeline;
7651 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007652 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007653 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007654
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007655 if (!m_device->phy().features().multiViewport) {
7656 printf("MultiViewport feature is disabled -- skipping enabled-state checks.\n");
7657
7658 // Check case where multiViewport is disabled and viewport count is not 1
7659 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7662 vp_state_ci.scissorCount = 0;
7663 vp_state_ci.viewportCount = 0;
7664 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7665 m_errorMonitor->VerifyFound();
7666 } else {
7667 if (m_device->props.limits.maxViewports == 1) {
7668 printf("Device limit maxViewports is 1, skipping tests that require higher limits.\n");
7669 } else {
7670 printf("MultiViewport feature is enabled -- skipping disabled-state checks.\n");
7671
7672 // Check is that viewportcount and scissorcount match
7673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7674 vp_state_ci.scissorCount = 1;
7675 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7676 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7677 m_errorMonitor->VerifyFound();
7678
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007679 // Check case where multiViewport is enabled and viewport count is greater than max
7680 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7683 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7684 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7685 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7686 m_errorMonitor->VerifyFound();
7687 }
7688 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007689
Chia-I Wuf7458c52015-10-26 21:10:41 +08007690 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7691 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7692 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7693 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007694}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007695
7696// Don't set viewport state in PSO. This is an error b/c we always need this state for the counts even if the data is going to be
7697// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007698TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007699 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007700
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007701 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7702
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007704
Tobin Ehlise68360f2015-10-01 11:15:13 -06007705 ASSERT_NO_FATAL_FAILURE(InitState());
7706 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007707
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007708 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007709 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7710 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007711
7712 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007713 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7714 ds_pool_ci.maxSets = 1;
7715 ds_pool_ci.poolSizeCount = 1;
7716 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007717
7718 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007719 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007720 ASSERT_VK_SUCCESS(err);
7721
7722 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007723 dsl_binding.binding = 0;
7724 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7725 dsl_binding.descriptorCount = 1;
7726 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007727
7728 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007729 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7730 ds_layout_ci.bindingCount = 1;
7731 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007732
7733 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007734 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007735 ASSERT_VK_SUCCESS(err);
7736
7737 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007738 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007739 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007740 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007741 alloc_info.descriptorPool = ds_pool;
7742 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007743 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007744 ASSERT_VK_SUCCESS(err);
7745
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007746 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7747 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7748 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7749
7750 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7751 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7752 vi_ci.pNext = nullptr;
7753 vi_ci.vertexBindingDescriptionCount = 0;
7754 vi_ci.pVertexBindingDescriptions = nullptr;
7755 vi_ci.vertexAttributeDescriptionCount = 0;
7756 vi_ci.pVertexAttributeDescriptions = nullptr;
7757
7758 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7759 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7760 pipe_ms_state_ci.pNext = NULL;
7761 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7762 pipe_ms_state_ci.sampleShadingEnable = 0;
7763 pipe_ms_state_ci.minSampleShading = 1.0;
7764 pipe_ms_state_ci.pSampleMask = NULL;
7765
Tobin Ehlise68360f2015-10-01 11:15:13 -06007766 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007767 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7768 pipeline_layout_ci.setLayoutCount = 1;
7769 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007770
7771 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007772 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007773 ASSERT_VK_SUCCESS(err);
7774
7775 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7776 // Set scissor as dynamic to avoid second error
7777 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007778 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7779 dyn_state_ci.dynamicStateCount = 1;
7780 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007781
Cody Northropeb3a6c12015-10-05 14:44:45 -06007782 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007783 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007784
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007785 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007786 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7787 // 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 +08007788 shaderStages[0] = vs.GetStageCreateInfo();
7789 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007790
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007791 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7792 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7793 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7794 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7795 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7796 rs_state_ci.depthClampEnable = VK_FALSE;
7797 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7798 rs_state_ci.depthBiasEnable = VK_FALSE;
7799
Tobin Ehlise68360f2015-10-01 11:15:13 -06007800 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007801 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7802 gp_ci.stageCount = 2;
7803 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007804 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007805 // Not setting VP state w/o dynamic vp state should cause validation error
7806 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007807 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007808 gp_ci.pVertexInputState = &vi_ci;
7809 gp_ci.pInputAssemblyState = &ia_ci;
7810 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007811 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7812 gp_ci.layout = pipeline_layout;
7813 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007814
7815 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007816 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007817
7818 VkPipeline pipeline;
7819 VkPipelineCache pipelineCache;
7820
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007821 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007822 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007823 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007824
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007825 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007826
Chia-I Wuf7458c52015-10-26 21:10:41 +08007827 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7828 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7829 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7830 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007831}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007832
7833// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7834// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007835TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7836 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007837
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007839
Tobin Ehlise68360f2015-10-01 11:15:13 -06007840 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007841
7842 if (!m_device->phy().features().multiViewport) {
7843 printf("Device does not support multiple viewports/scissors; skipped.\n");
7844 return;
7845 }
7846
Tobin Ehlise68360f2015-10-01 11:15:13 -06007847 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007848
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007849 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007850 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7851 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007852
7853 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007854 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7855 ds_pool_ci.maxSets = 1;
7856 ds_pool_ci.poolSizeCount = 1;
7857 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007858
7859 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007860 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007861 ASSERT_VK_SUCCESS(err);
7862
7863 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007864 dsl_binding.binding = 0;
7865 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7866 dsl_binding.descriptorCount = 1;
7867 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007868
7869 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007870 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7871 ds_layout_ci.bindingCount = 1;
7872 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007873
7874 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007875 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007876 ASSERT_VK_SUCCESS(err);
7877
7878 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007879 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007880 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007881 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007882 alloc_info.descriptorPool = ds_pool;
7883 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007884 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007885 ASSERT_VK_SUCCESS(err);
7886
7887 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007888 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7889 pipeline_layout_ci.setLayoutCount = 1;
7890 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007891
7892 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007893 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007894 ASSERT_VK_SUCCESS(err);
7895
7896 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007897 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7898 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007899 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007900 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007901 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06007902
7903 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7904 // Set scissor as dynamic to avoid that error
7905 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007906 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7907 dyn_state_ci.dynamicStateCount = 1;
7908 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007909
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007910 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7911 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7912 pipe_ms_state_ci.pNext = NULL;
7913 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7914 pipe_ms_state_ci.sampleShadingEnable = 0;
7915 pipe_ms_state_ci.minSampleShading = 1.0;
7916 pipe_ms_state_ci.pSampleMask = NULL;
7917
Cody Northropeb3a6c12015-10-05 14:44:45 -06007918 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007919 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007920
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007921 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007922 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7923 // 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 +08007924 shaderStages[0] = vs.GetStageCreateInfo();
7925 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007926
Cody Northropf6622dc2015-10-06 10:33:21 -06007927 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7928 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7929 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007930 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007931 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007932 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007933 vi_ci.pVertexAttributeDescriptions = nullptr;
7934
7935 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7936 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7937 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7938
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007939 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007940 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007941 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06007942 rs_ci.pNext = nullptr;
7943
Mark Youngc89c6312016-03-31 16:03:20 -06007944 VkPipelineColorBlendAttachmentState att = {};
7945 att.blendEnable = VK_FALSE;
7946 att.colorWriteMask = 0xf;
7947
Cody Northropf6622dc2015-10-06 10:33:21 -06007948 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7949 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7950 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007951 cb_ci.attachmentCount = 1;
7952 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06007953
Tobin Ehlise68360f2015-10-01 11:15:13 -06007954 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007955 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7956 gp_ci.stageCount = 2;
7957 gp_ci.pStages = shaderStages;
7958 gp_ci.pVertexInputState = &vi_ci;
7959 gp_ci.pInputAssemblyState = &ia_ci;
7960 gp_ci.pViewportState = &vp_state_ci;
7961 gp_ci.pRasterizationState = &rs_ci;
7962 gp_ci.pColorBlendState = &cb_ci;
7963 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007964 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007965 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7966 gp_ci.layout = pipeline_layout;
7967 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007968
7969 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007970 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007971
7972 VkPipeline pipeline;
7973 VkPipelineCache pipelineCache;
7974
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007975 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007976 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007977 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007978
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007979 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007980
Tobin Ehlisd332f282015-10-02 11:00:56 -06007981 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07007982 // First need to successfully create the PSO from above by setting
7983 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06007984 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 -07007985
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007986 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07007987 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007988 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007989 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07007990 m_commandBuffer->BeginCommandBuffer();
7991 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007992 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007993 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07007994 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007995 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07007996 Draw(1, 0, 0, 0);
7997
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007998 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007999
8000 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8001 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8002 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8003 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008004 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008005}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008006
8007// Create PSO w/o non-zero scissorCount but no scissor data, then run second test where dynamic viewportCount doesn't match PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008008// viewportCount
8009TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8010 VkResult err;
8011
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008013
8014 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008015
8016 if (!m_device->phy().features().multiViewport) {
8017 printf("Device does not support multiple viewports/scissors; skipped.\n");
8018 return;
8019 }
8020
Karl Schultz6addd812016-02-02 17:17:23 -07008021 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8022
8023 VkDescriptorPoolSize ds_type_count = {};
8024 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8025 ds_type_count.descriptorCount = 1;
8026
8027 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8028 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8029 ds_pool_ci.maxSets = 1;
8030 ds_pool_ci.poolSizeCount = 1;
8031 ds_pool_ci.pPoolSizes = &ds_type_count;
8032
8033 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008034 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008035 ASSERT_VK_SUCCESS(err);
8036
8037 VkDescriptorSetLayoutBinding dsl_binding = {};
8038 dsl_binding.binding = 0;
8039 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8040 dsl_binding.descriptorCount = 1;
8041 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8042
8043 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8044 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8045 ds_layout_ci.bindingCount = 1;
8046 ds_layout_ci.pBindings = &dsl_binding;
8047
8048 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008049 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008050 ASSERT_VK_SUCCESS(err);
8051
8052 VkDescriptorSet descriptorSet;
8053 VkDescriptorSetAllocateInfo alloc_info = {};
8054 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8055 alloc_info.descriptorSetCount = 1;
8056 alloc_info.descriptorPool = ds_pool;
8057 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008058 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008059 ASSERT_VK_SUCCESS(err);
8060
8061 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8062 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8063 pipeline_layout_ci.setLayoutCount = 1;
8064 pipeline_layout_ci.pSetLayouts = &ds_layout;
8065
8066 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008067 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008068 ASSERT_VK_SUCCESS(err);
8069
8070 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8071 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8072 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008073 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008074 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008075 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008076
8077 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8078 // Set scissor as dynamic to avoid that error
8079 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8080 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8081 dyn_state_ci.dynamicStateCount = 1;
8082 dyn_state_ci.pDynamicStates = &vp_state;
8083
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008084 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8085 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8086 pipe_ms_state_ci.pNext = NULL;
8087 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8088 pipe_ms_state_ci.sampleShadingEnable = 0;
8089 pipe_ms_state_ci.minSampleShading = 1.0;
8090 pipe_ms_state_ci.pSampleMask = NULL;
8091
Karl Schultz6addd812016-02-02 17:17:23 -07008092 VkPipelineShaderStageCreateInfo shaderStages[2];
8093 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8094
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008095 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008096 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8097 // We shouldn't need a fragment shader but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07008098 shaderStages[0] = vs.GetStageCreateInfo();
8099 shaderStages[1] = fs.GetStageCreateInfo();
8100
8101 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8102 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8103 vi_ci.pNext = nullptr;
8104 vi_ci.vertexBindingDescriptionCount = 0;
8105 vi_ci.pVertexBindingDescriptions = nullptr;
8106 vi_ci.vertexAttributeDescriptionCount = 0;
8107 vi_ci.pVertexAttributeDescriptions = nullptr;
8108
8109 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8110 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8111 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8112
8113 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8114 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008115 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008116 rs_ci.pNext = nullptr;
8117
Mark Youngc89c6312016-03-31 16:03:20 -06008118 VkPipelineColorBlendAttachmentState att = {};
8119 att.blendEnable = VK_FALSE;
8120 att.colorWriteMask = 0xf;
8121
Karl Schultz6addd812016-02-02 17:17:23 -07008122 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8123 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8124 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008125 cb_ci.attachmentCount = 1;
8126 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008127
8128 VkGraphicsPipelineCreateInfo gp_ci = {};
8129 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8130 gp_ci.stageCount = 2;
8131 gp_ci.pStages = shaderStages;
8132 gp_ci.pVertexInputState = &vi_ci;
8133 gp_ci.pInputAssemblyState = &ia_ci;
8134 gp_ci.pViewportState = &vp_state_ci;
8135 gp_ci.pRasterizationState = &rs_ci;
8136 gp_ci.pColorBlendState = &cb_ci;
8137 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008138 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008139 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8140 gp_ci.layout = pipeline_layout;
8141 gp_ci.renderPass = renderPass();
8142
8143 VkPipelineCacheCreateInfo pc_ci = {};
8144 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8145
8146 VkPipeline pipeline;
8147 VkPipelineCache pipelineCache;
8148
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008149 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008150 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008151 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008152
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008153 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008154
8155 // Now hit second fail case where we set scissor w/ different count than PSO
8156 // First need to successfully create the PSO from above by setting
8157 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8159 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008160
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008161 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008162 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008163 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008164 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008165 m_commandBuffer->BeginCommandBuffer();
8166 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008167 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008168 VkViewport viewports[1] = {};
8169 viewports[0].width = 8;
8170 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008171 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008172 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008173 Draw(1, 0, 0, 0);
8174
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008175 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008176
Chia-I Wuf7458c52015-10-26 21:10:41 +08008177 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8178 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8179 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8180 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008181 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008182}
8183
Mark Young7394fdd2016-03-31 14:56:43 -06008184TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8185 VkResult err;
8186
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008188
8189 ASSERT_NO_FATAL_FAILURE(InitState());
8190 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8191
8192 VkDescriptorPoolSize ds_type_count = {};
8193 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8194 ds_type_count.descriptorCount = 1;
8195
8196 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8197 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8198 ds_pool_ci.maxSets = 1;
8199 ds_pool_ci.poolSizeCount = 1;
8200 ds_pool_ci.pPoolSizes = &ds_type_count;
8201
8202 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008203 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008204 ASSERT_VK_SUCCESS(err);
8205
8206 VkDescriptorSetLayoutBinding dsl_binding = {};
8207 dsl_binding.binding = 0;
8208 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8209 dsl_binding.descriptorCount = 1;
8210 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8211
8212 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8213 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8214 ds_layout_ci.bindingCount = 1;
8215 ds_layout_ci.pBindings = &dsl_binding;
8216
8217 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008218 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008219 ASSERT_VK_SUCCESS(err);
8220
8221 VkDescriptorSet descriptorSet;
8222 VkDescriptorSetAllocateInfo alloc_info = {};
8223 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8224 alloc_info.descriptorSetCount = 1;
8225 alloc_info.descriptorPool = ds_pool;
8226 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008227 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008228 ASSERT_VK_SUCCESS(err);
8229
8230 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8231 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8232 pipeline_layout_ci.setLayoutCount = 1;
8233 pipeline_layout_ci.pSetLayouts = &ds_layout;
8234
8235 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008236 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008237 ASSERT_VK_SUCCESS(err);
8238
8239 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8240 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8241 vp_state_ci.scissorCount = 1;
8242 vp_state_ci.pScissors = NULL;
8243 vp_state_ci.viewportCount = 1;
8244 vp_state_ci.pViewports = NULL;
8245
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008246 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008247 // Set scissor as dynamic to avoid that error
8248 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8249 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8250 dyn_state_ci.dynamicStateCount = 2;
8251 dyn_state_ci.pDynamicStates = dynamic_states;
8252
8253 VkPipelineShaderStageCreateInfo shaderStages[2];
8254 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8255
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008256 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8257 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008258 this); // TODO - We shouldn't need a fragment shader
8259 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008260 shaderStages[0] = vs.GetStageCreateInfo();
8261 shaderStages[1] = fs.GetStageCreateInfo();
8262
8263 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8264 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8265 vi_ci.pNext = nullptr;
8266 vi_ci.vertexBindingDescriptionCount = 0;
8267 vi_ci.pVertexBindingDescriptions = nullptr;
8268 vi_ci.vertexAttributeDescriptionCount = 0;
8269 vi_ci.pVertexAttributeDescriptions = nullptr;
8270
8271 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8272 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8273 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8274
8275 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8276 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8277 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008278 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008279
Mark Young47107952016-05-02 15:59:55 -06008280 // Check too low (line width of -1.0f).
8281 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008282
8283 VkPipelineColorBlendAttachmentState att = {};
8284 att.blendEnable = VK_FALSE;
8285 att.colorWriteMask = 0xf;
8286
8287 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8288 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8289 cb_ci.pNext = nullptr;
8290 cb_ci.attachmentCount = 1;
8291 cb_ci.pAttachments = &att;
8292
8293 VkGraphicsPipelineCreateInfo gp_ci = {};
8294 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8295 gp_ci.stageCount = 2;
8296 gp_ci.pStages = shaderStages;
8297 gp_ci.pVertexInputState = &vi_ci;
8298 gp_ci.pInputAssemblyState = &ia_ci;
8299 gp_ci.pViewportState = &vp_state_ci;
8300 gp_ci.pRasterizationState = &rs_ci;
8301 gp_ci.pColorBlendState = &cb_ci;
8302 gp_ci.pDynamicState = &dyn_state_ci;
8303 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8304 gp_ci.layout = pipeline_layout;
8305 gp_ci.renderPass = renderPass();
8306
8307 VkPipelineCacheCreateInfo pc_ci = {};
8308 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8309
8310 VkPipeline pipeline;
8311 VkPipelineCache pipelineCache;
8312
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008313 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008314 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008315 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008316
8317 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008318 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008319
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008321
8322 // Check too high (line width of 65536.0f).
8323 rs_ci.lineWidth = 65536.0f;
8324
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008325 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008326 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008327 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008328
8329 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008330 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008331
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008333
8334 dyn_state_ci.dynamicStateCount = 3;
8335
8336 rs_ci.lineWidth = 1.0f;
8337
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008338 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008339 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008340 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008341 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008342 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008343
8344 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008345 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008346 m_errorMonitor->VerifyFound();
8347
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008349
8350 // Check too high with dynamic setting.
8351 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8352 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008353 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008354
8355 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8356 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8357 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8358 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008359 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008360}
8361
Karl Schultz6addd812016-02-02 17:17:23 -07008362TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008363 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008365 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008366
8367 ASSERT_NO_FATAL_FAILURE(InitState());
8368 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008369
Tony Barbour552f6c02016-12-21 14:34:07 -07008370 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008371 // Don't care about RenderPass handle b/c error should be flagged before
8372 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008373 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008374
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008375 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008376}
8377
Karl Schultz6addd812016-02-02 17:17:23 -07008378TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008379 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8381 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008382
8383 ASSERT_NO_FATAL_FAILURE(InitState());
8384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008385
Tony Barbour552f6c02016-12-21 14:34:07 -07008386 m_commandBuffer->BeginCommandBuffer();
8387 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008388 // Just create a dummy Renderpass that's non-NULL so we can get to the
8389 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008390 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008391
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008392 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008393}
8394
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008395TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008396 TEST_DESCRIPTION(
8397 "Begin a renderPass where clearValueCount is less than"
8398 "the number of renderPass attachments that use loadOp"
8399 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008400
8401 ASSERT_NO_FATAL_FAILURE(InitState());
8402 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8403
8404 // Create a renderPass with a single attachment that uses loadOp CLEAR
8405 VkAttachmentReference attach = {};
8406 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8407 VkSubpassDescription subpass = {};
8408 subpass.inputAttachmentCount = 1;
8409 subpass.pInputAttachments = &attach;
8410 VkRenderPassCreateInfo rpci = {};
8411 rpci.subpassCount = 1;
8412 rpci.pSubpasses = &subpass;
8413 rpci.attachmentCount = 1;
8414 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008415 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008416 // Set loadOp to CLEAR
8417 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8418 rpci.pAttachments = &attach_desc;
8419 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8420 VkRenderPass rp;
8421 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8422
8423 VkCommandBufferInheritanceInfo hinfo = {};
8424 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8425 hinfo.renderPass = VK_NULL_HANDLE;
8426 hinfo.subpass = 0;
8427 hinfo.framebuffer = VK_NULL_HANDLE;
8428 hinfo.occlusionQueryEnable = VK_FALSE;
8429 hinfo.queryFlags = 0;
8430 hinfo.pipelineStatistics = 0;
8431 VkCommandBufferBeginInfo info = {};
8432 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8433 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8434 info.pInheritanceInfo = &hinfo;
8435
8436 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8437 VkRenderPassBeginInfo rp_begin = {};
8438 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8439 rp_begin.pNext = NULL;
8440 rp_begin.renderPass = renderPass();
8441 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008442 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008443
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008445
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008446 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008447
8448 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008449
8450 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008451}
8452
Slawomir Cygan0808f392016-11-28 17:53:23 +01008453TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008454 TEST_DESCRIPTION(
8455 "Begin a renderPass where clearValueCount is greater than"
8456 "the number of renderPass attachments that use loadOp"
8457 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008458
8459 ASSERT_NO_FATAL_FAILURE(InitState());
8460 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8461
8462 // Create a renderPass with a single attachment that uses loadOp CLEAR
8463 VkAttachmentReference attach = {};
8464 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8465 VkSubpassDescription subpass = {};
8466 subpass.inputAttachmentCount = 1;
8467 subpass.pInputAttachments = &attach;
8468 VkRenderPassCreateInfo rpci = {};
8469 rpci.subpassCount = 1;
8470 rpci.pSubpasses = &subpass;
8471 rpci.attachmentCount = 1;
8472 VkAttachmentDescription attach_desc = {};
8473 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8474 // Set loadOp to CLEAR
8475 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8476 rpci.pAttachments = &attach_desc;
8477 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8478 VkRenderPass rp;
8479 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8480
8481 VkCommandBufferBeginInfo info = {};
8482 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8483 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8484
8485 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8486 VkRenderPassBeginInfo rp_begin = {};
8487 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8488 rp_begin.pNext = NULL;
8489 rp_begin.renderPass = renderPass();
8490 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008491 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008492
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8494 " has a clearValueCount of"
8495 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008496
8497 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8498
8499 m_errorMonitor->VerifyFound();
8500
8501 vkDestroyRenderPass(m_device->device(), rp, NULL);
8502}
8503
Cody Northrop3bb4d962016-05-09 16:15:57 -06008504TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008505 TEST_DESCRIPTION("End a command buffer with an active render pass");
8506
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8508 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008509
8510 ASSERT_NO_FATAL_FAILURE(InitState());
8511 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8512
Tony Barbour552f6c02016-12-21 14:34:07 -07008513 m_commandBuffer->BeginCommandBuffer();
8514 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8515 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008516
8517 m_errorMonitor->VerifyFound();
8518
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008519 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8520 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008521}
8522
Karl Schultz6addd812016-02-02 17:17:23 -07008523TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008524 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8526 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008527
8528 ASSERT_NO_FATAL_FAILURE(InitState());
8529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008530
Tony Barbour552f6c02016-12-21 14:34:07 -07008531 m_commandBuffer->BeginCommandBuffer();
8532 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008533
8534 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008535 vk_testing::Buffer dstBuffer;
8536 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008537
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008538 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008539
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008540 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008541}
8542
Karl Schultz6addd812016-02-02 17:17:23 -07008543TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008544 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8546 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008547
8548 ASSERT_NO_FATAL_FAILURE(InitState());
8549 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008550
Tony Barbour552f6c02016-12-21 14:34:07 -07008551 m_commandBuffer->BeginCommandBuffer();
8552 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008553
8554 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008555 vk_testing::Buffer dstBuffer;
8556 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008557
Karl Schultz6addd812016-02-02 17:17:23 -07008558 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008559 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8560 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8561 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008562
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008563 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008564}
8565
Karl Schultz6addd812016-02-02 17:17:23 -07008566TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008567 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8569 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008570
8571 ASSERT_NO_FATAL_FAILURE(InitState());
8572 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008573
Tony Barbour552f6c02016-12-21 14:34:07 -07008574 m_commandBuffer->BeginCommandBuffer();
8575 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008576
Michael Lentine0a369f62016-02-03 16:51:46 -06008577 VkClearColorValue clear_color;
8578 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008579 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8580 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8581 const int32_t tex_width = 32;
8582 const int32_t tex_height = 32;
8583 VkImageCreateInfo image_create_info = {};
8584 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8585 image_create_info.pNext = NULL;
8586 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8587 image_create_info.format = tex_format;
8588 image_create_info.extent.width = tex_width;
8589 image_create_info.extent.height = tex_height;
8590 image_create_info.extent.depth = 1;
8591 image_create_info.mipLevels = 1;
8592 image_create_info.arrayLayers = 1;
8593 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8594 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8595 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008596
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008597 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008598 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008599
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008600 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008601
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008602 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008603
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008604 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008605}
8606
Karl Schultz6addd812016-02-02 17:17:23 -07008607TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008608 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8610 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008611
8612 ASSERT_NO_FATAL_FAILURE(InitState());
8613 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008614
Tony Barbour552f6c02016-12-21 14:34:07 -07008615 m_commandBuffer->BeginCommandBuffer();
8616 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008617
8618 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008619 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008620 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8621 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8622 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8623 image_create_info.extent.width = 64;
8624 image_create_info.extent.height = 64;
8625 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8626 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008627
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008628 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008629 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008630
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008631 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008632
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008633 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8634 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008635
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008636 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008637}
8638
Karl Schultz6addd812016-02-02 17:17:23 -07008639TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008640 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008641 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008642
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8644 "vkCmdClearAttachments(): This call "
8645 "must be issued inside an active "
8646 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008647
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008648 ASSERT_NO_FATAL_FAILURE(InitState());
8649 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008650
8651 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008652 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008653 ASSERT_VK_SUCCESS(err);
8654
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008655 VkClearAttachment color_attachment;
8656 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8657 color_attachment.clearValue.color.float32[0] = 0;
8658 color_attachment.clearValue.color.float32[1] = 0;
8659 color_attachment.clearValue.color.float32[2] = 0;
8660 color_attachment.clearValue.color.float32[3] = 0;
8661 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008662 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008663 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008664
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008665 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008666}
8667
Chris Forbes3b97e932016-09-07 11:29:24 +12008668TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008669 TEST_DESCRIPTION(
8670 "Test that an error is produced when CmdNextSubpass is "
8671 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008672
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8674 "vkCmdNextSubpass(): Attempted to advance "
8675 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008676
8677 ASSERT_NO_FATAL_FAILURE(InitState());
8678 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8679
Tony Barbour552f6c02016-12-21 14:34:07 -07008680 m_commandBuffer->BeginCommandBuffer();
8681 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008682
8683 // error here.
8684 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8685 m_errorMonitor->VerifyFound();
8686
Tony Barbour552f6c02016-12-21 14:34:07 -07008687 m_commandBuffer->EndRenderPass();
8688 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008689}
8690
Chris Forbes6d624702016-09-07 13:57:05 +12008691TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008692 TEST_DESCRIPTION(
8693 "Test that an error is produced when CmdEndRenderPass is "
8694 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008695
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8697 "vkCmdEndRenderPass(): Called before reaching "
8698 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008699
8700 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008701 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8702 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008703
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008704 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008705
8706 VkRenderPass rp;
8707 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8708 ASSERT_VK_SUCCESS(err);
8709
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008710 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008711
8712 VkFramebuffer fb;
8713 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8714 ASSERT_VK_SUCCESS(err);
8715
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008716 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008717
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008718 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 +12008719
8720 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8721
8722 // Error here.
8723 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8724 m_errorMonitor->VerifyFound();
8725
8726 // Clean up.
8727 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8728 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8729}
8730
Karl Schultz9e66a292016-04-21 15:57:51 -06008731TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8732 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8734 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008735
8736 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour552f6c02016-12-21 14:34:07 -07008737 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008738
8739 VkBufferMemoryBarrier buf_barrier = {};
8740 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8741 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8742 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8743 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8744 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8745 buf_barrier.buffer = VK_NULL_HANDLE;
8746 buf_barrier.offset = 0;
8747 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008748 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8749 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008750
8751 m_errorMonitor->VerifyFound();
8752}
8753
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008754TEST_F(VkLayerTest, InvalidBarriers) {
8755 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8756
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008757 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008758
8759 ASSERT_NO_FATAL_FAILURE(InitState());
8760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8761
8762 VkMemoryBarrier mem_barrier = {};
8763 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8764 mem_barrier.pNext = NULL;
8765 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8766 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008767 m_commandBuffer->BeginCommandBuffer();
8768 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008769 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008770 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008771 &mem_barrier, 0, nullptr, 0, nullptr);
8772 m_errorMonitor->VerifyFound();
8773
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008775 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008776 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 -06008777 ASSERT_TRUE(image.initialized());
8778 VkImageMemoryBarrier img_barrier = {};
8779 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8780 img_barrier.pNext = NULL;
8781 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8782 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8783 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8784 // New layout can't be UNDEFINED
8785 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8786 img_barrier.image = image.handle();
8787 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8788 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8789 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8790 img_barrier.subresourceRange.baseArrayLayer = 0;
8791 img_barrier.subresourceRange.baseMipLevel = 0;
8792 img_barrier.subresourceRange.layerCount = 1;
8793 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008794 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8795 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008796 m_errorMonitor->VerifyFound();
8797 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8798
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8800 "Subresource must have the sum of the "
8801 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008802 // baseArrayLayer + layerCount must be <= image's arrayLayers
8803 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008804 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8805 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008806 m_errorMonitor->VerifyFound();
8807 img_barrier.subresourceRange.baseArrayLayer = 0;
8808
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008810 // baseMipLevel + levelCount must be <= image's mipLevels
8811 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008812 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8813 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008814 m_errorMonitor->VerifyFound();
8815 img_barrier.subresourceRange.baseMipLevel = 0;
8816
Mike Weiblen7053aa32017-01-25 15:21:10 -07008817 // levelCount must be non-zero.
8818 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
8819 img_barrier.subresourceRange.levelCount = 0;
8820 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8821 nullptr, 0, nullptr, 1, &img_barrier);
8822 m_errorMonitor->VerifyFound();
8823 img_barrier.subresourceRange.levelCount = 1;
8824
8825 // layerCount must be non-zero.
8826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
8827 img_barrier.subresourceRange.layerCount = 0;
8828 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8829 nullptr, 0, nullptr, 1, &img_barrier);
8830 m_errorMonitor->VerifyFound();
8831 img_barrier.subresourceRange.layerCount = 1;
8832
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008833 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 -06008834 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008835 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8836 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008837 VkBufferMemoryBarrier buf_barrier = {};
8838 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8839 buf_barrier.pNext = NULL;
8840 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8841 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8842 buf_barrier.buffer = buffer.handle();
8843 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8844 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8845 buf_barrier.offset = 0;
8846 buf_barrier.size = VK_WHOLE_SIZE;
8847 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008848 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8849 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008850 m_errorMonitor->VerifyFound();
8851 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8852
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008854 buf_barrier.offset = 257;
8855 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008856 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8857 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008858 m_errorMonitor->VerifyFound();
8859 buf_barrier.offset = 0;
8860
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008862 buf_barrier.size = 257;
8863 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008864 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8865 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008866 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008867
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008868 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008869 m_errorMonitor->SetDesiredFailureMsg(
8870 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008871 "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 -06008872 VkDepthStencilObj ds_image(m_device);
8873 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
8874 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06008875 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
8876 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008877 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008878
8879 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07008880 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008881 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8882 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008883 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07008884
8885 // Having anything other than DEPTH or STENCIL is an error
8886 m_errorMonitor->SetDesiredFailureMsg(
8887 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8888 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
8889 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
8890 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8891 nullptr, 0, nullptr, 1, &img_barrier);
8892 m_errorMonitor->VerifyFound();
8893
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008894 // Now test depth-only
8895 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008896 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
8897 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008898 VkDepthStencilObj d_image(m_device);
8899 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
8900 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008901 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008902 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008903 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008904
8905 // DEPTH bit must be set
8906 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8907 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07008908 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07008909 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8910 0, nullptr, 0, nullptr, 1, &img_barrier);
8911 m_errorMonitor->VerifyFound();
8912
8913 // No bits other than DEPTH may be set
8914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8915 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
8916 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008917 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8918 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008919 m_errorMonitor->VerifyFound();
8920 }
Dave Houltonfbf52152017-01-06 12:55:29 -07008921
8922 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008923 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
8924 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8926 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008927 VkDepthStencilObj s_image(m_device);
8928 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
8929 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008930 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008931 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008932 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008933 // Use of COLOR aspect on depth image is error
8934 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008935 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8936 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008937 m_errorMonitor->VerifyFound();
8938 }
Dave Houltonfbf52152017-01-06 12:55:29 -07008939
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008940 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008941 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008942 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 -06008943 ASSERT_TRUE(c_image.initialized());
8944 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8945 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
8946 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008947
8948 // COLOR bit must be set
8949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8950 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07008951 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07008952 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8953 nullptr, 0, nullptr, 1, &img_barrier);
8954 m_errorMonitor->VerifyFound();
8955
8956 // No bits other than COLOR may be set
8957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8958 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
8959 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008960 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8961 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008962 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008963
8964 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
8965
8966 // Create command pool with incompatible queueflags
8967 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
8968 uint32_t queue_family_index = UINT32_MAX;
8969 for (uint32_t i = 0; i < queue_props.size(); i++) {
8970 if ((queue_props[i].queueFlags & VK_QUEUE_COMPUTE_BIT) == 0) {
8971 queue_family_index = i;
8972 break;
8973 }
8974 }
8975 if (queue_family_index == UINT32_MAX) {
8976 printf("No non-compute queue found; skipped.\n");
8977 return;
8978 }
8979 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
8980
8981 VkCommandPool command_pool;
8982 VkCommandPoolCreateInfo pool_create_info{};
8983 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
8984 pool_create_info.queueFamilyIndex = queue_family_index;
8985 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
8986 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
8987
8988 // Allocate a command buffer
8989 VkCommandBuffer bad_command_buffer;
8990 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
8991 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
8992 command_buffer_allocate_info.commandPool = command_pool;
8993 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
8994 command_buffer_allocate_info.commandBufferCount = 1;
8995 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
8996
8997 VkCommandBufferBeginInfo cbbi = {};
8998 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8999 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9000 buf_barrier.offset = 0;
9001 buf_barrier.size = VK_WHOLE_SIZE;
9002 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9003 &buf_barrier, 0, nullptr);
9004 m_errorMonitor->VerifyFound();
9005
9006 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9007 vkEndCommandBuffer(bad_command_buffer);
9008 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
9009 printf("The non-compute queue does not support graphics; skipped.\n");
9010 return;
9011 }
9012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9013 VkEvent event;
9014 VkEventCreateInfo event_create_info{};
9015 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9016 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9017 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9018 nullptr, 0, nullptr);
9019 m_errorMonitor->VerifyFound();
9020
9021 vkEndCommandBuffer(bad_command_buffer);
9022 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009023}
9024
Tony Barbour18ba25c2016-09-29 13:42:40 -06009025TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9026 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9027
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour18ba25c2016-09-29 13:42:40 -06009029 ASSERT_NO_FATAL_FAILURE(InitState());
9030 VkImageObj image(m_device);
Tony Barbour256c80a2016-10-05 13:23:46 -06009031 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 -06009032 ASSERT_TRUE(image.initialized());
9033
9034 VkImageMemoryBarrier barrier = {};
9035 VkImageSubresourceRange range;
9036 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9037 barrier.srcAccessMask = 0;
9038 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9039 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9040 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9041 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9042 barrier.image = image.handle();
9043 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9044 range.baseMipLevel = 0;
9045 range.levelCount = 1;
9046 range.baseArrayLayer = 0;
9047 range.layerCount = 1;
9048 barrier.subresourceRange = range;
9049 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9050 cmdbuf.BeginCommandBuffer();
9051 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9052 &barrier);
9053 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9054 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9055 barrier.srcAccessMask = 0;
9056 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9057 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9058 &barrier);
9059
9060 m_errorMonitor->VerifyFound();
9061}
9062
Karl Schultz6addd812016-02-02 17:17:23 -07009063TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009064 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009065 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009066
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009068
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009069 ASSERT_NO_FATAL_FAILURE(InitState());
9070 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009071 uint32_t qfi = 0;
9072 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009073 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9074 buffCI.size = 1024;
9075 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9076 buffCI.queueFamilyIndexCount = 1;
9077 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009078
9079 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009080 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009081 ASSERT_VK_SUCCESS(err);
9082
Tony Barbour552f6c02016-12-21 14:34:07 -07009083 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009084 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009085 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9086 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009087 // Should error before calling to driver so don't care about actual data
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009088 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7, VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009089
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009090 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009091
Chia-I Wuf7458c52015-10-26 21:10:41 +08009092 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009093}
9094
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009095TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9096 // Create an out-of-range queueFamilyIndex
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9098 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
9099 "of the indices specified when the device was created, via the "
9100 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009101
9102 ASSERT_NO_FATAL_FAILURE(InitState());
9103 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9104 VkBufferCreateInfo buffCI = {};
9105 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9106 buffCI.size = 1024;
9107 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9108 buffCI.queueFamilyIndexCount = 1;
9109 // Introduce failure by specifying invalid queue_family_index
9110 uint32_t qfi = 777;
9111 buffCI.pQueueFamilyIndices = &qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009112 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009113
9114 VkBuffer ib;
9115 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
9116
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009117 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009118 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009119}
9120
Karl Schultz6addd812016-02-02 17:17:23 -07009121TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009122 TEST_DESCRIPTION(
9123 "Attempt vkCmdExecuteCommands with a primary command buffer"
9124 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009125
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009126 ASSERT_NO_FATAL_FAILURE(InitState());
9127 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009128
Chris Forbesf29a84f2016-10-06 18:39:28 +13009129 // An empty primary command buffer
9130 VkCommandBufferObj cb(m_device, m_commandPool);
9131 cb.BeginCommandBuffer();
9132 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009133
Chris Forbesf29a84f2016-10-06 18:39:28 +13009134 m_commandBuffer->BeginCommandBuffer();
9135 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9136 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009137
Chris Forbesf29a84f2016-10-06 18:39:28 +13009138 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9139 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009140 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009141}
9142
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009143TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009144 TEST_DESCRIPTION(
9145 "Attempt to update descriptor sets for images and buffers "
9146 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009147 VkResult err;
9148
9149 ASSERT_NO_FATAL_FAILURE(InitState());
9150 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9151 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9152 ds_type_count[i].type = VkDescriptorType(i);
9153 ds_type_count[i].descriptorCount = 1;
9154 }
9155 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9156 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9157 ds_pool_ci.pNext = NULL;
9158 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9159 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9160 ds_pool_ci.pPoolSizes = ds_type_count;
9161
9162 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009163 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009164 ASSERT_VK_SUCCESS(err);
9165
9166 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009167 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009168 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9169 dsl_binding[i].binding = 0;
9170 dsl_binding[i].descriptorType = VkDescriptorType(i);
9171 dsl_binding[i].descriptorCount = 1;
9172 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9173 dsl_binding[i].pImmutableSamplers = NULL;
9174 }
9175
9176 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9177 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9178 ds_layout_ci.pNext = NULL;
9179 ds_layout_ci.bindingCount = 1;
9180 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9181 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9182 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009183 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009184 ASSERT_VK_SUCCESS(err);
9185 }
9186 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9187 VkDescriptorSetAllocateInfo alloc_info = {};
9188 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9189 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9190 alloc_info.descriptorPool = ds_pool;
9191 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009192 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009193 ASSERT_VK_SUCCESS(err);
9194
9195 // Create a buffer & bufferView to be used for invalid updates
9196 VkBufferCreateInfo buff_ci = {};
9197 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009198 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009199 buff_ci.size = 256;
9200 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009201 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009202 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9203 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009204
9205 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9206 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9207 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9208 ASSERT_VK_SUCCESS(err);
9209
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009210 VkMemoryRequirements mem_reqs;
9211 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9212 VkMemoryAllocateInfo mem_alloc_info = {};
9213 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9214 mem_alloc_info.pNext = NULL;
9215 mem_alloc_info.memoryTypeIndex = 0;
9216 mem_alloc_info.allocationSize = mem_reqs.size;
9217 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9218 if (!pass) {
9219 vkDestroyBuffer(m_device->device(), buffer, NULL);
9220 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9221 return;
9222 }
9223 VkDeviceMemory mem;
9224 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9225 ASSERT_VK_SUCCESS(err);
9226 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9227 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009228
9229 VkBufferViewCreateInfo buff_view_ci = {};
9230 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9231 buff_view_ci.buffer = buffer;
9232 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9233 buff_view_ci.range = VK_WHOLE_SIZE;
9234 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009235 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009236 ASSERT_VK_SUCCESS(err);
9237
Tony Barbour415497c2017-01-24 10:06:09 -07009238 // Now get resources / view for storage_texel_buffer
9239 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9240 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9241 if (!pass) {
9242 vkDestroyBuffer(m_device->device(), buffer, NULL);
9243 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9244 vkFreeMemory(m_device->device(), mem, NULL);
9245 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9246 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9247 return;
9248 }
9249 VkDeviceMemory storage_texel_buffer_mem;
9250 VkBufferView storage_texel_buffer_view;
9251 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9252 ASSERT_VK_SUCCESS(err);
9253 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9254 ASSERT_VK_SUCCESS(err);
9255 buff_view_ci.buffer = storage_texel_buffer;
9256 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9257 ASSERT_VK_SUCCESS(err);
9258
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009259 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009260 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009261 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009262 image_ci.format = VK_FORMAT_UNDEFINED;
9263 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9264 VkFormat format = static_cast<VkFormat>(f);
9265 VkFormatProperties fProps = m_device->format_properties(format);
9266 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9267 image_ci.format = format;
9268 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9269 break;
9270 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9271 image_ci.format = format;
9272 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9273 break;
9274 }
9275 }
9276 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9277 return;
9278 }
9279
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009280 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9281 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009282 image_ci.extent.width = 64;
9283 image_ci.extent.height = 64;
9284 image_ci.extent.depth = 1;
9285 image_ci.mipLevels = 1;
9286 image_ci.arrayLayers = 1;
9287 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009288 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009289 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009290 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9291 VkImage image;
9292 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9293 ASSERT_VK_SUCCESS(err);
9294 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009295 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009296
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009297 VkMemoryAllocateInfo mem_alloc = {};
9298 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9299 mem_alloc.pNext = NULL;
9300 mem_alloc.allocationSize = 0;
9301 mem_alloc.memoryTypeIndex = 0;
9302 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9303 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009304 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009305 ASSERT_TRUE(pass);
9306 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9307 ASSERT_VK_SUCCESS(err);
9308 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9309 ASSERT_VK_SUCCESS(err);
9310 // Now create view for image
9311 VkImageViewCreateInfo image_view_ci = {};
9312 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9313 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009314 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009315 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9316 image_view_ci.subresourceRange.layerCount = 1;
9317 image_view_ci.subresourceRange.baseArrayLayer = 0;
9318 image_view_ci.subresourceRange.levelCount = 1;
9319 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9320 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009321 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009322 ASSERT_VK_SUCCESS(err);
9323
9324 VkDescriptorBufferInfo buff_info = {};
9325 buff_info.buffer = buffer;
9326 VkDescriptorImageInfo img_info = {};
9327 img_info.imageView = image_view;
9328 VkWriteDescriptorSet descriptor_write = {};
9329 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9330 descriptor_write.dstBinding = 0;
9331 descriptor_write.descriptorCount = 1;
9332 descriptor_write.pTexelBufferView = &buff_view;
9333 descriptor_write.pBufferInfo = &buff_info;
9334 descriptor_write.pImageInfo = &img_info;
9335
9336 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009337 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009338 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9339 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9340 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9341 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9342 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9343 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9344 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9345 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9346 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9347 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9348 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009349 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009350 // Start loop at 1 as SAMPLER desc type has no usage bit error
9351 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009352 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9353 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9354 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9355 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009356 descriptor_write.descriptorType = VkDescriptorType(i);
9357 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009359
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009360 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009361
9362 m_errorMonitor->VerifyFound();
9363 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009364 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9365 descriptor_write.pTexelBufferView = &buff_view;
9366 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009367 }
Tony Barbour415497c2017-01-24 10:06:09 -07009368
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009369 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9370 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009371 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009372 vkDestroyImageView(m_device->device(), image_view, NULL);
9373 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009374 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009375 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009376 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009377 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009378 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009379 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9380}
9381
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009382TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009383 TEST_DESCRIPTION(
9384 "Attempt to update buffer descriptor set that has incorrect "
9385 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
9386 "1. offset value greater than buffer size\n"
9387 "2. range value of 0\n"
9388 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009389 VkResult err;
9390
9391 ASSERT_NO_FATAL_FAILURE(InitState());
9392 VkDescriptorPoolSize ds_type_count = {};
9393 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9394 ds_type_count.descriptorCount = 1;
9395
9396 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9397 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9398 ds_pool_ci.pNext = NULL;
9399 ds_pool_ci.maxSets = 1;
9400 ds_pool_ci.poolSizeCount = 1;
9401 ds_pool_ci.pPoolSizes = &ds_type_count;
9402
9403 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009404 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009405 ASSERT_VK_SUCCESS(err);
9406
9407 // Create layout with single uniform buffer descriptor
9408 VkDescriptorSetLayoutBinding dsl_binding = {};
9409 dsl_binding.binding = 0;
9410 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9411 dsl_binding.descriptorCount = 1;
9412 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9413 dsl_binding.pImmutableSamplers = NULL;
9414
9415 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9416 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9417 ds_layout_ci.pNext = NULL;
9418 ds_layout_ci.bindingCount = 1;
9419 ds_layout_ci.pBindings = &dsl_binding;
9420 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009421 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009422 ASSERT_VK_SUCCESS(err);
9423
9424 VkDescriptorSet descriptor_set = {};
9425 VkDescriptorSetAllocateInfo alloc_info = {};
9426 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9427 alloc_info.descriptorSetCount = 1;
9428 alloc_info.descriptorPool = ds_pool;
9429 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009430 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009431 ASSERT_VK_SUCCESS(err);
9432
9433 // Create a buffer to be used for invalid updates
9434 VkBufferCreateInfo buff_ci = {};
9435 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9436 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9437 buff_ci.size = 256;
9438 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9439 VkBuffer buffer;
9440 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9441 ASSERT_VK_SUCCESS(err);
9442 // Have to bind memory to buffer before descriptor update
9443 VkMemoryAllocateInfo mem_alloc = {};
9444 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9445 mem_alloc.pNext = NULL;
9446 mem_alloc.allocationSize = 256;
9447 mem_alloc.memoryTypeIndex = 0;
9448
9449 VkMemoryRequirements mem_reqs;
9450 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009451 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009452 if (!pass) {
9453 vkDestroyBuffer(m_device->device(), buffer, NULL);
9454 return;
9455 }
9456
9457 VkDeviceMemory mem;
9458 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9459 ASSERT_VK_SUCCESS(err);
9460 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9461 ASSERT_VK_SUCCESS(err);
9462
9463 VkDescriptorBufferInfo buff_info = {};
9464 buff_info.buffer = buffer;
9465 // First make offset 1 larger than buffer size
9466 buff_info.offset = 257;
9467 buff_info.range = VK_WHOLE_SIZE;
9468 VkWriteDescriptorSet descriptor_write = {};
9469 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9470 descriptor_write.dstBinding = 0;
9471 descriptor_write.descriptorCount = 1;
9472 descriptor_write.pTexelBufferView = nullptr;
9473 descriptor_write.pBufferInfo = &buff_info;
9474 descriptor_write.pImageInfo = nullptr;
9475
9476 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9477 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009479
9480 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9481
9482 m_errorMonitor->VerifyFound();
9483 // Now cause error due to range of 0
9484 buff_info.offset = 0;
9485 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009487
9488 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9489
9490 m_errorMonitor->VerifyFound();
9491 // Now cause error due to range exceeding buffer size - offset
9492 buff_info.offset = 128;
9493 buff_info.range = 200;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009495
9496 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9497
9498 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009499 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009500 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9501 vkDestroyBuffer(m_device->device(), buffer, NULL);
9502 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9503 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9504}
9505
Tobin Ehlis845887e2017-02-02 19:01:44 -07009506TEST_F(VkLayerTest, DSBufferLimitErrors) {
9507 TEST_DESCRIPTION(
9508 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9509 "Test cases include:\n"
9510 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9511 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9512 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9513 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9514 VkResult err;
9515
9516 ASSERT_NO_FATAL_FAILURE(InitState());
9517 VkDescriptorPoolSize ds_type_count[2] = {};
9518 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9519 ds_type_count[0].descriptorCount = 1;
9520 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9521 ds_type_count[1].descriptorCount = 1;
9522
9523 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9524 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9525 ds_pool_ci.pNext = NULL;
9526 ds_pool_ci.maxSets = 1;
9527 ds_pool_ci.poolSizeCount = 2;
9528 ds_pool_ci.pPoolSizes = ds_type_count;
9529
9530 VkDescriptorPool ds_pool;
9531 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9532 ASSERT_VK_SUCCESS(err);
9533
9534 // Create layout with single uniform buffer & single storage buffer descriptor
9535 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9536 dsl_binding[0].binding = 0;
9537 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9538 dsl_binding[0].descriptorCount = 1;
9539 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9540 dsl_binding[0].pImmutableSamplers = NULL;
9541 dsl_binding[1].binding = 1;
9542 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9543 dsl_binding[1].descriptorCount = 1;
9544 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9545 dsl_binding[1].pImmutableSamplers = NULL;
9546
9547 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9548 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9549 ds_layout_ci.pNext = NULL;
9550 ds_layout_ci.bindingCount = 2;
9551 ds_layout_ci.pBindings = dsl_binding;
9552 VkDescriptorSetLayout ds_layout;
9553 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9554 ASSERT_VK_SUCCESS(err);
9555
9556 VkDescriptorSet descriptor_set = {};
9557 VkDescriptorSetAllocateInfo alloc_info = {};
9558 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9559 alloc_info.descriptorSetCount = 1;
9560 alloc_info.descriptorPool = ds_pool;
9561 alloc_info.pSetLayouts = &ds_layout;
9562 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9563 ASSERT_VK_SUCCESS(err);
9564
9565 // Create a buffer to be used for invalid updates
9566 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9567 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9568 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9569 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9570 VkBufferCreateInfo ub_ci = {};
9571 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9572 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9573 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9574 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9575 VkBuffer uniform_buffer;
9576 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9577 ASSERT_VK_SUCCESS(err);
9578 VkBufferCreateInfo sb_ci = {};
9579 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9580 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9581 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9582 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9583 VkBuffer storage_buffer;
9584 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9585 ASSERT_VK_SUCCESS(err);
9586 // Have to bind memory to buffer before descriptor update
9587 VkMemoryAllocateInfo mem_alloc = {};
9588 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9589 mem_alloc.pNext = NULL;
9590 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9591 mem_alloc.memoryTypeIndex = 0;
9592
9593 VkMemoryRequirements mem_reqs;
9594 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &mem_reqs);
9595 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9596 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &mem_reqs);
9597 pass &= m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9598 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009599 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009600 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009601 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9602 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009603 return;
9604 }
9605
9606 VkDeviceMemory mem;
9607 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009608 if (VK_SUCCESS != err) {
9609 printf("Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
9610 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9611 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9612 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9613 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9614 return;
9615 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009616 ASSERT_VK_SUCCESS(err);
9617 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9618 ASSERT_VK_SUCCESS(err);
9619 auto sb_offset = ub_ci.size + 1024;
9620 // Verify offset alignment, I know there's a bit trick to do this but it escapes me
9621 sb_offset = (sb_offset % mem_reqs.alignment) ? sb_offset - (sb_offset % mem_reqs.alignment) : sb_offset;
9622 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9623 ASSERT_VK_SUCCESS(err);
9624
9625 VkDescriptorBufferInfo buff_info = {};
9626 buff_info.buffer = uniform_buffer;
9627 buff_info.range = ub_ci.size; // This will exceed limit
9628 VkWriteDescriptorSet descriptor_write = {};
9629 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9630 descriptor_write.dstBinding = 0;
9631 descriptor_write.descriptorCount = 1;
9632 descriptor_write.pTexelBufferView = nullptr;
9633 descriptor_write.pBufferInfo = &buff_info;
9634 descriptor_write.pImageInfo = nullptr;
9635
9636 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9637 descriptor_write.dstSet = descriptor_set;
9638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9639 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9640 m_errorMonitor->VerifyFound();
9641
9642 // Reduce size of range to acceptable limit & cause offset error
9643 buff_info.range = max_ub_range;
9644 buff_info.offset = min_ub_align - 1;
9645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9646 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9647 m_errorMonitor->VerifyFound();
9648
9649 // Now break storage updates
9650 buff_info.buffer = storage_buffer;
9651 buff_info.range = sb_ci.size; // This will exceed limit
9652 buff_info.offset = 0; // Reset offset for this update
9653
9654 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9655 descriptor_write.dstBinding = 1;
9656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9657 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9658 m_errorMonitor->VerifyFound();
9659
9660 // Reduce size of range to acceptable limit & cause offset error
9661 buff_info.range = max_sb_range;
9662 buff_info.offset = min_sb_align - 1;
9663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9664 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9665 m_errorMonitor->VerifyFound();
9666
9667 vkFreeMemory(m_device->device(), mem, NULL);
9668 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9669 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9670 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9671 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9672}
9673
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009674TEST_F(VkLayerTest, DSAspectBitsErrors) {
9675 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9676 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009677 TEST_DESCRIPTION(
9678 "Attempt to update descriptor sets for images "
9679 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009680 VkResult err;
9681
9682 ASSERT_NO_FATAL_FAILURE(InitState());
9683 VkDescriptorPoolSize ds_type_count = {};
9684 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9685 ds_type_count.descriptorCount = 1;
9686
9687 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9688 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9689 ds_pool_ci.pNext = NULL;
9690 ds_pool_ci.maxSets = 5;
9691 ds_pool_ci.poolSizeCount = 1;
9692 ds_pool_ci.pPoolSizes = &ds_type_count;
9693
9694 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009695 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009696 ASSERT_VK_SUCCESS(err);
9697
9698 VkDescriptorSetLayoutBinding dsl_binding = {};
9699 dsl_binding.binding = 0;
9700 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9701 dsl_binding.descriptorCount = 1;
9702 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9703 dsl_binding.pImmutableSamplers = NULL;
9704
9705 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9706 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9707 ds_layout_ci.pNext = NULL;
9708 ds_layout_ci.bindingCount = 1;
9709 ds_layout_ci.pBindings = &dsl_binding;
9710 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009711 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009712 ASSERT_VK_SUCCESS(err);
9713
9714 VkDescriptorSet descriptor_set = {};
9715 VkDescriptorSetAllocateInfo alloc_info = {};
9716 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9717 alloc_info.descriptorSetCount = 1;
9718 alloc_info.descriptorPool = ds_pool;
9719 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009720 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009721 ASSERT_VK_SUCCESS(err);
9722
9723 // Create an image to be used for invalid updates
9724 VkImageCreateInfo image_ci = {};
9725 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9726 image_ci.imageType = VK_IMAGE_TYPE_2D;
9727 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9728 image_ci.extent.width = 64;
9729 image_ci.extent.height = 64;
9730 image_ci.extent.depth = 1;
9731 image_ci.mipLevels = 1;
9732 image_ci.arrayLayers = 1;
9733 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9734 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9735 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9736 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9737 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9738 VkImage image;
9739 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9740 ASSERT_VK_SUCCESS(err);
9741 // Bind memory to image
9742 VkMemoryRequirements mem_reqs;
9743 VkDeviceMemory image_mem;
9744 bool pass;
9745 VkMemoryAllocateInfo mem_alloc = {};
9746 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9747 mem_alloc.pNext = NULL;
9748 mem_alloc.allocationSize = 0;
9749 mem_alloc.memoryTypeIndex = 0;
9750 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9751 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009752 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009753 ASSERT_TRUE(pass);
9754 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9755 ASSERT_VK_SUCCESS(err);
9756 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9757 ASSERT_VK_SUCCESS(err);
9758 // Now create view for image
9759 VkImageViewCreateInfo image_view_ci = {};
9760 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9761 image_view_ci.image = image;
9762 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9763 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9764 image_view_ci.subresourceRange.layerCount = 1;
9765 image_view_ci.subresourceRange.baseArrayLayer = 0;
9766 image_view_ci.subresourceRange.levelCount = 1;
9767 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009768 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009769
9770 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009771 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009772 ASSERT_VK_SUCCESS(err);
9773
9774 VkDescriptorImageInfo img_info = {};
9775 img_info.imageView = image_view;
9776 VkWriteDescriptorSet descriptor_write = {};
9777 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9778 descriptor_write.dstBinding = 0;
9779 descriptor_write.descriptorCount = 1;
9780 descriptor_write.pTexelBufferView = NULL;
9781 descriptor_write.pBufferInfo = NULL;
9782 descriptor_write.pImageInfo = &img_info;
9783 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9784 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009785 const char *error_msg =
9786 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
9787 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009789
9790 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9791
9792 m_errorMonitor->VerifyFound();
9793 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9794 vkDestroyImage(m_device->device(), image, NULL);
9795 vkFreeMemory(m_device->device(), image_mem, NULL);
9796 vkDestroyImageView(m_device->device(), image_view, NULL);
9797 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9798 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9799}
9800
Karl Schultz6addd812016-02-02 17:17:23 -07009801TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009802 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07009803 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009804
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9806 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
9807 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009808
Tobin Ehlis3b780662015-05-28 12:11:26 -06009809 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009810 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009811 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009812 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9813 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009814
9815 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009816 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9817 ds_pool_ci.pNext = NULL;
9818 ds_pool_ci.maxSets = 1;
9819 ds_pool_ci.poolSizeCount = 1;
9820 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009821
Tobin Ehlis3b780662015-05-28 12:11:26 -06009822 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009823 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009824 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009825 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009826 dsl_binding.binding = 0;
9827 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9828 dsl_binding.descriptorCount = 1;
9829 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9830 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009831
Tony Barboureb254902015-07-15 12:50:33 -06009832 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009833 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9834 ds_layout_ci.pNext = NULL;
9835 ds_layout_ci.bindingCount = 1;
9836 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009837
Tobin Ehlis3b780662015-05-28 12:11:26 -06009838 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009839 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009840 ASSERT_VK_SUCCESS(err);
9841
9842 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009843 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009844 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009845 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009846 alloc_info.descriptorPool = ds_pool;
9847 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009848 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009849 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009850
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009851 VkSamplerCreateInfo sampler_ci = {};
9852 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9853 sampler_ci.pNext = NULL;
9854 sampler_ci.magFilter = VK_FILTER_NEAREST;
9855 sampler_ci.minFilter = VK_FILTER_NEAREST;
9856 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9857 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9858 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9859 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9860 sampler_ci.mipLodBias = 1.0;
9861 sampler_ci.anisotropyEnable = VK_FALSE;
9862 sampler_ci.maxAnisotropy = 1;
9863 sampler_ci.compareEnable = VK_FALSE;
9864 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9865 sampler_ci.minLod = 1.0;
9866 sampler_ci.maxLod = 1.0;
9867 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9868 sampler_ci.unnormalizedCoordinates = VK_FALSE;
9869 VkSampler sampler;
9870 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9871 ASSERT_VK_SUCCESS(err);
9872
9873 VkDescriptorImageInfo info = {};
9874 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009875
9876 VkWriteDescriptorSet descriptor_write;
9877 memset(&descriptor_write, 0, sizeof(descriptor_write));
9878 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009879 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009880 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009881 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009882 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009883 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009884
9885 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9886
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009887 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009888
Chia-I Wuf7458c52015-10-26 21:10:41 +08009889 vkDestroySampler(m_device->device(), sampler, NULL);
9890 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9891 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009892}
9893
Karl Schultz6addd812016-02-02 17:17:23 -07009894TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009895 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07009896 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009897
Tobin Ehlisf922ef82016-11-30 10:19:14 -07009898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009899
Tobin Ehlis3b780662015-05-28 12:11:26 -06009900 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009901 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009902 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009903 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9904 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009905
9906 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009907 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9908 ds_pool_ci.pNext = NULL;
9909 ds_pool_ci.maxSets = 1;
9910 ds_pool_ci.poolSizeCount = 1;
9911 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009912
Tobin Ehlis3b780662015-05-28 12:11:26 -06009913 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009914 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009915 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009916
Tony Barboureb254902015-07-15 12:50:33 -06009917 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009918 dsl_binding.binding = 0;
9919 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9920 dsl_binding.descriptorCount = 1;
9921 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9922 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009923
9924 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009925 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9926 ds_layout_ci.pNext = NULL;
9927 ds_layout_ci.bindingCount = 1;
9928 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009929
Tobin Ehlis3b780662015-05-28 12:11:26 -06009930 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009931 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009932 ASSERT_VK_SUCCESS(err);
9933
9934 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009935 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009936 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009937 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009938 alloc_info.descriptorPool = ds_pool;
9939 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009940 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009941 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009942
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009943 // Correctly update descriptor to avoid "NOT_UPDATED" error
9944 VkDescriptorBufferInfo buff_info = {};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009945 buff_info.buffer = VkBuffer(0); // Don't care about buffer handle for this test
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009946 buff_info.offset = 0;
9947 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009948
9949 VkWriteDescriptorSet descriptor_write;
9950 memset(&descriptor_write, 0, sizeof(descriptor_write));
9951 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009952 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009953 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08009954 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009955 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9956 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009957
9958 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9959
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009960 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009961
Chia-I Wuf7458c52015-10-26 21:10:41 +08009962 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9963 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009964}
9965
Karl Schultz6addd812016-02-02 17:17:23 -07009966TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009967 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -07009968 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009969
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009971
Tobin Ehlis3b780662015-05-28 12:11:26 -06009972 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009973 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009974 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009975 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9976 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009977
9978 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009979 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9980 ds_pool_ci.pNext = NULL;
9981 ds_pool_ci.maxSets = 1;
9982 ds_pool_ci.poolSizeCount = 1;
9983 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009984
Tobin Ehlis3b780662015-05-28 12:11:26 -06009985 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009986 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009987 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009988
Tony Barboureb254902015-07-15 12:50:33 -06009989 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009990 dsl_binding.binding = 0;
9991 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9992 dsl_binding.descriptorCount = 1;
9993 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9994 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009995
9996 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009997 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9998 ds_layout_ci.pNext = NULL;
9999 ds_layout_ci.bindingCount = 1;
10000 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010001 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010002 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010003 ASSERT_VK_SUCCESS(err);
10004
10005 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010006 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010007 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010008 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010009 alloc_info.descriptorPool = ds_pool;
10010 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010011 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010012 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010013
Tony Barboureb254902015-07-15 12:50:33 -060010014 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010015 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10016 sampler_ci.pNext = NULL;
10017 sampler_ci.magFilter = VK_FILTER_NEAREST;
10018 sampler_ci.minFilter = VK_FILTER_NEAREST;
10019 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10020 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10021 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10022 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10023 sampler_ci.mipLodBias = 1.0;
10024 sampler_ci.anisotropyEnable = VK_FALSE;
10025 sampler_ci.maxAnisotropy = 1;
10026 sampler_ci.compareEnable = VK_FALSE;
10027 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10028 sampler_ci.minLod = 1.0;
10029 sampler_ci.maxLod = 1.0;
10030 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10031 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010032
Tobin Ehlis3b780662015-05-28 12:11:26 -060010033 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010034 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010035 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010036
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010037 VkDescriptorImageInfo info = {};
10038 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010039
10040 VkWriteDescriptorSet descriptor_write;
10041 memset(&descriptor_write, 0, sizeof(descriptor_write));
10042 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010043 descriptor_write.dstSet = descriptorSet;
10044 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010045 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010046 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010047 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010048 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010049
10050 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10051
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010052 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010053
Chia-I Wuf7458c52015-10-26 21:10:41 +080010054 vkDestroySampler(m_device->device(), sampler, NULL);
10055 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10056 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010057}
10058
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010059TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10060 // Create layout w/ empty binding and attempt to update it
10061 VkResult err;
10062
10063 ASSERT_NO_FATAL_FAILURE(InitState());
10064
10065 VkDescriptorPoolSize ds_type_count = {};
10066 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10067 ds_type_count.descriptorCount = 1;
10068
10069 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10070 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10071 ds_pool_ci.pNext = NULL;
10072 ds_pool_ci.maxSets = 1;
10073 ds_pool_ci.poolSizeCount = 1;
10074 ds_pool_ci.pPoolSizes = &ds_type_count;
10075
10076 VkDescriptorPool ds_pool;
10077 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10078 ASSERT_VK_SUCCESS(err);
10079
10080 VkDescriptorSetLayoutBinding dsl_binding = {};
10081 dsl_binding.binding = 0;
10082 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10083 dsl_binding.descriptorCount = 0;
10084 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10085 dsl_binding.pImmutableSamplers = NULL;
10086
10087 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10088 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10089 ds_layout_ci.pNext = NULL;
10090 ds_layout_ci.bindingCount = 1;
10091 ds_layout_ci.pBindings = &dsl_binding;
10092 VkDescriptorSetLayout ds_layout;
10093 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10094 ASSERT_VK_SUCCESS(err);
10095
10096 VkDescriptorSet descriptor_set;
10097 VkDescriptorSetAllocateInfo alloc_info = {};
10098 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10099 alloc_info.descriptorSetCount = 1;
10100 alloc_info.descriptorPool = ds_pool;
10101 alloc_info.pSetLayouts = &ds_layout;
10102 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10103 ASSERT_VK_SUCCESS(err);
10104
10105 VkSamplerCreateInfo sampler_ci = {};
10106 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10107 sampler_ci.magFilter = VK_FILTER_NEAREST;
10108 sampler_ci.minFilter = VK_FILTER_NEAREST;
10109 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10110 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10111 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10112 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10113 sampler_ci.mipLodBias = 1.0;
10114 sampler_ci.maxAnisotropy = 1;
10115 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10116 sampler_ci.minLod = 1.0;
10117 sampler_ci.maxLod = 1.0;
10118 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10119
10120 VkSampler sampler;
10121 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10122 ASSERT_VK_SUCCESS(err);
10123
10124 VkDescriptorImageInfo info = {};
10125 info.sampler = sampler;
10126
10127 VkWriteDescriptorSet descriptor_write;
10128 memset(&descriptor_write, 0, sizeof(descriptor_write));
10129 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10130 descriptor_write.dstSet = descriptor_set;
10131 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010132 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010133 // This is the wrong type, but empty binding error will be flagged first
10134 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10135 descriptor_write.pImageInfo = &info;
10136
10137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10138 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10139 m_errorMonitor->VerifyFound();
10140
10141 vkDestroySampler(m_device->device(), sampler, NULL);
10142 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10143 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10144}
10145
Karl Schultz6addd812016-02-02 17:17:23 -070010146TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10147 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10148 // types
10149 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010150
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010151 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 -060010152
Tobin Ehlis3b780662015-05-28 12:11:26 -060010153 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010154
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010155 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010156 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10157 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010158
10159 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010160 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10161 ds_pool_ci.pNext = NULL;
10162 ds_pool_ci.maxSets = 1;
10163 ds_pool_ci.poolSizeCount = 1;
10164 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010165
Tobin Ehlis3b780662015-05-28 12:11:26 -060010166 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010167 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010168 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010169 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010170 dsl_binding.binding = 0;
10171 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10172 dsl_binding.descriptorCount = 1;
10173 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10174 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010175
Tony Barboureb254902015-07-15 12:50:33 -060010176 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010177 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10178 ds_layout_ci.pNext = NULL;
10179 ds_layout_ci.bindingCount = 1;
10180 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010181
Tobin Ehlis3b780662015-05-28 12:11:26 -060010182 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010183 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010184 ASSERT_VK_SUCCESS(err);
10185
10186 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010187 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010188 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010189 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010190 alloc_info.descriptorPool = ds_pool;
10191 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010192 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010193 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010194
Tony Barboureb254902015-07-15 12:50:33 -060010195 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010196 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10197 sampler_ci.pNext = NULL;
10198 sampler_ci.magFilter = VK_FILTER_NEAREST;
10199 sampler_ci.minFilter = VK_FILTER_NEAREST;
10200 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10201 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10202 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10203 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10204 sampler_ci.mipLodBias = 1.0;
10205 sampler_ci.anisotropyEnable = VK_FALSE;
10206 sampler_ci.maxAnisotropy = 1;
10207 sampler_ci.compareEnable = VK_FALSE;
10208 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10209 sampler_ci.minLod = 1.0;
10210 sampler_ci.maxLod = 1.0;
10211 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10212 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010213 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010214 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010215 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010216
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010217 VkDescriptorImageInfo info = {};
10218 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010219
10220 VkWriteDescriptorSet descriptor_write;
10221 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010222 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010223 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010224 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010225 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010226 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010227 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010228
10229 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10230
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010231 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010232
Chia-I Wuf7458c52015-10-26 21:10:41 +080010233 vkDestroySampler(m_device->device(), sampler, NULL);
10234 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10235 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010236}
10237
Karl Schultz6addd812016-02-02 17:17:23 -070010238TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010239 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010240 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010241
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010243
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010244 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010245 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10246 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010247 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010248 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10249 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010250
10251 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010252 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10253 ds_pool_ci.pNext = NULL;
10254 ds_pool_ci.maxSets = 1;
10255 ds_pool_ci.poolSizeCount = 1;
10256 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010257
10258 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010259 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010260 ASSERT_VK_SUCCESS(err);
10261
10262 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010263 dsl_binding.binding = 0;
10264 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10265 dsl_binding.descriptorCount = 1;
10266 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10267 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010268
10269 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010270 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10271 ds_layout_ci.pNext = NULL;
10272 ds_layout_ci.bindingCount = 1;
10273 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010274 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010275 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010276 ASSERT_VK_SUCCESS(err);
10277
10278 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010279 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010280 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010281 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010282 alloc_info.descriptorPool = ds_pool;
10283 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010284 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010285 ASSERT_VK_SUCCESS(err);
10286
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010287 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010288
10289 VkDescriptorImageInfo descriptor_info;
10290 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10291 descriptor_info.sampler = sampler;
10292
10293 VkWriteDescriptorSet descriptor_write;
10294 memset(&descriptor_write, 0, sizeof(descriptor_write));
10295 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010296 descriptor_write.dstSet = descriptorSet;
10297 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010298 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010299 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10300 descriptor_write.pImageInfo = &descriptor_info;
10301
10302 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10303
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010304 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010305
Chia-I Wuf7458c52015-10-26 21:10:41 +080010306 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10307 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010308}
10309
Karl Schultz6addd812016-02-02 17:17:23 -070010310TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10311 // Create a single combined Image/Sampler descriptor and send it an invalid
10312 // imageView
10313 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010314
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010315 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010316
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010317 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010318 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010319 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10320 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010321
10322 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010323 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10324 ds_pool_ci.pNext = NULL;
10325 ds_pool_ci.maxSets = 1;
10326 ds_pool_ci.poolSizeCount = 1;
10327 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010328
10329 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010330 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010331 ASSERT_VK_SUCCESS(err);
10332
10333 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010334 dsl_binding.binding = 0;
10335 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10336 dsl_binding.descriptorCount = 1;
10337 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10338 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010339
10340 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010341 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10342 ds_layout_ci.pNext = NULL;
10343 ds_layout_ci.bindingCount = 1;
10344 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010345 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010346 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010347 ASSERT_VK_SUCCESS(err);
10348
10349 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010350 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010351 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010352 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010353 alloc_info.descriptorPool = ds_pool;
10354 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010355 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010356 ASSERT_VK_SUCCESS(err);
10357
10358 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010359 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10360 sampler_ci.pNext = NULL;
10361 sampler_ci.magFilter = VK_FILTER_NEAREST;
10362 sampler_ci.minFilter = VK_FILTER_NEAREST;
10363 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10364 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10365 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10366 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10367 sampler_ci.mipLodBias = 1.0;
10368 sampler_ci.anisotropyEnable = VK_FALSE;
10369 sampler_ci.maxAnisotropy = 1;
10370 sampler_ci.compareEnable = VK_FALSE;
10371 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10372 sampler_ci.minLod = 1.0;
10373 sampler_ci.maxLod = 1.0;
10374 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10375 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010376
10377 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010378 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010379 ASSERT_VK_SUCCESS(err);
10380
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010381 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010382
10383 VkDescriptorImageInfo descriptor_info;
10384 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10385 descriptor_info.sampler = sampler;
10386 descriptor_info.imageView = view;
10387
10388 VkWriteDescriptorSet descriptor_write;
10389 memset(&descriptor_write, 0, sizeof(descriptor_write));
10390 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010391 descriptor_write.dstSet = descriptorSet;
10392 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010393 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010394 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10395 descriptor_write.pImageInfo = &descriptor_info;
10396
10397 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10398
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010399 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010400
Chia-I Wuf7458c52015-10-26 21:10:41 +080010401 vkDestroySampler(m_device->device(), sampler, NULL);
10402 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10403 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010404}
10405
Karl Schultz6addd812016-02-02 17:17:23 -070010406TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10407 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10408 // into the other
10409 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010410
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10412 " binding #1 with type "
10413 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10414 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010415
Tobin Ehlis04356f92015-10-27 16:35:27 -060010416 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010417 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010418 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010419 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10420 ds_type_count[0].descriptorCount = 1;
10421 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10422 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010423
10424 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010425 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10426 ds_pool_ci.pNext = NULL;
10427 ds_pool_ci.maxSets = 1;
10428 ds_pool_ci.poolSizeCount = 2;
10429 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010430
10431 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010432 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010433 ASSERT_VK_SUCCESS(err);
10434 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010435 dsl_binding[0].binding = 0;
10436 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10437 dsl_binding[0].descriptorCount = 1;
10438 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10439 dsl_binding[0].pImmutableSamplers = NULL;
10440 dsl_binding[1].binding = 1;
10441 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10442 dsl_binding[1].descriptorCount = 1;
10443 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10444 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010445
10446 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010447 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10448 ds_layout_ci.pNext = NULL;
10449 ds_layout_ci.bindingCount = 2;
10450 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010451
10452 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010453 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010454 ASSERT_VK_SUCCESS(err);
10455
10456 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010457 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010458 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010459 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010460 alloc_info.descriptorPool = ds_pool;
10461 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010462 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010463 ASSERT_VK_SUCCESS(err);
10464
10465 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010466 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10467 sampler_ci.pNext = NULL;
10468 sampler_ci.magFilter = VK_FILTER_NEAREST;
10469 sampler_ci.minFilter = VK_FILTER_NEAREST;
10470 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10471 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10472 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10473 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10474 sampler_ci.mipLodBias = 1.0;
10475 sampler_ci.anisotropyEnable = VK_FALSE;
10476 sampler_ci.maxAnisotropy = 1;
10477 sampler_ci.compareEnable = VK_FALSE;
10478 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10479 sampler_ci.minLod = 1.0;
10480 sampler_ci.maxLod = 1.0;
10481 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10482 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010483
10484 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010485 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010486 ASSERT_VK_SUCCESS(err);
10487
10488 VkDescriptorImageInfo info = {};
10489 info.sampler = sampler;
10490
10491 VkWriteDescriptorSet descriptor_write;
10492 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10493 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010494 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010495 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010496 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010497 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10498 descriptor_write.pImageInfo = &info;
10499 // This write update should succeed
10500 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10501 // Now perform a copy update that fails due to type mismatch
10502 VkCopyDescriptorSet copy_ds_update;
10503 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10504 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10505 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010506 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010507 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010508 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10509 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010510 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10511
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010512 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010513 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010514 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 -060010515 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10516 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10517 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010518 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010519 copy_ds_update.dstSet = descriptorSet;
10520 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010521 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010522 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10523
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010524 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010525
Tobin Ehlis04356f92015-10-27 16:35:27 -060010526 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10528 " binding#1 with offset index of 1 plus "
10529 "update array offset of 0 and update of "
10530 "5 descriptors oversteps total number "
10531 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010532
Tobin Ehlis04356f92015-10-27 16:35:27 -060010533 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10534 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10535 copy_ds_update.srcSet = descriptorSet;
10536 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010537 copy_ds_update.dstSet = descriptorSet;
10538 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010539 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010540 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10541
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010542 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010543
Chia-I Wuf7458c52015-10-26 21:10:41 +080010544 vkDestroySampler(m_device->device(), sampler, NULL);
10545 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10546 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010547}
10548
Karl Schultz6addd812016-02-02 17:17:23 -070010549TEST_F(VkLayerTest, NumSamplesMismatch) {
10550 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10551 // sampleCount
10552 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010553
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010555
Tobin Ehlis3b780662015-05-28 12:11:26 -060010556 ASSERT_NO_FATAL_FAILURE(InitState());
10557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010558 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010559 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010560 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010561
10562 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010563 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10564 ds_pool_ci.pNext = NULL;
10565 ds_pool_ci.maxSets = 1;
10566 ds_pool_ci.poolSizeCount = 1;
10567 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010568
Tobin Ehlis3b780662015-05-28 12:11:26 -060010569 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010570 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010571 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010572
Tony Barboureb254902015-07-15 12:50:33 -060010573 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010574 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010575 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010576 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010577 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10578 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010579
Tony Barboureb254902015-07-15 12:50:33 -060010580 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10581 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10582 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010583 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010584 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010585
Tobin Ehlis3b780662015-05-28 12:11:26 -060010586 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010587 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010588 ASSERT_VK_SUCCESS(err);
10589
10590 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010591 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010592 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010593 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010594 alloc_info.descriptorPool = ds_pool;
10595 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010596 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010597 ASSERT_VK_SUCCESS(err);
10598
Tony Barboureb254902015-07-15 12:50:33 -060010599 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010600 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010601 pipe_ms_state_ci.pNext = NULL;
10602 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10603 pipe_ms_state_ci.sampleShadingEnable = 0;
10604 pipe_ms_state_ci.minSampleShading = 1.0;
10605 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010606
Tony Barboureb254902015-07-15 12:50:33 -060010607 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010608 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10609 pipeline_layout_ci.pNext = NULL;
10610 pipeline_layout_ci.setLayoutCount = 1;
10611 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010612
10613 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010614 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010615 ASSERT_VK_SUCCESS(err);
10616
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010617 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010618 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010619 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010620 VkPipelineObj pipe(m_device);
10621 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010622 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010623 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010624 pipe.SetMSAA(&pipe_ms_state_ci);
10625 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010626
Tony Barbour552f6c02016-12-21 14:34:07 -070010627 m_commandBuffer->BeginCommandBuffer();
10628 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010629 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010630
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010631 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10632 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10633 VkRect2D scissor = {{0, 0}, {16, 16}};
10634 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10635
Mark Young29927482016-05-04 14:38:51 -060010636 // Render triangle (the error should trigger on the attempt to draw).
10637 Draw(3, 1, 0, 0);
10638
10639 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010640 m_commandBuffer->EndRenderPass();
10641 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010642
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010643 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010644
Chia-I Wuf7458c52015-10-26 21:10:41 +080010645 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10646 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10647 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010648}
Mark Young29927482016-05-04 14:38:51 -060010649
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010650TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010651 TEST_DESCRIPTION(
10652 "Hit RenderPass incompatible cases. "
10653 "Initial case is drawing with an active renderpass that's "
10654 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010655 VkResult err;
10656
10657 ASSERT_NO_FATAL_FAILURE(InitState());
10658 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10659
10660 VkDescriptorSetLayoutBinding dsl_binding = {};
10661 dsl_binding.binding = 0;
10662 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10663 dsl_binding.descriptorCount = 1;
10664 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10665 dsl_binding.pImmutableSamplers = NULL;
10666
10667 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10668 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10669 ds_layout_ci.pNext = NULL;
10670 ds_layout_ci.bindingCount = 1;
10671 ds_layout_ci.pBindings = &dsl_binding;
10672
10673 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010674 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010675 ASSERT_VK_SUCCESS(err);
10676
10677 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10678 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10679 pipeline_layout_ci.pNext = NULL;
10680 pipeline_layout_ci.setLayoutCount = 1;
10681 pipeline_layout_ci.pSetLayouts = &ds_layout;
10682
10683 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010684 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010685 ASSERT_VK_SUCCESS(err);
10686
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010687 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010688 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010689 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010690 // Create a renderpass that will be incompatible with default renderpass
10691 VkAttachmentReference attach = {};
10692 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
10693 VkAttachmentReference color_att = {};
10694 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10695 VkSubpassDescription subpass = {};
10696 subpass.inputAttachmentCount = 1;
10697 subpass.pInputAttachments = &attach;
10698 subpass.colorAttachmentCount = 1;
10699 subpass.pColorAttachments = &color_att;
10700 VkRenderPassCreateInfo rpci = {};
10701 rpci.subpassCount = 1;
10702 rpci.pSubpasses = &subpass;
10703 rpci.attachmentCount = 1;
10704 VkAttachmentDescription attach_desc = {};
10705 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060010706 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
10707 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010708 rpci.pAttachments = &attach_desc;
10709 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
10710 VkRenderPass rp;
10711 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10712 VkPipelineObj pipe(m_device);
10713 pipe.AddShader(&vs);
10714 pipe.AddShader(&fs);
10715 pipe.AddColorAttachment();
10716 VkViewport view_port = {};
10717 m_viewports.push_back(view_port);
10718 pipe.SetViewport(m_viewports);
10719 VkRect2D rect = {};
10720 m_scissors.push_back(rect);
10721 pipe.SetScissor(m_scissors);
10722 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10723
10724 VkCommandBufferInheritanceInfo cbii = {};
10725 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
10726 cbii.renderPass = rp;
10727 cbii.subpass = 0;
10728 VkCommandBufferBeginInfo cbbi = {};
10729 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10730 cbbi.pInheritanceInfo = &cbii;
10731 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
10732 VkRenderPassBeginInfo rpbi = {};
10733 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10734 rpbi.framebuffer = m_framebuffer;
10735 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010736 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
10737 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010738
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010740 // Render triangle (the error should trigger on the attempt to draw).
10741 Draw(3, 1, 0, 0);
10742
10743 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010744 m_commandBuffer->EndRenderPass();
10745 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010746
10747 m_errorMonitor->VerifyFound();
10748
10749 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10750 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10751 vkDestroyRenderPass(m_device->device(), rp, NULL);
10752}
10753
Mark Youngc89c6312016-03-31 16:03:20 -060010754TEST_F(VkLayerTest, NumBlendAttachMismatch) {
10755 // Create Pipeline where the number of blend attachments doesn't match the
10756 // number of color attachments. In this case, we don't add any color
10757 // blend attachments even though we have a color attachment.
10758 VkResult err;
10759
Tobin Ehlis974c0d92017-02-01 13:31:22 -070010760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060010761
10762 ASSERT_NO_FATAL_FAILURE(InitState());
10763 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10764 VkDescriptorPoolSize ds_type_count = {};
10765 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10766 ds_type_count.descriptorCount = 1;
10767
10768 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10769 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10770 ds_pool_ci.pNext = NULL;
10771 ds_pool_ci.maxSets = 1;
10772 ds_pool_ci.poolSizeCount = 1;
10773 ds_pool_ci.pPoolSizes = &ds_type_count;
10774
10775 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010776 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060010777 ASSERT_VK_SUCCESS(err);
10778
10779 VkDescriptorSetLayoutBinding dsl_binding = {};
10780 dsl_binding.binding = 0;
10781 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10782 dsl_binding.descriptorCount = 1;
10783 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10784 dsl_binding.pImmutableSamplers = NULL;
10785
10786 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10787 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10788 ds_layout_ci.pNext = NULL;
10789 ds_layout_ci.bindingCount = 1;
10790 ds_layout_ci.pBindings = &dsl_binding;
10791
10792 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010793 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010794 ASSERT_VK_SUCCESS(err);
10795
10796 VkDescriptorSet descriptorSet;
10797 VkDescriptorSetAllocateInfo alloc_info = {};
10798 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10799 alloc_info.descriptorSetCount = 1;
10800 alloc_info.descriptorPool = ds_pool;
10801 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010802 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060010803 ASSERT_VK_SUCCESS(err);
10804
10805 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010806 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060010807 pipe_ms_state_ci.pNext = NULL;
10808 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10809 pipe_ms_state_ci.sampleShadingEnable = 0;
10810 pipe_ms_state_ci.minSampleShading = 1.0;
10811 pipe_ms_state_ci.pSampleMask = NULL;
10812
10813 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10814 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10815 pipeline_layout_ci.pNext = NULL;
10816 pipeline_layout_ci.setLayoutCount = 1;
10817 pipeline_layout_ci.pSetLayouts = &ds_layout;
10818
10819 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010820 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010821 ASSERT_VK_SUCCESS(err);
10822
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010823 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010824 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010825 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060010826 VkPipelineObj pipe(m_device);
10827 pipe.AddShader(&vs);
10828 pipe.AddShader(&fs);
10829 pipe.SetMSAA(&pipe_ms_state_ci);
10830 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010831 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060010832
10833 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10834 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10835 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10836}
Mark Young29927482016-05-04 14:38:51 -060010837
Mark Muellerd4914412016-06-13 17:52:06 -060010838TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010839 TEST_DESCRIPTION(
10840 "Points to a wrong colorAttachment index in a VkClearAttachment "
10841 "structure passed to vkCmdClearAttachments");
Cody Northropc31a84f2016-08-22 10:41:47 -060010842 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060010844
10845 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
10846 m_errorMonitor->VerifyFound();
10847}
10848
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010849TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010850 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
10851 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010852
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010853 ASSERT_NO_FATAL_FAILURE(InitState());
10854 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010855
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010856 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010857 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10858 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010859
10860 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010861 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10862 ds_pool_ci.pNext = NULL;
10863 ds_pool_ci.maxSets = 1;
10864 ds_pool_ci.poolSizeCount = 1;
10865 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010866
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010867 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010868 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010869 ASSERT_VK_SUCCESS(err);
10870
Tony Barboureb254902015-07-15 12:50:33 -060010871 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010872 dsl_binding.binding = 0;
10873 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10874 dsl_binding.descriptorCount = 1;
10875 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10876 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010877
Tony Barboureb254902015-07-15 12:50:33 -060010878 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010879 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10880 ds_layout_ci.pNext = NULL;
10881 ds_layout_ci.bindingCount = 1;
10882 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010883
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010884 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010885 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010886 ASSERT_VK_SUCCESS(err);
10887
10888 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010889 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010890 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010891 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010892 alloc_info.descriptorPool = ds_pool;
10893 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010894 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010895 ASSERT_VK_SUCCESS(err);
10896
Tony Barboureb254902015-07-15 12:50:33 -060010897 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010898 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010899 pipe_ms_state_ci.pNext = NULL;
10900 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10901 pipe_ms_state_ci.sampleShadingEnable = 0;
10902 pipe_ms_state_ci.minSampleShading = 1.0;
10903 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010904
Tony Barboureb254902015-07-15 12:50:33 -060010905 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010906 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10907 pipeline_layout_ci.pNext = NULL;
10908 pipeline_layout_ci.setLayoutCount = 1;
10909 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010910
10911 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010912 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010913 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010914
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010915 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060010916 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070010917 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010918 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010919
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010920 VkPipelineObj pipe(m_device);
10921 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010922 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010923 pipe.SetMSAA(&pipe_ms_state_ci);
10924 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010925
Tony Barbour552f6c02016-12-21 14:34:07 -070010926 m_commandBuffer->BeginCommandBuffer();
10927 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010928
Karl Schultz6addd812016-02-02 17:17:23 -070010929 // Main thing we care about for this test is that the VkImage obj we're
10930 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010931 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010932 VkClearAttachment color_attachment;
10933 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10934 color_attachment.clearValue.color.float32[0] = 1.0;
10935 color_attachment.clearValue.color.float32[1] = 1.0;
10936 color_attachment.clearValue.color.float32[2] = 1.0;
10937 color_attachment.clearValue.color.float32[3] = 1.0;
10938 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010939 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010940
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010941 // Call for full-sized FB Color attachment prior to issuing a Draw
10942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070010943 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010944 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010945 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010946
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010947 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
10948 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
10949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
10950 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
10951 m_errorMonitor->VerifyFound();
10952
10953 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
10954 clear_rect.layerCount = 2;
10955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
10956 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010957 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010958
Chia-I Wuf7458c52015-10-26 21:10:41 +080010959 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10960 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10961 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010962}
10963
Karl Schultz6addd812016-02-02 17:17:23 -070010964TEST_F(VkLayerTest, VtxBufferBadIndex) {
10965 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010966
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10968 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010969
Tobin Ehlis502480b2015-06-24 15:53:07 -060010970 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060010971 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060010972 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010973
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010974 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010975 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10976 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010977
10978 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010979 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10980 ds_pool_ci.pNext = NULL;
10981 ds_pool_ci.maxSets = 1;
10982 ds_pool_ci.poolSizeCount = 1;
10983 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010984
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010985 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010986 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010987 ASSERT_VK_SUCCESS(err);
10988
Tony Barboureb254902015-07-15 12:50:33 -060010989 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010990 dsl_binding.binding = 0;
10991 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10992 dsl_binding.descriptorCount = 1;
10993 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10994 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010995
Tony Barboureb254902015-07-15 12:50:33 -060010996 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010997 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10998 ds_layout_ci.pNext = NULL;
10999 ds_layout_ci.bindingCount = 1;
11000 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011001
Tobin Ehlis502480b2015-06-24 15:53:07 -060011002 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011003 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011004 ASSERT_VK_SUCCESS(err);
11005
11006 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011007 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011008 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011009 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011010 alloc_info.descriptorPool = ds_pool;
11011 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011012 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011013 ASSERT_VK_SUCCESS(err);
11014
Tony Barboureb254902015-07-15 12:50:33 -060011015 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011016 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011017 pipe_ms_state_ci.pNext = NULL;
11018 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11019 pipe_ms_state_ci.sampleShadingEnable = 0;
11020 pipe_ms_state_ci.minSampleShading = 1.0;
11021 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011022
Tony Barboureb254902015-07-15 12:50:33 -060011023 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011024 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11025 pipeline_layout_ci.pNext = NULL;
11026 pipeline_layout_ci.setLayoutCount = 1;
11027 pipeline_layout_ci.pSetLayouts = &ds_layout;
11028 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011029
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011030 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011031 ASSERT_VK_SUCCESS(err);
11032
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011033 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011034 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011035 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011036 VkPipelineObj pipe(m_device);
11037 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011038 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011039 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011040 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011041 pipe.SetViewport(m_viewports);
11042 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011043 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011044
Tony Barbour552f6c02016-12-21 14:34:07 -070011045 m_commandBuffer->BeginCommandBuffer();
11046 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011047 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011048 // Don't care about actual data, just need to get to draw to flag error
11049 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011050 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011051 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011052 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011053
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011054 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011055
Chia-I Wuf7458c52015-10-26 21:10:41 +080011056 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11057 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11058 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011059}
Mark Muellerdfe37552016-07-07 14:47:42 -060011060
Mark Mueller2ee294f2016-08-04 12:59:48 -060011061TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011062 TEST_DESCRIPTION(
11063 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11064 "Use invalid Queue Family Index in vkCreateDevice");
Cody Northropc31a84f2016-08-22 10:41:47 -060011065 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011066
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011067 const char *invalid_queueFamilyIndex_message =
11068 "Invalid queue create request in vkCreateDevice(). Invalid "
11069 "queueFamilyIndex ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011070
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011071 const char *unavailable_feature_message = "While calling vkCreateDevice(), requesting feature #";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011072
Mark Mueller880fce52016-08-17 15:23:23 -060011073 // The following test fails with recent NVidia drivers.
11074 // By the time core_validation is reached, the NVidia
11075 // driver has sanitized the invalid condition and core_validation
11076 // is not introduced to the failure condition. This is not the case
11077 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011078 // uint32_t count = static_cast<uint32_t>(~0);
11079 // VkPhysicalDevice physical_device;
11080 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11081 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011082
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queueFamilyIndex_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011084 float queue_priority = 0.0;
11085
11086 VkDeviceQueueCreateInfo queue_create_info = {};
11087 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11088 queue_create_info.queueCount = 1;
11089 queue_create_info.pQueuePriorities = &queue_priority;
11090 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11091
11092 VkPhysicalDeviceFeatures features = m_device->phy().features();
11093 VkDevice testDevice;
11094 VkDeviceCreateInfo device_create_info = {};
11095 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11096 device_create_info.queueCreateInfoCount = 1;
11097 device_create_info.pQueueCreateInfos = &queue_create_info;
11098 device_create_info.pEnabledFeatures = &features;
11099 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11100 m_errorMonitor->VerifyFound();
11101
11102 queue_create_info.queueFamilyIndex = 1;
11103
11104 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11105 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11106 for (unsigned i = 0; i < feature_count; i++) {
11107 if (VK_FALSE == feature_array[i]) {
11108 feature_array[i] = VK_TRUE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011109 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, unavailable_feature_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011110 device_create_info.pEnabledFeatures = &features;
11111 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11112 m_errorMonitor->VerifyFound();
11113 break;
11114 }
11115 }
11116}
11117
Tobin Ehlis16edf082016-11-21 12:33:49 -070011118TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11119 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11120
11121 ASSERT_NO_FATAL_FAILURE(InitState());
11122
11123 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11124 std::vector<VkDeviceQueueCreateInfo> queue_info;
11125 queue_info.reserve(queue_props.size());
11126 std::vector<std::vector<float>> queue_priorities;
11127 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11128 VkDeviceQueueCreateInfo qi{};
11129 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11130 qi.queueFamilyIndex = i;
11131 qi.queueCount = queue_props[i].queueCount;
11132 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11133 qi.pQueuePriorities = queue_priorities[i].data();
11134 queue_info.push_back(qi);
11135 }
11136
11137 std::vector<const char *> device_extension_names;
11138
11139 VkDevice local_device;
11140 VkDeviceCreateInfo device_create_info = {};
11141 auto features = m_device->phy().features();
11142 // Intentionally disable pipeline stats
11143 features.pipelineStatisticsQuery = VK_FALSE;
11144 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11145 device_create_info.pNext = NULL;
11146 device_create_info.queueCreateInfoCount = queue_info.size();
11147 device_create_info.pQueueCreateInfos = queue_info.data();
11148 device_create_info.enabledLayerCount = 0;
11149 device_create_info.ppEnabledLayerNames = NULL;
11150 device_create_info.pEnabledFeatures = &features;
11151 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11152 ASSERT_VK_SUCCESS(err);
11153
11154 VkQueryPoolCreateInfo qpci{};
11155 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11156 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11157 qpci.queryCount = 1;
11158 VkQueryPool query_pool;
11159
11160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11161 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11162 m_errorMonitor->VerifyFound();
11163
11164 vkDestroyDevice(local_device, nullptr);
11165}
11166
Mark Mueller2ee294f2016-08-04 12:59:48 -060011167TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011168 TEST_DESCRIPTION(
11169 "Use an invalid queue index in a vkCmdWaitEvents call."
11170 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011171
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011172 const char *invalid_queue_index =
11173 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11174 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11175 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011176
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011177 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011178
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011180
11181 ASSERT_NO_FATAL_FAILURE(InitState());
11182
11183 VkEvent event;
11184 VkEventCreateInfo event_create_info{};
11185 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11186 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11187
Mark Mueller2ee294f2016-08-04 12:59:48 -060011188 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011189 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011190
Tony Barbour552f6c02016-12-21 14:34:07 -070011191 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011192
11193 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011194 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 -060011195 ASSERT_TRUE(image.initialized());
11196 VkImageMemoryBarrier img_barrier = {};
11197 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11198 img_barrier.pNext = NULL;
11199 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11200 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11201 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11202 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11203 img_barrier.image = image.handle();
11204 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011205
11206 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11207 // that layer validation catches the case when it is not.
11208 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011209 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11210 img_barrier.subresourceRange.baseArrayLayer = 0;
11211 img_barrier.subresourceRange.baseMipLevel = 0;
11212 img_barrier.subresourceRange.layerCount = 1;
11213 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011214 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11215 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011216 m_errorMonitor->VerifyFound();
11217
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011219
11220 VkQueryPool query_pool;
11221 VkQueryPoolCreateInfo query_pool_create_info = {};
11222 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11223 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11224 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011225 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011226
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011227 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011228 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11229
11230 vkEndCommandBuffer(m_commandBuffer->handle());
11231 m_errorMonitor->VerifyFound();
11232
11233 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11234 vkDestroyEvent(m_device->device(), event, nullptr);
11235}
11236
Mark Muellerdfe37552016-07-07 14:47:42 -060011237TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011238 TEST_DESCRIPTION(
11239 "Submit a command buffer using deleted vertex buffer, "
11240 "delete a buffer twice, use an invalid offset for each "
11241 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011242
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011243 const char *deleted_buffer_in_command_buffer =
11244 "Cannot submit cmd buffer "
11245 "using deleted buffer ";
11246 const char *invalid_offset_message =
11247 "vkBindBufferMemory(): "
11248 "memoryOffset is 0x";
11249 const char *invalid_storage_buffer_offset_message =
11250 "vkBindBufferMemory(): "
11251 "storage memoryOffset "
11252 "is 0x";
11253 const char *invalid_texel_buffer_offset_message =
11254 "vkBindBufferMemory(): "
11255 "texel memoryOffset "
11256 "is 0x";
11257 const char *invalid_uniform_buffer_offset_message =
11258 "vkBindBufferMemory(): "
11259 "uniform memoryOffset "
11260 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011261
11262 ASSERT_NO_FATAL_FAILURE(InitState());
11263 ASSERT_NO_FATAL_FAILURE(InitViewport());
11264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11265
11266 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011267 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011268 pipe_ms_state_ci.pNext = NULL;
11269 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11270 pipe_ms_state_ci.sampleShadingEnable = 0;
11271 pipe_ms_state_ci.minSampleShading = 1.0;
11272 pipe_ms_state_ci.pSampleMask = nullptr;
11273
11274 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11275 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11276 VkPipelineLayout pipeline_layout;
11277
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011278 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011279 ASSERT_VK_SUCCESS(err);
11280
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011281 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11282 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011283 VkPipelineObj pipe(m_device);
11284 pipe.AddShader(&vs);
11285 pipe.AddShader(&fs);
11286 pipe.AddColorAttachment();
11287 pipe.SetMSAA(&pipe_ms_state_ci);
11288 pipe.SetViewport(m_viewports);
11289 pipe.SetScissor(m_scissors);
11290 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11291
Tony Barbour552f6c02016-12-21 14:34:07 -070011292 m_commandBuffer->BeginCommandBuffer();
11293 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011294 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011295
11296 {
11297 // Create and bind a vertex buffer in a reduced scope, which will cause
11298 // it to be deleted upon leaving this scope
11299 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011300 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011301 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11302 draw_verticies.AddVertexInputToPipe(pipe);
11303 }
11304
11305 Draw(1, 0, 0, 0);
11306
Tony Barbour552f6c02016-12-21 14:34:07 -070011307 m_commandBuffer->EndRenderPass();
11308 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011309
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011311 QueueCommandBuffer(false);
11312 m_errorMonitor->VerifyFound();
11313
11314 {
11315 // Create and bind a vertex buffer in a reduced scope, and delete it
11316 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011317 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011319 buffer_test.TestDoubleDestroy();
11320 }
11321 m_errorMonitor->VerifyFound();
11322
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011323 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011324 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
11326 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11327 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011328 m_errorMonitor->VerifyFound();
11329 }
11330
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011331 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11332 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011333 // Create and bind a memory buffer with an invalid offset again,
11334 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
11336 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11337 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011338 m_errorMonitor->VerifyFound();
11339 }
11340
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011341 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011342 // Create and bind a memory buffer with an invalid offset again, but
11343 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
11345 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11346 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011347 m_errorMonitor->VerifyFound();
11348 }
11349
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011350 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011351 // Create and bind a memory buffer with an invalid offset again, but
11352 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
11354 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11355 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011356 m_errorMonitor->VerifyFound();
11357 }
11358
11359 {
11360 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011362 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11363 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011364 m_errorMonitor->VerifyFound();
11365 }
11366
11367 {
11368 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011370 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11371 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011372 }
11373 m_errorMonitor->VerifyFound();
11374
11375 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11376}
11377
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011378// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11379TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011380 TEST_DESCRIPTION(
11381 "Hit all possible validation checks associated with the "
11382 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11383 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011384 // 3 in ValidateCmdBufImageLayouts
11385 // * -1 Attempt to submit cmd buf w/ deleted image
11386 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11387 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011388
11389 ASSERT_NO_FATAL_FAILURE(InitState());
11390 // Create src & dst images to use for copy operations
11391 VkImage src_image;
11392 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011393 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011394
11395 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11396 const int32_t tex_width = 32;
11397 const int32_t tex_height = 32;
11398
11399 VkImageCreateInfo image_create_info = {};
11400 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11401 image_create_info.pNext = NULL;
11402 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11403 image_create_info.format = tex_format;
11404 image_create_info.extent.width = tex_width;
11405 image_create_info.extent.height = tex_height;
11406 image_create_info.extent.depth = 1;
11407 image_create_info.mipLevels = 1;
11408 image_create_info.arrayLayers = 4;
11409 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11410 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11411 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011412 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011413 image_create_info.flags = 0;
11414
11415 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11416 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011417 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011418 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11419 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011420 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11421 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11422 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11423 ASSERT_VK_SUCCESS(err);
11424
11425 // Allocate memory
11426 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011427 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011428 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011429 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11430 mem_alloc.pNext = NULL;
11431 mem_alloc.allocationSize = 0;
11432 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011433
11434 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011435 mem_alloc.allocationSize = img_mem_reqs.size;
11436 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011437 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011438 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011439 ASSERT_VK_SUCCESS(err);
11440
11441 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011442 mem_alloc.allocationSize = img_mem_reqs.size;
11443 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011444 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011445 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011446 ASSERT_VK_SUCCESS(err);
11447
11448 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011449 mem_alloc.allocationSize = img_mem_reqs.size;
11450 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011451 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011452 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011453 ASSERT_VK_SUCCESS(err);
11454
11455 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11456 ASSERT_VK_SUCCESS(err);
11457 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11458 ASSERT_VK_SUCCESS(err);
11459 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11460 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011461
Tony Barbour552f6c02016-12-21 14:34:07 -070011462 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011463 VkImageCopy copy_region;
11464 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11465 copy_region.srcSubresource.mipLevel = 0;
11466 copy_region.srcSubresource.baseArrayLayer = 0;
11467 copy_region.srcSubresource.layerCount = 1;
11468 copy_region.srcOffset.x = 0;
11469 copy_region.srcOffset.y = 0;
11470 copy_region.srcOffset.z = 0;
11471 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11472 copy_region.dstSubresource.mipLevel = 0;
11473 copy_region.dstSubresource.baseArrayLayer = 0;
11474 copy_region.dstSubresource.layerCount = 1;
11475 copy_region.dstOffset.x = 0;
11476 copy_region.dstOffset.y = 0;
11477 copy_region.dstOffset.z = 0;
11478 copy_region.extent.width = 1;
11479 copy_region.extent.height = 1;
11480 copy_region.extent.depth = 1;
11481
11482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11483 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11484 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 -060011485 m_errorMonitor->VerifyFound();
11486 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11488 "Cannot copy from an image whose source layout is "
11489 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
11490 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011491 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 -060011492 m_errorMonitor->VerifyFound();
11493 // Final src error is due to bad layout type
11494 m_errorMonitor->SetDesiredFailureMsg(
11495 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11496 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011497 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 -060011498 m_errorMonitor->VerifyFound();
11499 // Now verify same checks for dst
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11501 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011502 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 -060011503 m_errorMonitor->VerifyFound();
11504 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11506 "Cannot copy from an image whose dest layout is "
11507 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
11508 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011509 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 -060011510 m_errorMonitor->VerifyFound();
11511 m_errorMonitor->SetDesiredFailureMsg(
11512 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11513 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011514 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 -060011515 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011516
Cort3b021012016-12-07 12:00:57 -080011517 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11518 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11519 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11520 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11521 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11522 transfer_dst_image_barrier[0].srcAccessMask = 0;
11523 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11524 transfer_dst_image_barrier[0].image = dst_image;
11525 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11526 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11527 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11528 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11529 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11530 transfer_dst_image_barrier[0].image = depth_image;
11531 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11532 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11533 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11534
11535 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011536 VkClearColorValue color_clear_value = {};
11537 VkImageSubresourceRange clear_range;
11538 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11539 clear_range.baseMipLevel = 0;
11540 clear_range.baseArrayLayer = 0;
11541 clear_range.layerCount = 1;
11542 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011543
Cort3b021012016-12-07 12:00:57 -080011544 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11545 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011548 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011549 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011550 // Fail due to provided layout not matching actual current layout for color clear.
11551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011552 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011553 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011554
Cort530cf382016-12-08 09:59:47 -080011555 VkClearDepthStencilValue depth_clear_value = {};
11556 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011557
11558 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11559 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011562 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011563 m_errorMonitor->VerifyFound();
11564 // Fail due to provided layout not matching actual current layout for depth clear.
11565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011566 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011567 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011568
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011569 // Now cause error due to bad image layout transition in PipelineBarrier
11570 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011571 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011572 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011573 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011574 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011575 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11576 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011577 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11579 "You cannot transition the layout of aspect 1 from "
11580 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when "
11581 "current layout is VK_IMAGE_LAYOUT_GENERAL.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011582 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11583 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011584 m_errorMonitor->VerifyFound();
11585
11586 // Finally some layout errors at RenderPass create time
11587 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11588 VkAttachmentReference attach = {};
11589 // perf warning for GENERAL layout w/ non-DS input attachment
11590 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11591 VkSubpassDescription subpass = {};
11592 subpass.inputAttachmentCount = 1;
11593 subpass.pInputAttachments = &attach;
11594 VkRenderPassCreateInfo rpci = {};
11595 rpci.subpassCount = 1;
11596 rpci.pSubpasses = &subpass;
11597 rpci.attachmentCount = 1;
11598 VkAttachmentDescription attach_desc = {};
11599 attach_desc.format = VK_FORMAT_UNDEFINED;
11600 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011601 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011602 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011603 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11604 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011605 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11606 m_errorMonitor->VerifyFound();
11607 // error w/ non-general layout
11608 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11609
11610 m_errorMonitor->SetDesiredFailureMsg(
11611 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11612 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11613 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11614 m_errorMonitor->VerifyFound();
11615 subpass.inputAttachmentCount = 0;
11616 subpass.colorAttachmentCount = 1;
11617 subpass.pColorAttachments = &attach;
11618 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11619 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11621 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011622 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11623 m_errorMonitor->VerifyFound();
11624 // error w/ non-color opt or GENERAL layout for color attachment
11625 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11626 m_errorMonitor->SetDesiredFailureMsg(
11627 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11628 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11629 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11630 m_errorMonitor->VerifyFound();
11631 subpass.colorAttachmentCount = 0;
11632 subpass.pDepthStencilAttachment = &attach;
11633 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11634 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11636 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011637 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11638 m_errorMonitor->VerifyFound();
11639 // error w/ non-ds opt or GENERAL layout for color attachment
11640 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11642 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
11643 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011644 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11645 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011646 // For this error we need a valid renderpass so create default one
11647 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11648 attach.attachment = 0;
11649 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
11650 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11651 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11652 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
11653 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11654 // Can't do a CLEAR load on READ_ONLY initialLayout
11655 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11656 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11657 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11659 " with invalid first layout "
11660 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
11661 "ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060011662 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11663 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011664
Cort3b021012016-12-07 12:00:57 -080011665 vkFreeMemory(m_device->device(), src_image_mem, NULL);
11666 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
11667 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011668 vkDestroyImage(m_device->device(), src_image, NULL);
11669 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080011670 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011671}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060011672
Tobin Ehlise0936662016-10-11 08:10:51 -060011673TEST_F(VkLayerTest, InvalidStorageImageLayout) {
11674 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
11675 VkResult err;
11676
11677 ASSERT_NO_FATAL_FAILURE(InitState());
11678
11679 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
11680 VkImageTiling tiling;
11681 VkFormatProperties format_properties;
11682 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
11683 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
11684 tiling = VK_IMAGE_TILING_LINEAR;
11685 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
11686 tiling = VK_IMAGE_TILING_OPTIMAL;
11687 } else {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011688 printf(
11689 "Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
11690 "skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060011691 return;
11692 }
11693
11694 VkDescriptorPoolSize ds_type = {};
11695 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11696 ds_type.descriptorCount = 1;
11697
11698 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11699 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11700 ds_pool_ci.maxSets = 1;
11701 ds_pool_ci.poolSizeCount = 1;
11702 ds_pool_ci.pPoolSizes = &ds_type;
11703 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
11704
11705 VkDescriptorPool ds_pool;
11706 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11707 ASSERT_VK_SUCCESS(err);
11708
11709 VkDescriptorSetLayoutBinding dsl_binding = {};
11710 dsl_binding.binding = 0;
11711 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11712 dsl_binding.descriptorCount = 1;
11713 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11714 dsl_binding.pImmutableSamplers = NULL;
11715
11716 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11717 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11718 ds_layout_ci.pNext = NULL;
11719 ds_layout_ci.bindingCount = 1;
11720 ds_layout_ci.pBindings = &dsl_binding;
11721
11722 VkDescriptorSetLayout ds_layout;
11723 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11724 ASSERT_VK_SUCCESS(err);
11725
11726 VkDescriptorSetAllocateInfo alloc_info = {};
11727 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11728 alloc_info.descriptorSetCount = 1;
11729 alloc_info.descriptorPool = ds_pool;
11730 alloc_info.pSetLayouts = &ds_layout;
11731 VkDescriptorSet descriptor_set;
11732 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11733 ASSERT_VK_SUCCESS(err);
11734
11735 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11736 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11737 pipeline_layout_ci.pNext = NULL;
11738 pipeline_layout_ci.setLayoutCount = 1;
11739 pipeline_layout_ci.pSetLayouts = &ds_layout;
11740 VkPipelineLayout pipeline_layout;
11741 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11742 ASSERT_VK_SUCCESS(err);
11743
11744 VkImageObj image(m_device);
11745 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
11746 ASSERT_TRUE(image.initialized());
11747 VkImageView view = image.targetView(tex_format);
11748
11749 VkDescriptorImageInfo image_info = {};
11750 image_info.imageView = view;
11751 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11752
11753 VkWriteDescriptorSet descriptor_write = {};
11754 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11755 descriptor_write.dstSet = descriptor_set;
11756 descriptor_write.dstBinding = 0;
11757 descriptor_write.descriptorCount = 1;
11758 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11759 descriptor_write.pImageInfo = &image_info;
11760
11761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11762 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
11763 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
11764 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11765 m_errorMonitor->VerifyFound();
11766
11767 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11768 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11769 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
11770 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11771}
11772
Mark Mueller93b938f2016-08-18 10:27:40 -060011773TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011774 TEST_DESCRIPTION(
11775 "Use vkCmdExecuteCommands with invalid state "
11776 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060011777
11778 ASSERT_NO_FATAL_FAILURE(InitState());
11779 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11780
Mike Weiblen95dd0f92016-10-19 12:28:27 -060011781 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011782 const char *simultaneous_use_message2 =
11783 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
11784 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060011785
11786 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011787 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060011788 command_buffer_allocate_info.commandPool = m_commandPool;
11789 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
11790 command_buffer_allocate_info.commandBufferCount = 1;
11791
11792 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011793 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060011794 VkCommandBufferBeginInfo command_buffer_begin_info = {};
11795 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011796 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060011797 command_buffer_inheritance_info.renderPass = m_renderPass;
11798 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011799
Mark Mueller93b938f2016-08-18 10:27:40 -060011800 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011801 command_buffer_begin_info.flags =
11802 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011803 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
11804
11805 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
11806 vkEndCommandBuffer(secondary_command_buffer);
11807
Mark Mueller93b938f2016-08-18 10:27:40 -060011808 VkSubmitInfo submit_info = {};
11809 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11810 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011811 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060011812
Mark Mueller4042b652016-09-05 22:52:21 -060011813 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011814 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
11815 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
11816 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011817 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011818 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011819 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11820 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060011821
Dave Houltonfbf52152017-01-06 12:55:29 -070011822 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060011823 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070011824 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060011825
Mark Mueller4042b652016-09-05 22:52:21 -060011826 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011827 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011828 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060011829
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
11831 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011832 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011833 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11834 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011835
11836 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller93b938f2016-08-18 10:27:40 -060011837}
11838
Tony Barbour626994c2017-02-08 15:29:37 -070011839TEST_F(VkLayerTest, SimultaneousUseOneShot) {
11840 TEST_DESCRIPTION(
11841 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
11842 "errors");
11843 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
11844 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
11845 ASSERT_NO_FATAL_FAILURE(InitState());
11846
11847 VkCommandBuffer cmd_bufs[2];
11848 VkCommandBufferAllocateInfo alloc_info;
11849 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
11850 alloc_info.pNext = NULL;
11851 alloc_info.commandBufferCount = 2;
11852 alloc_info.commandPool = m_commandPool;
11853 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
11854 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
11855
11856 VkCommandBufferBeginInfo cb_binfo;
11857 cb_binfo.pNext = NULL;
11858 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11859 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
11860 cb_binfo.flags = 0;
11861 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
11862 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11863 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
11864 vkEndCommandBuffer(cmd_bufs[0]);
11865 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
11866
11867 VkSubmitInfo submit_info = {};
11868 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11869 submit_info.commandBufferCount = 2;
11870 submit_info.pCommandBuffers = duplicates;
11871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
11872 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11873 m_errorMonitor->VerifyFound();
11874 vkQueueWaitIdle(m_device->m_queue);
11875
11876 // Set one time use and now look for one time submit
11877 duplicates[0] = duplicates[1] = cmd_bufs[1];
11878 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
11879 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
11880 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
11881 vkEndCommandBuffer(cmd_bufs[1]);
11882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
11883 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11884 m_errorMonitor->VerifyFound();
11885 vkQueueWaitIdle(m_device->m_queue);
11886}
11887
Tobin Ehlisb093da82017-01-19 12:05:27 -070011888TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011889 TEST_DESCRIPTION(
11890 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
11891 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070011892
11893 ASSERT_NO_FATAL_FAILURE(InitState());
11894 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11895
11896 std::vector<const char *> device_extension_names;
11897 auto features = m_device->phy().features();
11898 // Make sure gs & ts are disabled
11899 features.geometryShader = false;
11900 features.tessellationShader = false;
11901 // The sacrificial device object
11902 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
11903
11904 VkCommandPoolCreateInfo pool_create_info{};
11905 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
11906 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
11907
11908 VkCommandPool command_pool;
11909 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
11910
11911 VkCommandBufferAllocateInfo cmd = {};
11912 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
11913 cmd.pNext = NULL;
11914 cmd.commandPool = command_pool;
11915 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
11916 cmd.commandBufferCount = 1;
11917
11918 VkCommandBuffer cmd_buffer;
11919 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
11920 ASSERT_VK_SUCCESS(err);
11921
11922 VkEvent event;
11923 VkEventCreateInfo evci = {};
11924 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11925 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
11926 ASSERT_VK_SUCCESS(result);
11927
11928 VkCommandBufferBeginInfo cbbi = {};
11929 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11930 vkBeginCommandBuffer(cmd_buffer, &cbbi);
11931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
11932 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
11933 m_errorMonitor->VerifyFound();
11934
11935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
11936 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
11937 m_errorMonitor->VerifyFound();
11938
11939 vkDestroyEvent(test_device.handle(), event, NULL);
11940 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
11941}
11942
Mark Mueller917f6bc2016-08-30 10:57:19 -060011943TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011944 TEST_DESCRIPTION(
11945 "Use vkCmdExecuteCommands with invalid state "
11946 "in primary and secondary command buffers. "
11947 "Delete objects that are inuse. Call VkQueueSubmit "
11948 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060011949
11950 ASSERT_NO_FATAL_FAILURE(InitState());
11951 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11952
Tony Barbour552f6c02016-12-21 14:34:07 -070011953 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060011954
11955 VkEvent event;
11956 VkEventCreateInfo event_create_info = {};
11957 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11958 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011959 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011960
Tony Barbour552f6c02016-12-21 14:34:07 -070011961 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060011962 vkDestroyEvent(m_device->device(), event, nullptr);
11963
11964 VkSubmitInfo submit_info = {};
11965 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11966 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011967 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Jeremy Hayes1b082d72017-01-27 11:34:28 -070011968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted event 0x");
11969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You are submitting command buffer 0x");
Mark Muellerc8d441e2016-08-23 17:36:00 -060011970 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11971 m_errorMonitor->VerifyFound();
11972
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011973 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060011974 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
11975
11976 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11977
Mark Mueller917f6bc2016-08-30 10:57:19 -060011978 VkSemaphoreCreateInfo semaphore_create_info = {};
11979 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
11980 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011981 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011982 VkFenceCreateInfo fence_create_info = {};
11983 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
11984 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011985 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011986
11987 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011988 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011989 descriptor_pool_type_count.descriptorCount = 1;
11990
11991 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
11992 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11993 descriptor_pool_create_info.maxSets = 1;
11994 descriptor_pool_create_info.poolSizeCount = 1;
11995 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011996 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011997
11998 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011999 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012000
12001 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012002 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012003 descriptorset_layout_binding.descriptorCount = 1;
12004 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12005
12006 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012007 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012008 descriptorset_layout_create_info.bindingCount = 1;
12009 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12010
12011 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012012 ASSERT_VK_SUCCESS(
12013 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012014
12015 VkDescriptorSet descriptorset;
12016 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012017 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012018 descriptorset_allocate_info.descriptorSetCount = 1;
12019 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12020 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012021 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012022
Mark Mueller4042b652016-09-05 22:52:21 -060012023 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12024
12025 VkDescriptorBufferInfo buffer_info = {};
12026 buffer_info.buffer = buffer_test.GetBuffer();
12027 buffer_info.offset = 0;
12028 buffer_info.range = 1024;
12029
12030 VkWriteDescriptorSet write_descriptor_set = {};
12031 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12032 write_descriptor_set.dstSet = descriptorset;
12033 write_descriptor_set.descriptorCount = 1;
12034 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12035 write_descriptor_set.pBufferInfo = &buffer_info;
12036
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012037 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012038
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012039 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12040 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012041
12042 VkPipelineObj pipe(m_device);
12043 pipe.AddColorAttachment();
12044 pipe.AddShader(&vs);
12045 pipe.AddShader(&fs);
12046
12047 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012048 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012049 pipeline_layout_create_info.setLayoutCount = 1;
12050 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12051
12052 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012053 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012054
12055 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12056
Tony Barbour552f6c02016-12-21 14:34:07 -070012057 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012058 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012059
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012060 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12061 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12062 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012063
Tony Barbour552f6c02016-12-21 14:34:07 -070012064 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012065
Mark Mueller917f6bc2016-08-30 10:57:19 -060012066 submit_info.signalSemaphoreCount = 1;
12067 submit_info.pSignalSemaphores = &semaphore;
12068 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012069 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012070
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012072 vkDestroyEvent(m_device->device(), event, nullptr);
12073 m_errorMonitor->VerifyFound();
12074
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012076 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12077 m_errorMonitor->VerifyFound();
12078
Jeremy Hayes08369882017-02-02 10:31:06 -070012079 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012080 vkDestroyFence(m_device->device(), fence, nullptr);
12081 m_errorMonitor->VerifyFound();
12082
Tobin Ehlis122207b2016-09-01 08:50:06 -070012083 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012084 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12085 vkDestroyFence(m_device->device(), fence, nullptr);
12086 vkDestroyEvent(m_device->device(), event, nullptr);
12087 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012088 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012089 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12090}
12091
Tobin Ehlis2adda372016-09-01 08:51:06 -070012092TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12093 TEST_DESCRIPTION("Delete in-use query pool.");
12094
12095 ASSERT_NO_FATAL_FAILURE(InitState());
12096 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12097
12098 VkQueryPool query_pool;
12099 VkQueryPoolCreateInfo query_pool_ci{};
12100 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12101 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12102 query_pool_ci.queryCount = 1;
12103 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012104 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012105 // Reset query pool to create binding with cmd buffer
12106 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12107
Tony Barbour552f6c02016-12-21 14:34:07 -070012108 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012109
12110 VkSubmitInfo submit_info = {};
12111 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12112 submit_info.commandBufferCount = 1;
12113 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12114 // Submit cmd buffer and then destroy query pool while in-flight
12115 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12116
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012118 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12119 m_errorMonitor->VerifyFound();
12120
12121 vkQueueWaitIdle(m_device->m_queue);
12122 // Now that cmd buffer done we can safely destroy query_pool
12123 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12124}
12125
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012126TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12127 TEST_DESCRIPTION("Delete in-use pipeline.");
12128
12129 ASSERT_NO_FATAL_FAILURE(InitState());
12130 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12131
12132 // Empty pipeline layout used for binding PSO
12133 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12134 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12135 pipeline_layout_ci.setLayoutCount = 0;
12136 pipeline_layout_ci.pSetLayouts = NULL;
12137
12138 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012139 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012140 ASSERT_VK_SUCCESS(err);
12141
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012143 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012144 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12145 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012146 // Store pipeline handle so we can actually delete it before test finishes
12147 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012148 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012149 VkPipelineObj pipe(m_device);
12150 pipe.AddShader(&vs);
12151 pipe.AddShader(&fs);
12152 pipe.AddColorAttachment();
12153 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12154 delete_this_pipeline = pipe.handle();
12155
Tony Barbour552f6c02016-12-21 14:34:07 -070012156 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012157 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012158 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012159
Tony Barbour552f6c02016-12-21 14:34:07 -070012160 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012161
12162 VkSubmitInfo submit_info = {};
12163 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12164 submit_info.commandBufferCount = 1;
12165 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12166 // Submit cmd buffer and then pipeline destroyed while in-flight
12167 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012168 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012169 m_errorMonitor->VerifyFound();
12170 // Make sure queue finished and then actually delete pipeline
12171 vkQueueWaitIdle(m_device->m_queue);
12172 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12173 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12174}
12175
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012176TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12177 TEST_DESCRIPTION("Delete in-use imageView.");
12178
12179 ASSERT_NO_FATAL_FAILURE(InitState());
12180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12181
12182 VkDescriptorPoolSize ds_type_count;
12183 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12184 ds_type_count.descriptorCount = 1;
12185
12186 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12187 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12188 ds_pool_ci.maxSets = 1;
12189 ds_pool_ci.poolSizeCount = 1;
12190 ds_pool_ci.pPoolSizes = &ds_type_count;
12191
12192 VkDescriptorPool ds_pool;
12193 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12194 ASSERT_VK_SUCCESS(err);
12195
12196 VkSamplerCreateInfo sampler_ci = {};
12197 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12198 sampler_ci.pNext = NULL;
12199 sampler_ci.magFilter = VK_FILTER_NEAREST;
12200 sampler_ci.minFilter = VK_FILTER_NEAREST;
12201 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12202 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12203 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12204 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12205 sampler_ci.mipLodBias = 1.0;
12206 sampler_ci.anisotropyEnable = VK_FALSE;
12207 sampler_ci.maxAnisotropy = 1;
12208 sampler_ci.compareEnable = VK_FALSE;
12209 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12210 sampler_ci.minLod = 1.0;
12211 sampler_ci.maxLod = 1.0;
12212 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12213 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12214 VkSampler sampler;
12215
12216 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12217 ASSERT_VK_SUCCESS(err);
12218
12219 VkDescriptorSetLayoutBinding layout_binding;
12220 layout_binding.binding = 0;
12221 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12222 layout_binding.descriptorCount = 1;
12223 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12224 layout_binding.pImmutableSamplers = NULL;
12225
12226 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12227 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12228 ds_layout_ci.bindingCount = 1;
12229 ds_layout_ci.pBindings = &layout_binding;
12230 VkDescriptorSetLayout ds_layout;
12231 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12232 ASSERT_VK_SUCCESS(err);
12233
12234 VkDescriptorSetAllocateInfo alloc_info = {};
12235 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12236 alloc_info.descriptorSetCount = 1;
12237 alloc_info.descriptorPool = ds_pool;
12238 alloc_info.pSetLayouts = &ds_layout;
12239 VkDescriptorSet descriptor_set;
12240 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12241 ASSERT_VK_SUCCESS(err);
12242
12243 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12244 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12245 pipeline_layout_ci.pNext = NULL;
12246 pipeline_layout_ci.setLayoutCount = 1;
12247 pipeline_layout_ci.pSetLayouts = &ds_layout;
12248
12249 VkPipelineLayout pipeline_layout;
12250 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12251 ASSERT_VK_SUCCESS(err);
12252
12253 VkImageObj image(m_device);
12254 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12255 ASSERT_TRUE(image.initialized());
12256
12257 VkImageView view;
12258 VkImageViewCreateInfo ivci = {};
12259 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12260 ivci.image = image.handle();
12261 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12262 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12263 ivci.subresourceRange.layerCount = 1;
12264 ivci.subresourceRange.baseMipLevel = 0;
12265 ivci.subresourceRange.levelCount = 1;
12266 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12267
12268 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12269 ASSERT_VK_SUCCESS(err);
12270
12271 VkDescriptorImageInfo image_info{};
12272 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12273 image_info.imageView = view;
12274 image_info.sampler = sampler;
12275
12276 VkWriteDescriptorSet descriptor_write = {};
12277 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12278 descriptor_write.dstSet = descriptor_set;
12279 descriptor_write.dstBinding = 0;
12280 descriptor_write.descriptorCount = 1;
12281 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12282 descriptor_write.pImageInfo = &image_info;
12283
12284 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12285
12286 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012287 char const *vsSource =
12288 "#version 450\n"
12289 "\n"
12290 "out gl_PerVertex { \n"
12291 " vec4 gl_Position;\n"
12292 "};\n"
12293 "void main(){\n"
12294 " gl_Position = vec4(1);\n"
12295 "}\n";
12296 char const *fsSource =
12297 "#version 450\n"
12298 "\n"
12299 "layout(set=0, binding=0) uniform sampler2D s;\n"
12300 "layout(location=0) out vec4 x;\n"
12301 "void main(){\n"
12302 " x = texture(s, vec2(1));\n"
12303 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012304 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12305 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12306 VkPipelineObj pipe(m_device);
12307 pipe.AddShader(&vs);
12308 pipe.AddShader(&fs);
12309 pipe.AddColorAttachment();
12310 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12311
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012312 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012313
Tony Barbour552f6c02016-12-21 14:34:07 -070012314 m_commandBuffer->BeginCommandBuffer();
12315 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012316 // Bind pipeline to cmd buffer
12317 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12318 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12319 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012320
12321 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12322 VkRect2D scissor = {{0, 0}, {16, 16}};
12323 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12324 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12325
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012326 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012327 m_commandBuffer->EndRenderPass();
12328 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012329 // Submit cmd buffer then destroy sampler
12330 VkSubmitInfo submit_info = {};
12331 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12332 submit_info.commandBufferCount = 1;
12333 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12334 // Submit cmd buffer and then destroy imageView while in-flight
12335 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12336
12337 vkDestroyImageView(m_device->device(), view, nullptr);
12338 m_errorMonitor->VerifyFound();
12339 vkQueueWaitIdle(m_device->m_queue);
12340 // Now we can actually destroy imageView
12341 vkDestroyImageView(m_device->device(), view, NULL);
12342 vkDestroySampler(m_device->device(), sampler, nullptr);
12343 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12344 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12345 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12346}
12347
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012348TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12349 TEST_DESCRIPTION("Delete in-use bufferView.");
12350
12351 ASSERT_NO_FATAL_FAILURE(InitState());
12352 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12353
12354 VkDescriptorPoolSize ds_type_count;
12355 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12356 ds_type_count.descriptorCount = 1;
12357
12358 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12359 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12360 ds_pool_ci.maxSets = 1;
12361 ds_pool_ci.poolSizeCount = 1;
12362 ds_pool_ci.pPoolSizes = &ds_type_count;
12363
12364 VkDescriptorPool ds_pool;
12365 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12366 ASSERT_VK_SUCCESS(err);
12367
12368 VkDescriptorSetLayoutBinding layout_binding;
12369 layout_binding.binding = 0;
12370 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12371 layout_binding.descriptorCount = 1;
12372 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12373 layout_binding.pImmutableSamplers = NULL;
12374
12375 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12376 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12377 ds_layout_ci.bindingCount = 1;
12378 ds_layout_ci.pBindings = &layout_binding;
12379 VkDescriptorSetLayout ds_layout;
12380 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12381 ASSERT_VK_SUCCESS(err);
12382
12383 VkDescriptorSetAllocateInfo alloc_info = {};
12384 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12385 alloc_info.descriptorSetCount = 1;
12386 alloc_info.descriptorPool = ds_pool;
12387 alloc_info.pSetLayouts = &ds_layout;
12388 VkDescriptorSet descriptor_set;
12389 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12390 ASSERT_VK_SUCCESS(err);
12391
12392 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12393 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12394 pipeline_layout_ci.pNext = NULL;
12395 pipeline_layout_ci.setLayoutCount = 1;
12396 pipeline_layout_ci.pSetLayouts = &ds_layout;
12397
12398 VkPipelineLayout pipeline_layout;
12399 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12400 ASSERT_VK_SUCCESS(err);
12401
12402 VkBuffer buffer;
12403 uint32_t queue_family_index = 0;
12404 VkBufferCreateInfo buffer_create_info = {};
12405 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12406 buffer_create_info.size = 1024;
12407 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12408 buffer_create_info.queueFamilyIndexCount = 1;
12409 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12410
12411 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12412 ASSERT_VK_SUCCESS(err);
12413
12414 VkMemoryRequirements memory_reqs;
12415 VkDeviceMemory buffer_memory;
12416
12417 VkMemoryAllocateInfo memory_info = {};
12418 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12419 memory_info.allocationSize = 0;
12420 memory_info.memoryTypeIndex = 0;
12421
12422 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12423 memory_info.allocationSize = memory_reqs.size;
12424 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12425 ASSERT_TRUE(pass);
12426
12427 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12428 ASSERT_VK_SUCCESS(err);
12429 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12430 ASSERT_VK_SUCCESS(err);
12431
12432 VkBufferView view;
12433 VkBufferViewCreateInfo bvci = {};
12434 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12435 bvci.buffer = buffer;
12436 bvci.format = VK_FORMAT_R8_UNORM;
12437 bvci.range = VK_WHOLE_SIZE;
12438
12439 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12440 ASSERT_VK_SUCCESS(err);
12441
12442 VkWriteDescriptorSet descriptor_write = {};
12443 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12444 descriptor_write.dstSet = descriptor_set;
12445 descriptor_write.dstBinding = 0;
12446 descriptor_write.descriptorCount = 1;
12447 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12448 descriptor_write.pTexelBufferView = &view;
12449
12450 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12451
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012452 char const *vsSource =
12453 "#version 450\n"
12454 "\n"
12455 "out gl_PerVertex { \n"
12456 " vec4 gl_Position;\n"
12457 "};\n"
12458 "void main(){\n"
12459 " gl_Position = vec4(1);\n"
12460 "}\n";
12461 char const *fsSource =
12462 "#version 450\n"
12463 "\n"
12464 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12465 "layout(location=0) out vec4 x;\n"
12466 "void main(){\n"
12467 " x = imageLoad(s, 0);\n"
12468 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012469 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12470 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12471 VkPipelineObj pipe(m_device);
12472 pipe.AddShader(&vs);
12473 pipe.AddShader(&fs);
12474 pipe.AddColorAttachment();
12475 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12476
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012478
Tony Barbour552f6c02016-12-21 14:34:07 -070012479 m_commandBuffer->BeginCommandBuffer();
12480 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012481 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12482 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12483 VkRect2D scissor = {{0, 0}, {16, 16}};
12484 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12485 // Bind pipeline to cmd buffer
12486 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12487 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12488 &descriptor_set, 0, nullptr);
12489 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012490 m_commandBuffer->EndRenderPass();
12491 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012492
12493 VkSubmitInfo submit_info = {};
12494 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12495 submit_info.commandBufferCount = 1;
12496 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12497 // Submit cmd buffer and then destroy bufferView while in-flight
12498 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12499
12500 vkDestroyBufferView(m_device->device(), view, nullptr);
12501 m_errorMonitor->VerifyFound();
12502 vkQueueWaitIdle(m_device->m_queue);
12503 // Now we can actually destroy bufferView
12504 vkDestroyBufferView(m_device->device(), view, NULL);
12505 vkDestroyBuffer(m_device->device(), buffer, NULL);
12506 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12507 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12508 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12509 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12510}
12511
Tobin Ehlis209532e2016-09-07 13:52:18 -060012512TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12513 TEST_DESCRIPTION("Delete in-use sampler.");
12514
12515 ASSERT_NO_FATAL_FAILURE(InitState());
12516 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12517
12518 VkDescriptorPoolSize ds_type_count;
12519 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12520 ds_type_count.descriptorCount = 1;
12521
12522 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12523 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12524 ds_pool_ci.maxSets = 1;
12525 ds_pool_ci.poolSizeCount = 1;
12526 ds_pool_ci.pPoolSizes = &ds_type_count;
12527
12528 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012529 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012530 ASSERT_VK_SUCCESS(err);
12531
12532 VkSamplerCreateInfo sampler_ci = {};
12533 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12534 sampler_ci.pNext = NULL;
12535 sampler_ci.magFilter = VK_FILTER_NEAREST;
12536 sampler_ci.minFilter = VK_FILTER_NEAREST;
12537 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12538 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12539 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12540 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12541 sampler_ci.mipLodBias = 1.0;
12542 sampler_ci.anisotropyEnable = VK_FALSE;
12543 sampler_ci.maxAnisotropy = 1;
12544 sampler_ci.compareEnable = VK_FALSE;
12545 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12546 sampler_ci.minLod = 1.0;
12547 sampler_ci.maxLod = 1.0;
12548 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12549 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12550 VkSampler sampler;
12551
12552 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12553 ASSERT_VK_SUCCESS(err);
12554
12555 VkDescriptorSetLayoutBinding layout_binding;
12556 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012557 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012558 layout_binding.descriptorCount = 1;
12559 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12560 layout_binding.pImmutableSamplers = NULL;
12561
12562 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12563 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12564 ds_layout_ci.bindingCount = 1;
12565 ds_layout_ci.pBindings = &layout_binding;
12566 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012567 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012568 ASSERT_VK_SUCCESS(err);
12569
12570 VkDescriptorSetAllocateInfo alloc_info = {};
12571 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12572 alloc_info.descriptorSetCount = 1;
12573 alloc_info.descriptorPool = ds_pool;
12574 alloc_info.pSetLayouts = &ds_layout;
12575 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012576 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012577 ASSERT_VK_SUCCESS(err);
12578
12579 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12580 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12581 pipeline_layout_ci.pNext = NULL;
12582 pipeline_layout_ci.setLayoutCount = 1;
12583 pipeline_layout_ci.pSetLayouts = &ds_layout;
12584
12585 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012586 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012587 ASSERT_VK_SUCCESS(err);
12588
12589 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012590 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 -060012591 ASSERT_TRUE(image.initialized());
12592
12593 VkImageView view;
12594 VkImageViewCreateInfo ivci = {};
12595 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12596 ivci.image = image.handle();
12597 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12598 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12599 ivci.subresourceRange.layerCount = 1;
12600 ivci.subresourceRange.baseMipLevel = 0;
12601 ivci.subresourceRange.levelCount = 1;
12602 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12603
12604 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12605 ASSERT_VK_SUCCESS(err);
12606
12607 VkDescriptorImageInfo image_info{};
12608 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12609 image_info.imageView = view;
12610 image_info.sampler = sampler;
12611
12612 VkWriteDescriptorSet descriptor_write = {};
12613 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12614 descriptor_write.dstSet = descriptor_set;
12615 descriptor_write.dstBinding = 0;
12616 descriptor_write.descriptorCount = 1;
12617 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12618 descriptor_write.pImageInfo = &image_info;
12619
12620 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12621
12622 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012623 char const *vsSource =
12624 "#version 450\n"
12625 "\n"
12626 "out gl_PerVertex { \n"
12627 " vec4 gl_Position;\n"
12628 "};\n"
12629 "void main(){\n"
12630 " gl_Position = vec4(1);\n"
12631 "}\n";
12632 char const *fsSource =
12633 "#version 450\n"
12634 "\n"
12635 "layout(set=0, binding=0) uniform sampler2D s;\n"
12636 "layout(location=0) out vec4 x;\n"
12637 "void main(){\n"
12638 " x = texture(s, vec2(1));\n"
12639 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060012640 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12641 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12642 VkPipelineObj pipe(m_device);
12643 pipe.AddShader(&vs);
12644 pipe.AddShader(&fs);
12645 pipe.AddColorAttachment();
12646 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12647
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012649
Tony Barbour552f6c02016-12-21 14:34:07 -070012650 m_commandBuffer->BeginCommandBuffer();
12651 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012652 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012653 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12654 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12655 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070012656
12657 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12658 VkRect2D scissor = {{0, 0}, {16, 16}};
12659 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12660 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12661
Tobin Ehlis209532e2016-09-07 13:52:18 -060012662 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012663 m_commandBuffer->EndRenderPass();
12664 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060012665 // Submit cmd buffer then destroy sampler
12666 VkSubmitInfo submit_info = {};
12667 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12668 submit_info.commandBufferCount = 1;
12669 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12670 // Submit cmd buffer and then destroy sampler while in-flight
12671 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12672
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012673 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060012674 m_errorMonitor->VerifyFound();
12675 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070012676
Tobin Ehlis209532e2016-09-07 13:52:18 -060012677 // Now we can actually destroy sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012678 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060012679 vkDestroyImageView(m_device->device(), view, NULL);
12680 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12681 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12682 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12683}
12684
Mark Mueller1cd9f412016-08-25 13:23:52 -060012685TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012686 TEST_DESCRIPTION(
12687 "Call VkQueueSubmit with a semaphore that is already "
12688 "signaled but not waited on by the queue. Wait on a "
12689 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060012690
12691 ASSERT_NO_FATAL_FAILURE(InitState());
12692 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12693
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012694 const char *queue_forward_progress_message = " that has already been signaled but not waited on by queue 0x";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012695 const char *invalid_fence_wait_message =
12696 " which has not been submitted on a Queue or during "
12697 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060012698
Tony Barbour552f6c02016-12-21 14:34:07 -070012699 m_commandBuffer->BeginCommandBuffer();
12700 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060012701
12702 VkSemaphoreCreateInfo semaphore_create_info = {};
12703 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12704 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012705 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060012706 VkSubmitInfo submit_info = {};
12707 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12708 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012709 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060012710 submit_info.signalSemaphoreCount = 1;
12711 submit_info.pSignalSemaphores = &semaphore;
12712 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012713 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060012714 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070012715 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070012716 m_commandBuffer->BeginCommandBuffer();
12717 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060012719 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12720 m_errorMonitor->VerifyFound();
12721
Mark Mueller1cd9f412016-08-25 13:23:52 -060012722 VkFenceCreateInfo fence_create_info = {};
12723 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12724 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012725 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060012726
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060012728 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
12729 m_errorMonitor->VerifyFound();
12730
Mark Mueller4042b652016-09-05 22:52:21 -060012731 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060012732 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060012733 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12734}
12735
Tobin Ehlis4af23302016-07-19 10:50:30 -060012736TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012737 TEST_DESCRIPTION(
12738 "Bind a secondary command buffer with with a framebuffer "
12739 "that does not match the framebuffer for the active "
12740 "renderpass.");
Tobin Ehlis4af23302016-07-19 10:50:30 -060012741 ASSERT_NO_FATAL_FAILURE(InitState());
12742 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12743
12744 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012745 VkAttachmentDescription attachment = {0,
12746 VK_FORMAT_B8G8R8A8_UNORM,
12747 VK_SAMPLE_COUNT_1_BIT,
12748 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12749 VK_ATTACHMENT_STORE_OP_STORE,
12750 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12751 VK_ATTACHMENT_STORE_OP_DONT_CARE,
12752 VK_IMAGE_LAYOUT_UNDEFINED,
12753 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012754
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012755 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012756
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012757 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012758
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012759 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012760
12761 VkRenderPass rp;
12762 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
12763 ASSERT_VK_SUCCESS(err);
12764
12765 // A compatible framebuffer.
12766 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012767 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 -060012768 ASSERT_TRUE(image.initialized());
12769
12770 VkImageViewCreateInfo ivci = {
12771 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
12772 nullptr,
12773 0,
12774 image.handle(),
12775 VK_IMAGE_VIEW_TYPE_2D,
12776 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012777 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
12778 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060012779 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
12780 };
12781 VkImageView view;
12782 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
12783 ASSERT_VK_SUCCESS(err);
12784
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012785 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012786 VkFramebuffer fb;
12787 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
12788 ASSERT_VK_SUCCESS(err);
12789
12790 VkCommandBufferAllocateInfo cbai = {};
12791 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12792 cbai.commandPool = m_commandPool;
12793 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12794 cbai.commandBufferCount = 1;
12795
12796 VkCommandBuffer sec_cb;
12797 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
12798 ASSERT_VK_SUCCESS(err);
12799 VkCommandBufferBeginInfo cbbi = {};
12800 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130012801 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060012802 cbii.renderPass = renderPass();
12803 cbii.framebuffer = fb;
12804 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12805 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012806 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 -060012807 cbbi.pInheritanceInfo = &cbii;
12808 vkBeginCommandBuffer(sec_cb, &cbbi);
12809 vkEndCommandBuffer(sec_cb);
12810
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012811 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120012812 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
12813 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060012814
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012815 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060012816 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060012817 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
12818 m_errorMonitor->VerifyFound();
12819 // Cleanup
12820 vkDestroyImageView(m_device->device(), view, NULL);
12821 vkDestroyRenderPass(m_device->device(), rp, NULL);
12822 vkDestroyFramebuffer(m_device->device(), fb, NULL);
12823}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012824
12825TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012826 TEST_DESCRIPTION(
12827 "If logicOp is available on the device, set it to an "
12828 "invalid value. If logicOp is not available, attempt to "
12829 "use it and verify that we see the correct error.");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012830 ASSERT_NO_FATAL_FAILURE(InitState());
12831 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12832
12833 auto features = m_device->phy().features();
12834 // Set the expected error depending on whether or not logicOp available
12835 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12837 "If logic operations feature not "
12838 "enabled, logicOpEnable must be "
12839 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012840 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130012841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012842 }
12843 // Create a pipeline using logicOp
12844 VkResult err;
12845
12846 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12847 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12848
12849 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012850 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012851 ASSERT_VK_SUCCESS(err);
12852
12853 VkPipelineViewportStateCreateInfo vp_state_ci = {};
12854 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12855 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012856 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012857 vp_state_ci.pViewports = &vp;
12858 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012859 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012860 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012861
12862 VkPipelineShaderStageCreateInfo shaderStages[2];
12863 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
12864
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012865 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12866 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012867 shaderStages[0] = vs.GetStageCreateInfo();
12868 shaderStages[1] = fs.GetStageCreateInfo();
12869
12870 VkPipelineVertexInputStateCreateInfo vi_ci = {};
12871 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12872
12873 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
12874 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12875 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12876
12877 VkPipelineRasterizationStateCreateInfo rs_ci = {};
12878 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130012879 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012880
12881 VkPipelineColorBlendAttachmentState att = {};
12882 att.blendEnable = VK_FALSE;
12883 att.colorWriteMask = 0xf;
12884
12885 VkPipelineColorBlendStateCreateInfo cb_ci = {};
12886 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12887 // Enable logicOp & set logicOp to value 1 beyond allowed entries
12888 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012889 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012890 cb_ci.attachmentCount = 1;
12891 cb_ci.pAttachments = &att;
12892
Chris Forbes8aeacbf2016-10-03 14:25:08 +130012893 VkPipelineMultisampleStateCreateInfo ms_ci = {};
12894 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12895 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12896
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012897 VkGraphicsPipelineCreateInfo gp_ci = {};
12898 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12899 gp_ci.stageCount = 2;
12900 gp_ci.pStages = shaderStages;
12901 gp_ci.pVertexInputState = &vi_ci;
12902 gp_ci.pInputAssemblyState = &ia_ci;
12903 gp_ci.pViewportState = &vp_state_ci;
12904 gp_ci.pRasterizationState = &rs_ci;
12905 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130012906 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012907 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12908 gp_ci.layout = pipeline_layout;
12909 gp_ci.renderPass = renderPass();
12910
12911 VkPipelineCacheCreateInfo pc_ci = {};
12912 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12913
12914 VkPipeline pipeline;
12915 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012916 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012917 ASSERT_VK_SUCCESS(err);
12918
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012919 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012920 m_errorMonitor->VerifyFound();
12921 if (VK_SUCCESS == err) {
12922 vkDestroyPipeline(m_device->device(), pipeline, NULL);
12923 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012924 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
12925 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12926}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012927
Mike Stroyanaccf7692015-05-12 16:00:45 -060012928#if GTEST_IS_THREADSAFE
12929struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012930 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012931 VkEvent event;
12932 bool bailout;
12933};
12934
Karl Schultz6addd812016-02-02 17:17:23 -070012935extern "C" void *AddToCommandBuffer(void *arg) {
12936 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012937
Mike Stroyana6d14942016-07-13 15:10:05 -060012938 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012939 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012940 if (data->bailout) {
12941 break;
12942 }
12943 }
12944 return NULL;
12945}
12946
Karl Schultz6addd812016-02-02 17:17:23 -070012947TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012948 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012949
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012951
Mike Stroyanaccf7692015-05-12 16:00:45 -060012952 ASSERT_NO_FATAL_FAILURE(InitState());
12953 ASSERT_NO_FATAL_FAILURE(InitViewport());
12954 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12955
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012956 // Calls AllocateCommandBuffers
12957 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012958
12959 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012960 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012961
12962 VkEventCreateInfo event_info;
12963 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012964 VkResult err;
12965
12966 memset(&event_info, 0, sizeof(event_info));
12967 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12968
Chia-I Wuf7458c52015-10-26 21:10:41 +080012969 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012970 ASSERT_VK_SUCCESS(err);
12971
Mike Stroyanaccf7692015-05-12 16:00:45 -060012972 err = vkResetEvent(device(), event);
12973 ASSERT_VK_SUCCESS(err);
12974
12975 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012976 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012977 data.event = event;
12978 data.bailout = false;
12979 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060012980
12981 // First do some correct operations using multiple threads.
12982 // Add many entries to command buffer from another thread.
12983 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
12984 // Make non-conflicting calls from this thread at the same time.
12985 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060012986 uint32_t count;
12987 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060012988 }
12989 test_platform_thread_join(thread, NULL);
12990
12991 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060012992 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012993 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012994 // Add many entries to command buffer from this thread at the same time.
12995 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012996
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012997 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012998 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012999
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013000 m_errorMonitor->SetBailout(NULL);
13001
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013002 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013003
Chia-I Wuf7458c52015-10-26 21:10:41 +080013004 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013005}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013006#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013007
Karl Schultz6addd812016-02-02 17:17:23 -070013008TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013009 TEST_DESCRIPTION(
13010 "Test that an error is produced for a spirv module "
13011 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013012
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013014
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013015 ASSERT_NO_FATAL_FAILURE(InitState());
13016 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13017
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013018 VkShaderModule module;
13019 VkShaderModuleCreateInfo moduleCreateInfo;
13020 struct icd_spv_header spv;
13021
13022 spv.magic = ICD_SPV_MAGIC;
13023 spv.version = ICD_SPV_VERSION;
13024 spv.gen_magic = 0;
13025
13026 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13027 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013028 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013029 moduleCreateInfo.codeSize = 4;
13030 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013031 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013032
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013033 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013034}
13035
Karl Schultz6addd812016-02-02 17:17:23 -070013036TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013037 TEST_DESCRIPTION(
13038 "Test that an error is produced for a spirv module "
13039 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013040
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013042
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013043 ASSERT_NO_FATAL_FAILURE(InitState());
13044 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13045
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013046 VkShaderModule module;
13047 VkShaderModuleCreateInfo moduleCreateInfo;
13048 struct icd_spv_header spv;
13049
13050 spv.magic = ~ICD_SPV_MAGIC;
13051 spv.version = ICD_SPV_VERSION;
13052 spv.gen_magic = 0;
13053
13054 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13055 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013056 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013057 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13058 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013059 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013060
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013061 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013062}
13063
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013064#if 0
13065// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013066TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013068 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013069
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013070 ASSERT_NO_FATAL_FAILURE(InitState());
13071 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13072
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013073 VkShaderModule module;
13074 VkShaderModuleCreateInfo moduleCreateInfo;
13075 struct icd_spv_header spv;
13076
13077 spv.magic = ICD_SPV_MAGIC;
13078 spv.version = ~ICD_SPV_VERSION;
13079 spv.gen_magic = 0;
13080
13081 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13082 moduleCreateInfo.pNext = NULL;
13083
Karl Schultz6addd812016-02-02 17:17:23 -070013084 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013085 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13086 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013087 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013088
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013089 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013090}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013091#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013092
Karl Schultz6addd812016-02-02 17:17:23 -070013093TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013094 TEST_DESCRIPTION(
13095 "Test that a warning is produced for a vertex output that "
13096 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013098
Chris Forbes9f7ff632015-05-25 11:13:08 +120013099 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013101
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013102 char const *vsSource =
13103 "#version 450\n"
13104 "\n"
13105 "layout(location=0) out float x;\n"
13106 "out gl_PerVertex {\n"
13107 " vec4 gl_Position;\n"
13108 "};\n"
13109 "void main(){\n"
13110 " gl_Position = vec4(1);\n"
13111 " x = 0;\n"
13112 "}\n";
13113 char const *fsSource =
13114 "#version 450\n"
13115 "\n"
13116 "layout(location=0) out vec4 color;\n"
13117 "void main(){\n"
13118 " color = vec4(1);\n"
13119 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013120
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013121 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13122 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013123
13124 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013125 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013126 pipe.AddShader(&vs);
13127 pipe.AddShader(&fs);
13128
Chris Forbes9f7ff632015-05-25 11:13:08 +120013129 VkDescriptorSetObj descriptorSet(m_device);
13130 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013131 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013132
Tony Barbour5781e8f2015-08-04 16:23:11 -060013133 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013134
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013135 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013136}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013137
Mark Mueller098c9cb2016-09-08 09:01:57 -060013138TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13139 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13140
13141 ASSERT_NO_FATAL_FAILURE(InitState());
13142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13143
13144 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013145 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013146
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013147 char const *vsSource =
13148 "#version 450\n"
13149 "\n"
13150 "out gl_PerVertex {\n"
13151 " vec4 gl_Position;\n"
13152 "};\n"
13153 "void main(){\n"
13154 " gl_Position = vec4(1);\n"
13155 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013156
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013157 char const *fsSource =
13158 "#version 450\n"
13159 "\n"
13160 "layout (constant_id = 0) const float r = 0.0f;\n"
13161 "layout(location = 0) out vec4 uFragColor;\n"
13162 "void main(){\n"
13163 " uFragColor = vec4(r,1,0,1);\n"
13164 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013165
13166 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13167 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13168
13169 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13170 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13171
13172 VkPipelineLayout pipeline_layout;
13173 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13174
13175 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13176 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13177 vp_state_create_info.viewportCount = 1;
13178 VkViewport viewport = {};
13179 vp_state_create_info.pViewports = &viewport;
13180 vp_state_create_info.scissorCount = 1;
13181 VkRect2D scissors = {};
13182 vp_state_create_info.pScissors = &scissors;
13183
13184 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13185
13186 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13187 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13188 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13189 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13190
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013191 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013192
13193 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13194 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13195
13196 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13197 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13198 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13199
13200 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13201 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13202 rasterization_state_create_info.pNext = nullptr;
13203 rasterization_state_create_info.lineWidth = 1.0f;
13204 rasterization_state_create_info.rasterizerDiscardEnable = true;
13205
13206 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13207 color_blend_attachment_state.blendEnable = VK_FALSE;
13208 color_blend_attachment_state.colorWriteMask = 0xf;
13209
13210 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13211 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13212 color_blend_state_create_info.attachmentCount = 1;
13213 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13214
13215 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13216 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13217 graphicspipe_create_info.stageCount = 2;
13218 graphicspipe_create_info.pStages = shader_stage_create_info;
13219 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13220 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13221 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13222 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13223 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13224 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13225 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13226 graphicspipe_create_info.layout = pipeline_layout;
13227 graphicspipe_create_info.renderPass = renderPass();
13228
13229 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13230 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13231
13232 VkPipelineCache pipelineCache;
13233 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13234
13235 // This structure maps constant ids to data locations.
13236 const VkSpecializationMapEntry entry =
13237 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013238 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013239
13240 uint32_t data = 1;
13241
13242 // Set up the info describing spec map and data
13243 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013244 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013245 };
13246 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13247
13248 VkPipeline pipeline;
13249 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13250 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13251 m_errorMonitor->VerifyFound();
13252
13253 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13254 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13255}
13256
13257TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13258 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13259
13260 ASSERT_NO_FATAL_FAILURE(InitState());
13261 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13262
13263 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13264
13265 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13266 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13267 descriptor_pool_type_count[0].descriptorCount = 1;
13268 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13269 descriptor_pool_type_count[1].descriptorCount = 1;
13270
13271 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13272 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13273 descriptor_pool_create_info.maxSets = 1;
13274 descriptor_pool_create_info.poolSizeCount = 2;
13275 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13276 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13277
13278 VkDescriptorPool descriptorset_pool;
13279 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13280
13281 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13282 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13283 descriptorset_layout_binding.descriptorCount = 1;
13284 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
13285
13286 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13287 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13288 descriptorset_layout_create_info.bindingCount = 1;
13289 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13290
13291 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013292 ASSERT_VK_SUCCESS(
13293 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013294
13295 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13296 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13297 descriptorset_allocate_info.descriptorSetCount = 1;
13298 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13299 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13300 VkDescriptorSet descriptorset;
13301 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13302
13303 // Challenge core_validation with a non uniform buffer type.
13304 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13305
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013306 char const *vsSource =
13307 "#version 450\n"
13308 "\n"
13309 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13310 " mat4 mvp;\n"
13311 "} ubuf;\n"
13312 "out gl_PerVertex {\n"
13313 " vec4 gl_Position;\n"
13314 "};\n"
13315 "void main(){\n"
13316 " gl_Position = ubuf.mvp * vec4(1);\n"
13317 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013318
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013319 char const *fsSource =
13320 "#version 450\n"
13321 "\n"
13322 "layout(location = 0) out vec4 uFragColor;\n"
13323 "void main(){\n"
13324 " uFragColor = vec4(0,1,0,1);\n"
13325 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013326
13327 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13328 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13329
13330 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13331 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13332 pipeline_layout_create_info.setLayoutCount = 1;
13333 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13334
13335 VkPipelineLayout pipeline_layout;
13336 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13337
13338 VkPipelineObj pipe(m_device);
13339 pipe.AddColorAttachment();
13340 pipe.AddShader(&vs);
13341 pipe.AddShader(&fs);
13342
13343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13344 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13345 m_errorMonitor->VerifyFound();
13346
13347 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13348 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13349 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13350}
13351
13352TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13353 TEST_DESCRIPTION(
13354 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13355
13356 ASSERT_NO_FATAL_FAILURE(InitState());
13357 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13358
13359 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13360
13361 VkDescriptorPoolSize descriptor_pool_type_count = {};
13362 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13363 descriptor_pool_type_count.descriptorCount = 1;
13364
13365 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13366 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13367 descriptor_pool_create_info.maxSets = 1;
13368 descriptor_pool_create_info.poolSizeCount = 1;
13369 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13370 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13371
13372 VkDescriptorPool descriptorset_pool;
13373 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13374
13375 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13376 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13377 descriptorset_layout_binding.descriptorCount = 1;
13378 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13379 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13380
13381 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13382 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13383 descriptorset_layout_create_info.bindingCount = 1;
13384 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13385
13386 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013387 ASSERT_VK_SUCCESS(
13388 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013389
13390 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13391 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13392 descriptorset_allocate_info.descriptorSetCount = 1;
13393 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13394 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13395 VkDescriptorSet descriptorset;
13396 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13397
13398 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13399
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013400 char const *vsSource =
13401 "#version 450\n"
13402 "\n"
13403 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13404 " mat4 mvp;\n"
13405 "} ubuf;\n"
13406 "out gl_PerVertex {\n"
13407 " vec4 gl_Position;\n"
13408 "};\n"
13409 "void main(){\n"
13410 " gl_Position = ubuf.mvp * vec4(1);\n"
13411 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013412
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013413 char const *fsSource =
13414 "#version 450\n"
13415 "\n"
13416 "layout(location = 0) out vec4 uFragColor;\n"
13417 "void main(){\n"
13418 " uFragColor = vec4(0,1,0,1);\n"
13419 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013420
13421 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13422 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13423
13424 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13425 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13426 pipeline_layout_create_info.setLayoutCount = 1;
13427 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13428
13429 VkPipelineLayout pipeline_layout;
13430 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13431
13432 VkPipelineObj pipe(m_device);
13433 pipe.AddColorAttachment();
13434 pipe.AddShader(&vs);
13435 pipe.AddShader(&fs);
13436
13437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13438 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13439 m_errorMonitor->VerifyFound();
13440
13441 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13442 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13443 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13444}
13445
13446TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013447 TEST_DESCRIPTION(
13448 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13449 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013450
13451 ASSERT_NO_FATAL_FAILURE(InitState());
13452 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13453
13454 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013455 "Push constant range covering variable starting at offset 0 not accessible from stage VK_SHADER_STAGE_VERTEX_BIT";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013456
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013457 char const *vsSource =
13458 "#version 450\n"
13459 "\n"
13460 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13461 "out gl_PerVertex {\n"
13462 " vec4 gl_Position;\n"
13463 "};\n"
13464 "void main(){\n"
13465 " gl_Position = vec4(consts.x);\n"
13466 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013467
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013468 char const *fsSource =
13469 "#version 450\n"
13470 "\n"
13471 "layout(location = 0) out vec4 uFragColor;\n"
13472 "void main(){\n"
13473 " uFragColor = vec4(0,1,0,1);\n"
13474 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013475
13476 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13477 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13478
13479 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13480 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13481
13482 // Set up a push constant range
13483 VkPushConstantRange push_constant_ranges = {};
13484 // Set to the wrong stage to challenge core_validation
13485 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13486 push_constant_ranges.size = 4;
13487
13488 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13489 pipeline_layout_create_info.pushConstantRangeCount = 1;
13490
13491 VkPipelineLayout pipeline_layout;
13492 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13493
13494 VkPipelineObj pipe(m_device);
13495 pipe.AddColorAttachment();
13496 pipe.AddShader(&vs);
13497 pipe.AddShader(&fs);
13498
13499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13500 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13501 m_errorMonitor->VerifyFound();
13502
13503 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13504}
13505
13506TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13507 TEST_DESCRIPTION(
13508 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13509
13510 ASSERT_NO_FATAL_FAILURE(InitState());
13511 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13512
13513 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013514 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013515
13516 // Some awkward steps are required to test with custom device features.
13517 std::vector<const char *> device_extension_names;
13518 auto features = m_device->phy().features();
13519 // Disable support for 64 bit floats
13520 features.shaderFloat64 = false;
13521 // The sacrificial device object
13522 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13523
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013524 char const *vsSource =
13525 "#version 450\n"
13526 "\n"
13527 "out gl_PerVertex {\n"
13528 " vec4 gl_Position;\n"
13529 "};\n"
13530 "void main(){\n"
13531 " gl_Position = vec4(1);\n"
13532 "}\n";
13533 char const *fsSource =
13534 "#version 450\n"
13535 "\n"
13536 "layout(location=0) out vec4 color;\n"
13537 "void main(){\n"
13538 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13539 " color = vec4(green);\n"
13540 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013541
13542 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13543 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13544
13545 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013546
13547 VkPipelineObj pipe(&test_device);
13548 pipe.AddColorAttachment();
13549 pipe.AddShader(&vs);
13550 pipe.AddShader(&fs);
13551
13552 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13553 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13554 VkPipelineLayout pipeline_layout;
13555 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13556
13557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13558 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13559 m_errorMonitor->VerifyFound();
13560
13561 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13562}
13563
13564TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
13565 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
13566
13567 ASSERT_NO_FATAL_FAILURE(InitState());
13568 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13569
13570 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
13571
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013572 char const *vsSource =
13573 "#version 450\n"
13574 "\n"
13575 "out gl_PerVertex {\n"
13576 " vec4 gl_Position;\n"
13577 "};\n"
13578 "layout(xfb_buffer = 1) out;"
13579 "void main(){\n"
13580 " gl_Position = vec4(1);\n"
13581 "}\n";
13582 char const *fsSource =
13583 "#version 450\n"
13584 "\n"
13585 "layout(location=0) out vec4 color;\n"
13586 "void main(){\n"
13587 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13588 " color = vec4(green);\n"
13589 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013590
13591 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13592 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13593
13594 VkPipelineObj pipe(m_device);
13595 pipe.AddColorAttachment();
13596 pipe.AddShader(&vs);
13597 pipe.AddShader(&fs);
13598
13599 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13600 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13601 VkPipelineLayout pipeline_layout;
13602 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13603
13604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
13605 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13606 m_errorMonitor->VerifyFound();
13607
13608 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13609}
13610
Karl Schultz6addd812016-02-02 17:17:23 -070013611TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013612 TEST_DESCRIPTION(
13613 "Test that an error is produced for a fragment shader input "
13614 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120013615
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013617
Chris Forbes59cb88d2015-05-25 11:13:13 +120013618 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013619 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013620
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013621 char const *vsSource =
13622 "#version 450\n"
13623 "\n"
13624 "out gl_PerVertex {\n"
13625 " vec4 gl_Position;\n"
13626 "};\n"
13627 "void main(){\n"
13628 " gl_Position = vec4(1);\n"
13629 "}\n";
13630 char const *fsSource =
13631 "#version 450\n"
13632 "\n"
13633 "layout(location=0) in float x;\n"
13634 "layout(location=0) out vec4 color;\n"
13635 "void main(){\n"
13636 " color = vec4(x);\n"
13637 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120013638
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013639 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13640 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013641
13642 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013643 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013644 pipe.AddShader(&vs);
13645 pipe.AddShader(&fs);
13646
Chris Forbes59cb88d2015-05-25 11:13:13 +120013647 VkDescriptorSetObj descriptorSet(m_device);
13648 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013649 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013650
Tony Barbour5781e8f2015-08-04 16:23:11 -060013651 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013652
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013653 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013654}
13655
Karl Schultz6addd812016-02-02 17:17:23 -070013656TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013657 TEST_DESCRIPTION(
13658 "Test that an error is produced for a fragment shader input "
13659 "within an interace block, which is not present in the outputs "
13660 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013662
13663 ASSERT_NO_FATAL_FAILURE(InitState());
13664 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13665
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013666 char const *vsSource =
13667 "#version 450\n"
13668 "\n"
13669 "out gl_PerVertex {\n"
13670 " vec4 gl_Position;\n"
13671 "};\n"
13672 "void main(){\n"
13673 " gl_Position = vec4(1);\n"
13674 "}\n";
13675 char const *fsSource =
13676 "#version 450\n"
13677 "\n"
13678 "in block { layout(location=0) float x; } ins;\n"
13679 "layout(location=0) out vec4 color;\n"
13680 "void main(){\n"
13681 " color = vec4(ins.x);\n"
13682 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130013683
13684 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13685 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13686
13687 VkPipelineObj pipe(m_device);
13688 pipe.AddColorAttachment();
13689 pipe.AddShader(&vs);
13690 pipe.AddShader(&fs);
13691
13692 VkDescriptorSetObj descriptorSet(m_device);
13693 descriptorSet.AppendDummy();
13694 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13695
13696 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13697
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013698 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013699}
13700
Karl Schultz6addd812016-02-02 17:17:23 -070013701TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013702 TEST_DESCRIPTION(
13703 "Test that an error is produced for mismatched array sizes "
13704 "across the vertex->fragment shader interface");
13705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13706 "Type mismatch on location 0.0: 'ptr to "
13707 "output arr[2] of float32' vs 'ptr to "
13708 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130013709
13710 ASSERT_NO_FATAL_FAILURE(InitState());
13711 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13712
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013713 char const *vsSource =
13714 "#version 450\n"
13715 "\n"
13716 "layout(location=0) out float x[2];\n"
13717 "out gl_PerVertex {\n"
13718 " vec4 gl_Position;\n"
13719 "};\n"
13720 "void main(){\n"
13721 " x[0] = 0; x[1] = 0;\n"
13722 " gl_Position = vec4(1);\n"
13723 "}\n";
13724 char const *fsSource =
13725 "#version 450\n"
13726 "\n"
13727 "layout(location=0) in float x[1];\n"
13728 "layout(location=0) out vec4 color;\n"
13729 "void main(){\n"
13730 " color = vec4(x[0]);\n"
13731 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130013732
13733 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13734 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13735
13736 VkPipelineObj pipe(m_device);
13737 pipe.AddColorAttachment();
13738 pipe.AddShader(&vs);
13739 pipe.AddShader(&fs);
13740
13741 VkDescriptorSetObj descriptorSet(m_device);
13742 descriptorSet.AppendDummy();
13743 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13744
13745 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13746
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013747 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130013748}
13749
Karl Schultz6addd812016-02-02 17:17:23 -070013750TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013751 TEST_DESCRIPTION(
13752 "Test that an error is produced for mismatched types across "
13753 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013755
Chris Forbesb56af562015-05-25 11:13:17 +120013756 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013757 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120013758
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013759 char const *vsSource =
13760 "#version 450\n"
13761 "\n"
13762 "layout(location=0) out int x;\n"
13763 "out gl_PerVertex {\n"
13764 " vec4 gl_Position;\n"
13765 "};\n"
13766 "void main(){\n"
13767 " x = 0;\n"
13768 " gl_Position = vec4(1);\n"
13769 "}\n";
13770 char const *fsSource =
13771 "#version 450\n"
13772 "\n"
13773 "layout(location=0) in float x;\n" /* VS writes int */
13774 "layout(location=0) out vec4 color;\n"
13775 "void main(){\n"
13776 " color = vec4(x);\n"
13777 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120013778
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013779 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13780 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120013781
13782 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013783 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120013784 pipe.AddShader(&vs);
13785 pipe.AddShader(&fs);
13786
Chris Forbesb56af562015-05-25 11:13:17 +120013787 VkDescriptorSetObj descriptorSet(m_device);
13788 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013789 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120013790
Tony Barbour5781e8f2015-08-04 16:23:11 -060013791 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120013792
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013793 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120013794}
13795
Karl Schultz6addd812016-02-02 17:17:23 -070013796TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013797 TEST_DESCRIPTION(
13798 "Test that an error is produced for mismatched types across "
13799 "the vertex->fragment shader interface, when the variable is contained within "
13800 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013801 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013802
13803 ASSERT_NO_FATAL_FAILURE(InitState());
13804 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13805
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013806 char const *vsSource =
13807 "#version 450\n"
13808 "\n"
13809 "out block { layout(location=0) int x; } outs;\n"
13810 "out gl_PerVertex {\n"
13811 " vec4 gl_Position;\n"
13812 "};\n"
13813 "void main(){\n"
13814 " outs.x = 0;\n"
13815 " gl_Position = vec4(1);\n"
13816 "}\n";
13817 char const *fsSource =
13818 "#version 450\n"
13819 "\n"
13820 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
13821 "layout(location=0) out vec4 color;\n"
13822 "void main(){\n"
13823 " color = vec4(ins.x);\n"
13824 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130013825
13826 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13827 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13828
13829 VkPipelineObj pipe(m_device);
13830 pipe.AddColorAttachment();
13831 pipe.AddShader(&vs);
13832 pipe.AddShader(&fs);
13833
13834 VkDescriptorSetObj descriptorSet(m_device);
13835 descriptorSet.AppendDummy();
13836 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13837
13838 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13839
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013840 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013841}
13842
13843TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013844 TEST_DESCRIPTION(
13845 "Test that an error is produced for location mismatches across "
13846 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
13847 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013848 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 +130013849
13850 ASSERT_NO_FATAL_FAILURE(InitState());
13851 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13852
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013853 char const *vsSource =
13854 "#version 450\n"
13855 "\n"
13856 "out block { layout(location=1) float x; } outs;\n"
13857 "out gl_PerVertex {\n"
13858 " vec4 gl_Position;\n"
13859 "};\n"
13860 "void main(){\n"
13861 " outs.x = 0;\n"
13862 " gl_Position = vec4(1);\n"
13863 "}\n";
13864 char const *fsSource =
13865 "#version 450\n"
13866 "\n"
13867 "in block { layout(location=0) float x; } ins;\n"
13868 "layout(location=0) out vec4 color;\n"
13869 "void main(){\n"
13870 " color = vec4(ins.x);\n"
13871 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130013872
13873 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13874 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13875
13876 VkPipelineObj pipe(m_device);
13877 pipe.AddColorAttachment();
13878 pipe.AddShader(&vs);
13879 pipe.AddShader(&fs);
13880
13881 VkDescriptorSetObj descriptorSet(m_device);
13882 descriptorSet.AppendDummy();
13883 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13884
13885 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13886
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013887 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013888}
13889
13890TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013891 TEST_DESCRIPTION(
13892 "Test that an error is produced for component mismatches across the "
13893 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
13894 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013895 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 +130013896
13897 ASSERT_NO_FATAL_FAILURE(InitState());
13898 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13899
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013900 char const *vsSource =
13901 "#version 450\n"
13902 "\n"
13903 "out block { layout(location=0, component=0) float x; } outs;\n"
13904 "out gl_PerVertex {\n"
13905 " vec4 gl_Position;\n"
13906 "};\n"
13907 "void main(){\n"
13908 " outs.x = 0;\n"
13909 " gl_Position = vec4(1);\n"
13910 "}\n";
13911 char const *fsSource =
13912 "#version 450\n"
13913 "\n"
13914 "in block { layout(location=0, component=1) float x; } ins;\n"
13915 "layout(location=0) out vec4 color;\n"
13916 "void main(){\n"
13917 " color = vec4(ins.x);\n"
13918 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130013919
13920 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13921 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13922
13923 VkPipelineObj pipe(m_device);
13924 pipe.AddColorAttachment();
13925 pipe.AddShader(&vs);
13926 pipe.AddShader(&fs);
13927
13928 VkDescriptorSetObj descriptorSet(m_device);
13929 descriptorSet.AppendDummy();
13930 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13931
13932 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13933
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013934 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013935}
13936
Chris Forbes1f3b0152016-11-30 12:48:40 +130013937TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
13938 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
13939
13940 ASSERT_NO_FATAL_FAILURE(InitState());
13941 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13942
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013943 char const *vsSource =
13944 "#version 450\n"
13945 "layout(location=0) out mediump float x;\n"
13946 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13947 char const *fsSource =
13948 "#version 450\n"
13949 "layout(location=0) in highp float x;\n"
13950 "layout(location=0) out vec4 color;\n"
13951 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130013952
13953 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13954 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13955
13956 VkPipelineObj pipe(m_device);
13957 pipe.AddColorAttachment();
13958 pipe.AddShader(&vs);
13959 pipe.AddShader(&fs);
13960
13961 VkDescriptorSetObj descriptorSet(m_device);
13962 descriptorSet.AppendDummy();
13963 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13964
13965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
13966
13967 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13968
13969 m_errorMonitor->VerifyFound();
13970}
13971
Chris Forbes870a39e2016-11-30 12:55:56 +130013972TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
13973 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
13974
13975 ASSERT_NO_FATAL_FAILURE(InitState());
13976 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13977
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013978 char const *vsSource =
13979 "#version 450\n"
13980 "out block { layout(location=0) mediump float x; };\n"
13981 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13982 char const *fsSource =
13983 "#version 450\n"
13984 "in block { layout(location=0) highp float x; };\n"
13985 "layout(location=0) out vec4 color;\n"
13986 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130013987
13988 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13989 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13990
13991 VkPipelineObj pipe(m_device);
13992 pipe.AddColorAttachment();
13993 pipe.AddShader(&vs);
13994 pipe.AddShader(&fs);
13995
13996 VkDescriptorSetObj descriptorSet(m_device);
13997 descriptorSet.AppendDummy();
13998 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13999
14000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14001
14002 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14003
14004 m_errorMonitor->VerifyFound();
14005}
14006
Karl Schultz6addd812016-02-02 17:17:23 -070014007TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014008 TEST_DESCRIPTION(
14009 "Test that a warning is produced for a vertex attribute which is "
14010 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014012
Chris Forbesde136e02015-05-25 11:13:28 +120014013 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014014 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014015
14016 VkVertexInputBindingDescription input_binding;
14017 memset(&input_binding, 0, sizeof(input_binding));
14018
14019 VkVertexInputAttributeDescription input_attrib;
14020 memset(&input_attrib, 0, sizeof(input_attrib));
14021 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14022
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014023 char const *vsSource =
14024 "#version 450\n"
14025 "\n"
14026 "out gl_PerVertex {\n"
14027 " vec4 gl_Position;\n"
14028 "};\n"
14029 "void main(){\n"
14030 " gl_Position = vec4(1);\n"
14031 "}\n";
14032 char const *fsSource =
14033 "#version 450\n"
14034 "\n"
14035 "layout(location=0) out vec4 color;\n"
14036 "void main(){\n"
14037 " color = vec4(1);\n"
14038 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014039
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014040 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14041 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014042
14043 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014044 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014045 pipe.AddShader(&vs);
14046 pipe.AddShader(&fs);
14047
14048 pipe.AddVertexInputBindings(&input_binding, 1);
14049 pipe.AddVertexInputAttribs(&input_attrib, 1);
14050
Chris Forbesde136e02015-05-25 11:13:28 +120014051 VkDescriptorSetObj descriptorSet(m_device);
14052 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014053 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014054
Tony Barbour5781e8f2015-08-04 16:23:11 -060014055 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014056
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014057 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014058}
14059
Karl Schultz6addd812016-02-02 17:17:23 -070014060TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014061 TEST_DESCRIPTION(
14062 "Test that a warning is produced for a location mismatch on "
14063 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014065
14066 ASSERT_NO_FATAL_FAILURE(InitState());
14067 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14068
14069 VkVertexInputBindingDescription input_binding;
14070 memset(&input_binding, 0, sizeof(input_binding));
14071
14072 VkVertexInputAttributeDescription input_attrib;
14073 memset(&input_attrib, 0, sizeof(input_attrib));
14074 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14075
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014076 char const *vsSource =
14077 "#version 450\n"
14078 "\n"
14079 "layout(location=1) in float x;\n"
14080 "out gl_PerVertex {\n"
14081 " vec4 gl_Position;\n"
14082 "};\n"
14083 "void main(){\n"
14084 " gl_Position = vec4(x);\n"
14085 "}\n";
14086 char const *fsSource =
14087 "#version 450\n"
14088 "\n"
14089 "layout(location=0) out vec4 color;\n"
14090 "void main(){\n"
14091 " color = vec4(1);\n"
14092 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014093
14094 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14095 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14096
14097 VkPipelineObj pipe(m_device);
14098 pipe.AddColorAttachment();
14099 pipe.AddShader(&vs);
14100 pipe.AddShader(&fs);
14101
14102 pipe.AddVertexInputBindings(&input_binding, 1);
14103 pipe.AddVertexInputAttribs(&input_attrib, 1);
14104
14105 VkDescriptorSetObj descriptorSet(m_device);
14106 descriptorSet.AppendDummy();
14107 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14108
14109 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14110
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014111 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014112}
14113
Karl Schultz6addd812016-02-02 17:17:23 -070014114TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014115 TEST_DESCRIPTION(
14116 "Test that an error is produced for a vertex shader input which is not "
14117 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14119 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014120
Chris Forbes62e8e502015-05-25 11:13:29 +120014121 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014122 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014123
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014124 char const *vsSource =
14125 "#version 450\n"
14126 "\n"
14127 "layout(location=0) in vec4 x;\n" /* not provided */
14128 "out gl_PerVertex {\n"
14129 " vec4 gl_Position;\n"
14130 "};\n"
14131 "void main(){\n"
14132 " gl_Position = x;\n"
14133 "}\n";
14134 char const *fsSource =
14135 "#version 450\n"
14136 "\n"
14137 "layout(location=0) out vec4 color;\n"
14138 "void main(){\n"
14139 " color = vec4(1);\n"
14140 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014141
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014142 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14143 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014144
14145 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014146 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014147 pipe.AddShader(&vs);
14148 pipe.AddShader(&fs);
14149
Chris Forbes62e8e502015-05-25 11:13:29 +120014150 VkDescriptorSetObj descriptorSet(m_device);
14151 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014152 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014153
Tony Barbour5781e8f2015-08-04 16:23:11 -060014154 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014155
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014156 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014157}
14158
Karl Schultz6addd812016-02-02 17:17:23 -070014159TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014160 TEST_DESCRIPTION(
14161 "Test that an error is produced for a mismatch between the "
14162 "fundamental type (float/int/uint) of an attribute and the "
14163 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014164 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 -060014165
Chris Forbesc97d98e2015-05-25 11:13:31 +120014166 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014167 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014168
14169 VkVertexInputBindingDescription input_binding;
14170 memset(&input_binding, 0, sizeof(input_binding));
14171
14172 VkVertexInputAttributeDescription input_attrib;
14173 memset(&input_attrib, 0, sizeof(input_attrib));
14174 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14175
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014176 char const *vsSource =
14177 "#version 450\n"
14178 "\n"
14179 "layout(location=0) in int x;\n" /* attrib provided float */
14180 "out gl_PerVertex {\n"
14181 " vec4 gl_Position;\n"
14182 "};\n"
14183 "void main(){\n"
14184 " gl_Position = vec4(x);\n"
14185 "}\n";
14186 char const *fsSource =
14187 "#version 450\n"
14188 "\n"
14189 "layout(location=0) out vec4 color;\n"
14190 "void main(){\n"
14191 " color = vec4(1);\n"
14192 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014193
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014194 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14195 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014196
14197 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014198 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014199 pipe.AddShader(&vs);
14200 pipe.AddShader(&fs);
14201
14202 pipe.AddVertexInputBindings(&input_binding, 1);
14203 pipe.AddVertexInputAttribs(&input_attrib, 1);
14204
Chris Forbesc97d98e2015-05-25 11:13:31 +120014205 VkDescriptorSetObj descriptorSet(m_device);
14206 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014207 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014208
Tony Barbour5781e8f2015-08-04 16:23:11 -060014209 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014210
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014211 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014212}
14213
Chris Forbesc68b43c2016-04-06 11:18:47 +120014214TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014215 TEST_DESCRIPTION(
14216 "Test that an error is produced for a pipeline containing multiple "
14217 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14219 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014220
14221 ASSERT_NO_FATAL_FAILURE(InitState());
14222 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14223
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014224 char const *vsSource =
14225 "#version 450\n"
14226 "\n"
14227 "out gl_PerVertex {\n"
14228 " vec4 gl_Position;\n"
14229 "};\n"
14230 "void main(){\n"
14231 " gl_Position = vec4(1);\n"
14232 "}\n";
14233 char const *fsSource =
14234 "#version 450\n"
14235 "\n"
14236 "layout(location=0) out vec4 color;\n"
14237 "void main(){\n"
14238 " color = vec4(1);\n"
14239 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014240
14241 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14242 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14243
14244 VkPipelineObj pipe(m_device);
14245 pipe.AddColorAttachment();
14246 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014247 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014248 pipe.AddShader(&fs);
14249
14250 VkDescriptorSetObj descriptorSet(m_device);
14251 descriptorSet.AppendDummy();
14252 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14253
14254 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14255
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014256 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014257}
14258
Chris Forbes82ff92a2016-09-09 10:50:24 +120014259TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014261
14262 ASSERT_NO_FATAL_FAILURE(InitState());
14263 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14264
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014265 char const *vsSource =
14266 "#version 450\n"
14267 "out gl_PerVertex {\n"
14268 " vec4 gl_Position;\n"
14269 "};\n"
14270 "void main(){\n"
14271 " gl_Position = vec4(0);\n"
14272 "}\n";
14273 char const *fsSource =
14274 "#version 450\n"
14275 "\n"
14276 "layout(location=0) out vec4 color;\n"
14277 "void main(){\n"
14278 " color = vec4(1);\n"
14279 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014280
14281 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14282 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14283
14284 VkPipelineObj pipe(m_device);
14285 pipe.AddColorAttachment();
14286 pipe.AddShader(&vs);
14287 pipe.AddShader(&fs);
14288
14289 VkDescriptorSetObj descriptorSet(m_device);
14290 descriptorSet.AppendDummy();
14291 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14292
14293 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14294
14295 m_errorMonitor->VerifyFound();
14296}
14297
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014298TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14300 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14301 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014302
14303 ASSERT_NO_FATAL_FAILURE(InitState());
14304 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14305
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014306 char const *vsSource =
14307 "#version 450\n"
14308 "void main(){ gl_Position = vec4(0); }\n";
14309 char const *fsSource =
14310 "#version 450\n"
14311 "\n"
14312 "layout(location=0) out vec4 color;\n"
14313 "void main(){\n"
14314 " color = vec4(1);\n"
14315 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014316
14317 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14318 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14319
14320 VkPipelineObj pipe(m_device);
14321 pipe.AddColorAttachment();
14322 pipe.AddShader(&vs);
14323 pipe.AddShader(&fs);
14324
14325 VkDescriptorSetObj descriptorSet(m_device);
14326 descriptorSet.AppendDummy();
14327 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14328
14329 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014330 {
14331 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14332 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14333 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014334 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014335 {
14336 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14337 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14338 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014339 },
14340 };
14341 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014342 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014343 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014344 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14345 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014346 VkRenderPass rp;
14347 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14348 ASSERT_VK_SUCCESS(err);
14349
14350 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14351
14352 m_errorMonitor->VerifyFound();
14353
14354 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14355}
14356
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014357TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014358 TEST_DESCRIPTION(
14359 "Test that an error is produced for a variable output from "
14360 "the TCS without the patch decoration, but consumed in the TES "
14361 "with the decoration.");
14362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14363 "is per-vertex in tessellation control shader stage "
14364 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014365
14366 ASSERT_NO_FATAL_FAILURE(InitState());
14367 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14368
Chris Forbesc1e852d2016-04-04 19:26:42 +120014369 if (!m_device->phy().features().tessellationShader) {
14370 printf("Device does not support tessellation shaders; skipped.\n");
14371 return;
14372 }
14373
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014374 char const *vsSource =
14375 "#version 450\n"
14376 "void main(){}\n";
14377 char const *tcsSource =
14378 "#version 450\n"
14379 "layout(location=0) out int x[];\n"
14380 "layout(vertices=3) out;\n"
14381 "void main(){\n"
14382 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14383 " gl_TessLevelInner[0] = 1;\n"
14384 " x[gl_InvocationID] = gl_InvocationID;\n"
14385 "}\n";
14386 char const *tesSource =
14387 "#version 450\n"
14388 "layout(triangles, equal_spacing, cw) in;\n"
14389 "layout(location=0) patch in int x;\n"
14390 "out gl_PerVertex { vec4 gl_Position; };\n"
14391 "void main(){\n"
14392 " gl_Position.xyz = gl_TessCoord;\n"
14393 " gl_Position.w = x;\n"
14394 "}\n";
14395 char const *fsSource =
14396 "#version 450\n"
14397 "layout(location=0) out vec4 color;\n"
14398 "void main(){\n"
14399 " color = vec4(1);\n"
14400 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014401
14402 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14403 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14404 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14405 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14406
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014407 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14408 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014409
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014410 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014411
14412 VkPipelineObj pipe(m_device);
14413 pipe.SetInputAssembly(&iasci);
14414 pipe.SetTessellation(&tsci);
14415 pipe.AddColorAttachment();
14416 pipe.AddShader(&vs);
14417 pipe.AddShader(&tcs);
14418 pipe.AddShader(&tes);
14419 pipe.AddShader(&fs);
14420
14421 VkDescriptorSetObj descriptorSet(m_device);
14422 descriptorSet.AppendDummy();
14423 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14424
14425 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14426
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014427 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014428}
14429
Karl Schultz6addd812016-02-02 17:17:23 -070014430TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014431 TEST_DESCRIPTION(
14432 "Test that an error is produced for a vertex attribute setup where multiple "
14433 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14435 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014436
Chris Forbes280ba2c2015-06-12 11:16:41 +120014437 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014439
14440 /* Two binding descriptions for binding 0 */
14441 VkVertexInputBindingDescription input_bindings[2];
14442 memset(input_bindings, 0, sizeof(input_bindings));
14443
14444 VkVertexInputAttributeDescription input_attrib;
14445 memset(&input_attrib, 0, sizeof(input_attrib));
14446 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14447
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014448 char const *vsSource =
14449 "#version 450\n"
14450 "\n"
14451 "layout(location=0) in float x;\n" /* attrib provided float */
14452 "out gl_PerVertex {\n"
14453 " vec4 gl_Position;\n"
14454 "};\n"
14455 "void main(){\n"
14456 " gl_Position = vec4(x);\n"
14457 "}\n";
14458 char const *fsSource =
14459 "#version 450\n"
14460 "\n"
14461 "layout(location=0) out vec4 color;\n"
14462 "void main(){\n"
14463 " color = vec4(1);\n"
14464 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014465
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014466 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14467 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014468
14469 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014470 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014471 pipe.AddShader(&vs);
14472 pipe.AddShader(&fs);
14473
14474 pipe.AddVertexInputBindings(input_bindings, 2);
14475 pipe.AddVertexInputAttribs(&input_attrib, 1);
14476
Chris Forbes280ba2c2015-06-12 11:16:41 +120014477 VkDescriptorSetObj descriptorSet(m_device);
14478 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014479 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014480
Tony Barbour5781e8f2015-08-04 16:23:11 -060014481 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014482
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014483 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014484}
Chris Forbes8f68b562015-05-25 11:13:32 +120014485
Karl Schultz6addd812016-02-02 17:17:23 -070014486TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014487 TEST_DESCRIPTION(
14488 "Test that an error is produced for a fragment shader which does not "
14489 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014491
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014492 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014493
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014494 char const *vsSource =
14495 "#version 450\n"
14496 "\n"
14497 "out gl_PerVertex {\n"
14498 " vec4 gl_Position;\n"
14499 "};\n"
14500 "void main(){\n"
14501 " gl_Position = vec4(1);\n"
14502 "}\n";
14503 char const *fsSource =
14504 "#version 450\n"
14505 "\n"
14506 "void main(){\n"
14507 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014508
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014509 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14510 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014511
14512 VkPipelineObj pipe(m_device);
14513 pipe.AddShader(&vs);
14514 pipe.AddShader(&fs);
14515
Chia-I Wu08accc62015-07-07 11:50:03 +080014516 /* set up CB 0, not written */
14517 pipe.AddColorAttachment();
14518 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014519
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014520 VkDescriptorSetObj descriptorSet(m_device);
14521 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014522 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014523
Tony Barbour5781e8f2015-08-04 16:23:11 -060014524 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014525
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014526 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014527}
14528
Karl Schultz6addd812016-02-02 17:17:23 -070014529TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014530 TEST_DESCRIPTION(
14531 "Test that a warning is produced for a fragment shader which provides a spurious "
14532 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014534 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014535
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014536 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014537
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014538 char const *vsSource =
14539 "#version 450\n"
14540 "\n"
14541 "out gl_PerVertex {\n"
14542 " vec4 gl_Position;\n"
14543 "};\n"
14544 "void main(){\n"
14545 " gl_Position = vec4(1);\n"
14546 "}\n";
14547 char const *fsSource =
14548 "#version 450\n"
14549 "\n"
14550 "layout(location=0) out vec4 x;\n"
14551 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14552 "void main(){\n"
14553 " x = vec4(1);\n"
14554 " y = vec4(1);\n"
14555 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014556
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014557 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14558 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014559
14560 VkPipelineObj pipe(m_device);
14561 pipe.AddShader(&vs);
14562 pipe.AddShader(&fs);
14563
Chia-I Wu08accc62015-07-07 11:50:03 +080014564 /* set up CB 0, not written */
14565 pipe.AddColorAttachment();
14566 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014567 /* FS writes CB 1, but we don't configure it */
14568
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014569 VkDescriptorSetObj descriptorSet(m_device);
14570 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014571 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014572
Tony Barbour5781e8f2015-08-04 16:23:11 -060014573 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014574
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014575 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014576}
14577
Karl Schultz6addd812016-02-02 17:17:23 -070014578TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014579 TEST_DESCRIPTION(
14580 "Test that an error is produced for a mismatch between the fundamental "
14581 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014583
Chris Forbesa36d69e2015-05-25 11:13:44 +120014584 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014585
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014586 char const *vsSource =
14587 "#version 450\n"
14588 "\n"
14589 "out gl_PerVertex {\n"
14590 " vec4 gl_Position;\n"
14591 "};\n"
14592 "void main(){\n"
14593 " gl_Position = vec4(1);\n"
14594 "}\n";
14595 char const *fsSource =
14596 "#version 450\n"
14597 "\n"
14598 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14599 "void main(){\n"
14600 " x = ivec4(1);\n"
14601 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014602
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014603 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14604 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014605
14606 VkPipelineObj pipe(m_device);
14607 pipe.AddShader(&vs);
14608 pipe.AddShader(&fs);
14609
Chia-I Wu08accc62015-07-07 11:50:03 +080014610 /* set up CB 0; type is UNORM by default */
14611 pipe.AddColorAttachment();
14612 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014613
Chris Forbesa36d69e2015-05-25 11:13:44 +120014614 VkDescriptorSetObj descriptorSet(m_device);
14615 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014616 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014617
Tony Barbour5781e8f2015-08-04 16:23:11 -060014618 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014619
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014620 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014621}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014622
Karl Schultz6addd812016-02-02 17:17:23 -070014623TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014624 TEST_DESCRIPTION(
14625 "Test that an error is produced for a shader consuming a uniform "
14626 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014628
Chris Forbes556c76c2015-08-14 12:04:59 +120014629 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120014630
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014631 char const *vsSource =
14632 "#version 450\n"
14633 "\n"
14634 "out gl_PerVertex {\n"
14635 " vec4 gl_Position;\n"
14636 "};\n"
14637 "void main(){\n"
14638 " gl_Position = vec4(1);\n"
14639 "}\n";
14640 char const *fsSource =
14641 "#version 450\n"
14642 "\n"
14643 "layout(location=0) out vec4 x;\n"
14644 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
14645 "void main(){\n"
14646 " x = vec4(bar.y);\n"
14647 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120014648
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014649 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14650 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120014651
Chris Forbes556c76c2015-08-14 12:04:59 +120014652 VkPipelineObj pipe(m_device);
14653 pipe.AddShader(&vs);
14654 pipe.AddShader(&fs);
14655
14656 /* set up CB 0; type is UNORM by default */
14657 pipe.AddColorAttachment();
14658 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14659
14660 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014661 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120014662
14663 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14664
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014665 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120014666}
14667
Chris Forbes5c59e902016-02-26 16:56:09 +130014668TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014669 TEST_DESCRIPTION(
14670 "Test that an error is produced for a shader consuming push constants "
14671 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130014673
14674 ASSERT_NO_FATAL_FAILURE(InitState());
14675
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014676 char const *vsSource =
14677 "#version 450\n"
14678 "\n"
14679 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14680 "out gl_PerVertex {\n"
14681 " vec4 gl_Position;\n"
14682 "};\n"
14683 "void main(){\n"
14684 " gl_Position = vec4(consts.x);\n"
14685 "}\n";
14686 char const *fsSource =
14687 "#version 450\n"
14688 "\n"
14689 "layout(location=0) out vec4 x;\n"
14690 "void main(){\n"
14691 " x = vec4(1);\n"
14692 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130014693
14694 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14695 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14696
14697 VkPipelineObj pipe(m_device);
14698 pipe.AddShader(&vs);
14699 pipe.AddShader(&fs);
14700
14701 /* set up CB 0; type is UNORM by default */
14702 pipe.AddColorAttachment();
14703 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14704
14705 VkDescriptorSetObj descriptorSet(m_device);
14706 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14707
14708 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14709
14710 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014711 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130014712}
14713
Chris Forbes3fb17902016-08-22 14:57:55 +120014714TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014715 TEST_DESCRIPTION(
14716 "Test that an error is produced for a shader consuming an input attachment "
14717 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120014718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14719 "consumes input attachment index 0 but not provided in subpass");
14720
14721 ASSERT_NO_FATAL_FAILURE(InitState());
14722
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014723 char const *vsSource =
14724 "#version 450\n"
14725 "\n"
14726 "out gl_PerVertex {\n"
14727 " vec4 gl_Position;\n"
14728 "};\n"
14729 "void main(){\n"
14730 " gl_Position = vec4(1);\n"
14731 "}\n";
14732 char const *fsSource =
14733 "#version 450\n"
14734 "\n"
14735 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
14736 "layout(location=0) out vec4 color;\n"
14737 "void main() {\n"
14738 " color = subpassLoad(x);\n"
14739 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120014740
14741 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14742 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14743
14744 VkPipelineObj pipe(m_device);
14745 pipe.AddShader(&vs);
14746 pipe.AddShader(&fs);
14747 pipe.AddColorAttachment();
14748 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14749
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014750 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
14751 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120014752 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014753 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120014754 ASSERT_VK_SUCCESS(err);
14755
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014756 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120014757 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014758 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120014759 ASSERT_VK_SUCCESS(err);
14760
14761 // error here.
14762 pipe.CreateVKPipeline(pl, renderPass());
14763
14764 m_errorMonitor->VerifyFound();
14765
14766 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14767 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14768}
14769
Chris Forbes5a9a0472016-08-22 16:02:09 +120014770TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014771 TEST_DESCRIPTION(
14772 "Test that an error is produced for a shader consuming an input attachment "
14773 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120014774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14775 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
14776
14777 ASSERT_NO_FATAL_FAILURE(InitState());
14778
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014779 char const *vsSource =
14780 "#version 450\n"
14781 "\n"
14782 "out gl_PerVertex {\n"
14783 " vec4 gl_Position;\n"
14784 "};\n"
14785 "void main(){\n"
14786 " gl_Position = vec4(1);\n"
14787 "}\n";
14788 char const *fsSource =
14789 "#version 450\n"
14790 "\n"
14791 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
14792 "layout(location=0) out vec4 color;\n"
14793 "void main() {\n"
14794 " color = subpassLoad(x);\n"
14795 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120014796
14797 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14798 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14799
14800 VkPipelineObj pipe(m_device);
14801 pipe.AddShader(&vs);
14802 pipe.AddShader(&fs);
14803 pipe.AddColorAttachment();
14804 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14805
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014806 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
14807 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014808 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014809 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120014810 ASSERT_VK_SUCCESS(err);
14811
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014812 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014813 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014814 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120014815 ASSERT_VK_SUCCESS(err);
14816
14817 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014818 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
14819 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
14820 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
14821 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
14822 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 +120014823 };
14824 VkAttachmentReference color = {
14825 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
14826 };
14827 VkAttachmentReference input = {
14828 1, VK_IMAGE_LAYOUT_GENERAL,
14829 };
14830
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014831 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014832
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014833 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014834 VkRenderPass rp;
14835 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14836 ASSERT_VK_SUCCESS(err);
14837
14838 // error here.
14839 pipe.CreateVKPipeline(pl, rp);
14840
14841 m_errorMonitor->VerifyFound();
14842
14843 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14844 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14845 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14846}
14847
Chris Forbes541f7b02016-08-22 15:30:27 +120014848TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014849 TEST_DESCRIPTION(
14850 "Test that an error is produced for a shader consuming an input attachment "
14851 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120014852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070014853 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120014854
14855 ASSERT_NO_FATAL_FAILURE(InitState());
14856
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014857 char const *vsSource =
14858 "#version 450\n"
14859 "\n"
14860 "out gl_PerVertex {\n"
14861 " vec4 gl_Position;\n"
14862 "};\n"
14863 "void main(){\n"
14864 " gl_Position = vec4(1);\n"
14865 "}\n";
14866 char const *fsSource =
14867 "#version 450\n"
14868 "\n"
14869 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
14870 "layout(location=0) out vec4 color;\n"
14871 "void main() {\n"
14872 " color = subpassLoad(xs[0]);\n"
14873 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120014874
14875 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14876 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14877
14878 VkPipelineObj pipe(m_device);
14879 pipe.AddShader(&vs);
14880 pipe.AddShader(&fs);
14881 pipe.AddColorAttachment();
14882 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14883
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014884 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
14885 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120014886 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014887 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120014888 ASSERT_VK_SUCCESS(err);
14889
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014890 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120014891 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014892 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120014893 ASSERT_VK_SUCCESS(err);
14894
14895 // error here.
14896 pipe.CreateVKPipeline(pl, renderPass());
14897
14898 m_errorMonitor->VerifyFound();
14899
14900 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14901 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14902}
14903
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014904TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014905 TEST_DESCRIPTION(
14906 "Test that an error is produced for a compute pipeline consuming a "
14907 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014909
14910 ASSERT_NO_FATAL_FAILURE(InitState());
14911
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014912 char const *csSource =
14913 "#version 450\n"
14914 "\n"
14915 "layout(local_size_x=1) in;\n"
14916 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14917 "void main(){\n"
14918 " x = vec4(1);\n"
14919 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014920
14921 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14922
14923 VkDescriptorSetObj descriptorSet(m_device);
14924 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14925
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014926 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14927 nullptr,
14928 0,
14929 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
14930 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
14931 descriptorSet.GetPipelineLayout(),
14932 VK_NULL_HANDLE,
14933 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014934
14935 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014936 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014937
14938 m_errorMonitor->VerifyFound();
14939
14940 if (err == VK_SUCCESS) {
14941 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14942 }
14943}
14944
Chris Forbes22a9b092016-07-19 14:34:05 +120014945TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014946 TEST_DESCRIPTION(
14947 "Test that an error is produced for a pipeline consuming a "
14948 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14950 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120014951
14952 ASSERT_NO_FATAL_FAILURE(InitState());
14953
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014954 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
14955 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120014956 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014957 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120014958 ASSERT_VK_SUCCESS(err);
14959
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014960 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120014961 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014962 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120014963 ASSERT_VK_SUCCESS(err);
14964
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014965 char const *csSource =
14966 "#version 450\n"
14967 "\n"
14968 "layout(local_size_x=1) in;\n"
14969 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14970 "void main() {\n"
14971 " x.x = 1.0f;\n"
14972 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120014973 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14974
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014975 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14976 nullptr,
14977 0,
14978 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
14979 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
14980 pl,
14981 VK_NULL_HANDLE,
14982 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120014983
14984 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014985 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120014986
14987 m_errorMonitor->VerifyFound();
14988
14989 if (err == VK_SUCCESS) {
14990 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14991 }
14992
14993 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14994 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14995}
14996
Chris Forbes50020592016-07-27 13:52:41 +120014997TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014998 TEST_DESCRIPTION(
14999 "Test that an error is produced when an image view type "
15000 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015001
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015002 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 +120015003
15004 ASSERT_NO_FATAL_FAILURE(InitState());
15005 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15006
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015007 char const *vsSource =
15008 "#version 450\n"
15009 "\n"
15010 "out gl_PerVertex { vec4 gl_Position; };\n"
15011 "void main() { gl_Position = vec4(0); }\n";
15012 char const *fsSource =
15013 "#version 450\n"
15014 "\n"
15015 "layout(set=0, binding=0) uniform sampler3D s;\n"
15016 "layout(location=0) out vec4 color;\n"
15017 "void main() {\n"
15018 " color = texture(s, vec3(0));\n"
15019 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015020 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15021 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15022
15023 VkPipelineObj pipe(m_device);
15024 pipe.AddShader(&vs);
15025 pipe.AddShader(&fs);
15026 pipe.AddColorAttachment();
15027
15028 VkTextureObj texture(m_device, nullptr);
15029 VkSamplerObj sampler(m_device);
15030
15031 VkDescriptorSetObj descriptorSet(m_device);
15032 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15033 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15034
15035 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15036 ASSERT_VK_SUCCESS(err);
15037
Tony Barbour552f6c02016-12-21 14:34:07 -070015038 m_commandBuffer->BeginCommandBuffer();
15039 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015040
15041 m_commandBuffer->BindPipeline(pipe);
15042 m_commandBuffer->BindDescriptorSet(descriptorSet);
15043
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015044 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015045 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015046 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015047 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15048
15049 // error produced here.
15050 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15051
15052 m_errorMonitor->VerifyFound();
15053
Tony Barbour552f6c02016-12-21 14:34:07 -070015054 m_commandBuffer->EndRenderPass();
15055 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015056}
15057
Chris Forbes5533bfc2016-07-27 14:12:34 +120015058TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015059 TEST_DESCRIPTION(
15060 "Test that an error is produced when a multisampled images "
15061 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015062
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015064
15065 ASSERT_NO_FATAL_FAILURE(InitState());
15066 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15067
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015068 char const *vsSource =
15069 "#version 450\n"
15070 "\n"
15071 "out gl_PerVertex { vec4 gl_Position; };\n"
15072 "void main() { gl_Position = vec4(0); }\n";
15073 char const *fsSource =
15074 "#version 450\n"
15075 "\n"
15076 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15077 "layout(location=0) out vec4 color;\n"
15078 "void main() {\n"
15079 " color = texelFetch(s, ivec2(0), 0);\n"
15080 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015081 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15082 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15083
15084 VkPipelineObj pipe(m_device);
15085 pipe.AddShader(&vs);
15086 pipe.AddShader(&fs);
15087 pipe.AddColorAttachment();
15088
15089 VkTextureObj texture(m_device, nullptr);
15090 VkSamplerObj sampler(m_device);
15091
15092 VkDescriptorSetObj descriptorSet(m_device);
15093 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15094 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15095
15096 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15097 ASSERT_VK_SUCCESS(err);
15098
Tony Barbour552f6c02016-12-21 14:34:07 -070015099 m_commandBuffer->BeginCommandBuffer();
15100 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015101
15102 m_commandBuffer->BindPipeline(pipe);
15103 m_commandBuffer->BindDescriptorSet(descriptorSet);
15104
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015105 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015106 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015107 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015108 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15109
15110 // error produced here.
15111 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15112
15113 m_errorMonitor->VerifyFound();
15114
Tony Barbour552f6c02016-12-21 14:34:07 -070015115 m_commandBuffer->EndRenderPass();
15116 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015117}
15118
Mark Youngc48c4c12016-04-11 14:26:49 -060015119TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015120 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015121
15122 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015123
15124 // Create an image
15125 VkImage image;
15126
Karl Schultz6addd812016-02-02 17:17:23 -070015127 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15128 const int32_t tex_width = 32;
15129 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015130
15131 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015132 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15133 image_create_info.pNext = NULL;
15134 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15135 image_create_info.format = tex_format;
15136 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015137 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070015138 image_create_info.extent.depth = 1;
15139 image_create_info.mipLevels = 1;
15140 image_create_info.arrayLayers = 1;
15141 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15142 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15143 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15144 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015145
15146 // Introduce error by sending down a bogus width extent
15147 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080015148 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015149
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015150 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015151}
15152
Mark Youngc48c4c12016-04-11 14:26:49 -060015153TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Mark Lobodzinski688ed322017-01-27 11:13:21 -070015154 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00716);
Mark Youngc48c4c12016-04-11 14:26:49 -060015155
15156 ASSERT_NO_FATAL_FAILURE(InitState());
15157
15158 // Create an image
15159 VkImage image;
15160
15161 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15162 const int32_t tex_width = 32;
15163 const int32_t tex_height = 32;
15164
15165 VkImageCreateInfo image_create_info = {};
15166 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15167 image_create_info.pNext = NULL;
15168 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15169 image_create_info.format = tex_format;
15170 image_create_info.extent.width = tex_width;
15171 image_create_info.extent.height = tex_height;
15172 image_create_info.extent.depth = 1;
15173 image_create_info.mipLevels = 1;
15174 image_create_info.arrayLayers = 1;
15175 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15176 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15177 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15178 image_create_info.flags = 0;
15179
15180 // Introduce error by sending down a bogus width extent
15181 image_create_info.extent.width = 0;
15182 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15183
15184 m_errorMonitor->VerifyFound();
15185}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015186
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015187TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015188 TEST_DESCRIPTION(
15189 "Create a render pass with an attachment description "
15190 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015191
15192 ASSERT_NO_FATAL_FAILURE(InitState());
15193 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15194
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015195 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015196
15197 VkAttachmentReference color_attach = {};
15198 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15199 color_attach.attachment = 0;
15200 VkSubpassDescription subpass = {};
15201 subpass.colorAttachmentCount = 1;
15202 subpass.pColorAttachments = &color_attach;
15203
15204 VkRenderPassCreateInfo rpci = {};
15205 rpci.subpassCount = 1;
15206 rpci.pSubpasses = &subpass;
15207 rpci.attachmentCount = 1;
15208 VkAttachmentDescription attach_desc = {};
15209 attach_desc.format = VK_FORMAT_UNDEFINED;
15210 rpci.pAttachments = &attach_desc;
15211 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15212 VkRenderPass rp;
15213 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15214
15215 m_errorMonitor->VerifyFound();
15216
15217 if (result == VK_SUCCESS) {
15218 vkDestroyRenderPass(m_device->device(), rp, NULL);
15219 }
15220}
15221
Karl Schultz6addd812016-02-02 17:17:23 -070015222TEST_F(VkLayerTest, InvalidImageView) {
15223 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060015224
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015226
Tobin Ehliscde08892015-09-22 10:11:37 -060015227 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060015228
Mike Stroyana3082432015-09-25 13:39:21 -060015229 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015230 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060015231
Karl Schultz6addd812016-02-02 17:17:23 -070015232 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15233 const int32_t tex_width = 32;
15234 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015235
15236 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015237 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15238 image_create_info.pNext = NULL;
15239 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15240 image_create_info.format = tex_format;
15241 image_create_info.extent.width = tex_width;
15242 image_create_info.extent.height = tex_height;
15243 image_create_info.extent.depth = 1;
15244 image_create_info.mipLevels = 1;
15245 image_create_info.arrayLayers = 1;
15246 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15247 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15248 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15249 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015250
Chia-I Wuf7458c52015-10-26 21:10:41 +080015251 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015252 ASSERT_VK_SUCCESS(err);
15253
15254 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015255 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015256 image_view_create_info.image = image;
15257 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15258 image_view_create_info.format = tex_format;
15259 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015260 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015261 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015262 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015263
15264 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015265 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060015266
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015267 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060015268 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015269}
Mike Stroyana3082432015-09-25 13:39:21 -060015270
Mark Youngd339ba32016-05-30 13:28:35 -060015271TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15272 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015274 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015275
15276 ASSERT_NO_FATAL_FAILURE(InitState());
15277
15278 // Create an image and try to create a view with no memory backing the image
15279 VkImage image;
15280
15281 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15282 const int32_t tex_width = 32;
15283 const int32_t tex_height = 32;
15284
15285 VkImageCreateInfo image_create_info = {};
15286 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15287 image_create_info.pNext = NULL;
15288 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15289 image_create_info.format = tex_format;
15290 image_create_info.extent.width = tex_width;
15291 image_create_info.extent.height = tex_height;
15292 image_create_info.extent.depth = 1;
15293 image_create_info.mipLevels = 1;
15294 image_create_info.arrayLayers = 1;
15295 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15296 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15297 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15298 image_create_info.flags = 0;
15299
15300 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15301 ASSERT_VK_SUCCESS(err);
15302
15303 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015304 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015305 image_view_create_info.image = image;
15306 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15307 image_view_create_info.format = tex_format;
15308 image_view_create_info.subresourceRange.layerCount = 1;
15309 image_view_create_info.subresourceRange.baseMipLevel = 0;
15310 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015311 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015312
15313 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015314 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015315
15316 m_errorMonitor->VerifyFound();
15317 vkDestroyImage(m_device->device(), image, NULL);
15318 // If last error is success, it still created the view, so delete it.
15319 if (err == VK_SUCCESS) {
15320 vkDestroyImageView(m_device->device(), view, NULL);
15321 }
Mark Youngd339ba32016-05-30 13:28:35 -060015322}
15323
Karl Schultz6addd812016-02-02 17:17:23 -070015324TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015325 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015327
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015328 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015329
Karl Schultz6addd812016-02-02 17:17:23 -070015330 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015331 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015332 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015333 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015334
15335 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015336 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015337 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015338 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15339 image_view_create_info.format = tex_format;
15340 image_view_create_info.subresourceRange.baseMipLevel = 0;
15341 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015342 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015343 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015344 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015345
15346 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015347 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015348
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015349 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015350}
15351
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015352TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015353 VkResult err;
15354 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015355
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015357
Mike Stroyana3082432015-09-25 13:39:21 -060015358 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015359
15360 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015361 VkImage srcImage;
15362 VkImage dstImage;
15363 VkDeviceMemory srcMem;
15364 VkDeviceMemory destMem;
15365 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015366
15367 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015368 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15369 image_create_info.pNext = NULL;
15370 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15371 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15372 image_create_info.extent.width = 32;
15373 image_create_info.extent.height = 32;
15374 image_create_info.extent.depth = 1;
15375 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015376 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015377 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15378 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15379 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15380 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015381
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015382 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015383 ASSERT_VK_SUCCESS(err);
15384
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015385 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015386 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015387 ASSERT_VK_SUCCESS(err);
15388
15389 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015390 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015391 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15392 memAlloc.pNext = NULL;
15393 memAlloc.allocationSize = 0;
15394 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015395
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015396 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015397 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015398 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015399 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015400 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015401 ASSERT_VK_SUCCESS(err);
15402
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015403 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015404 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015405 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015406 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015407 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015408 ASSERT_VK_SUCCESS(err);
15409
15410 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15411 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015412 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015413 ASSERT_VK_SUCCESS(err);
15414
Tony Barbour552f6c02016-12-21 14:34:07 -070015415 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015416 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015417 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015418 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015419 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015420 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015421 copyRegion.srcOffset.x = 0;
15422 copyRegion.srcOffset.y = 0;
15423 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015424 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015425 copyRegion.dstSubresource.mipLevel = 0;
15426 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015427 // Introduce failure by forcing the dst layerCount to differ from src
15428 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015429 copyRegion.dstOffset.x = 0;
15430 copyRegion.dstOffset.y = 0;
15431 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015432 copyRegion.extent.width = 1;
15433 copyRegion.extent.height = 1;
15434 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015435 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015436 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015437
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015438 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015439
Chia-I Wuf7458c52015-10-26 21:10:41 +080015440 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015441 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015442 vkFreeMemory(m_device->device(), srcMem, NULL);
15443 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015444}
15445
Tony Barbourd6673642016-05-05 14:46:39 -060015446TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015447 TEST_DESCRIPTION("Creating images with unsuported formats ");
15448
15449 ASSERT_NO_FATAL_FAILURE(InitState());
15450 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15451 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015452 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 -060015453 VK_IMAGE_TILING_OPTIMAL, 0);
15454 ASSERT_TRUE(image.initialized());
15455
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015456 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015457 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015458 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015459 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15460 image_create_info.format = VK_FORMAT_UNDEFINED;
15461 image_create_info.extent.width = 32;
15462 image_create_info.extent.height = 32;
15463 image_create_info.extent.depth = 1;
15464 image_create_info.mipLevels = 1;
15465 image_create_info.arrayLayers = 1;
15466 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15467 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15468 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015469
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15471 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015472
15473 VkImage localImage;
15474 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
15475 m_errorMonitor->VerifyFound();
15476
Tony Barbourd6673642016-05-05 14:46:39 -060015477 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015478 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060015479 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15480 VkFormat format = static_cast<VkFormat>(f);
15481 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015482 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015483 unsupported = format;
15484 break;
15485 }
15486 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015487
Tony Barbourd6673642016-05-05 14:46:39 -060015488 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015489 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015491
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015492 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060015493 m_errorMonitor->VerifyFound();
15494 }
15495}
15496
15497TEST_F(VkLayerTest, ImageLayerViewTests) {
15498 VkResult ret;
15499 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15500
15501 ASSERT_NO_FATAL_FAILURE(InitState());
15502
15503 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015504 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 -060015505 VK_IMAGE_TILING_OPTIMAL, 0);
15506 ASSERT_TRUE(image.initialized());
15507
15508 VkImageView imgView;
15509 VkImageViewCreateInfo imgViewInfo = {};
15510 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15511 imgViewInfo.image = image.handle();
15512 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15513 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15514 imgViewInfo.subresourceRange.layerCount = 1;
15515 imgViewInfo.subresourceRange.baseMipLevel = 0;
15516 imgViewInfo.subresourceRange.levelCount = 1;
15517 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15518
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015520 // View can't have baseMipLevel >= image's mipLevels - Expect
15521 // VIEW_CREATE_ERROR
15522 imgViewInfo.subresourceRange.baseMipLevel = 1;
15523 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15524 m_errorMonitor->VerifyFound();
15525 imgViewInfo.subresourceRange.baseMipLevel = 0;
15526
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015528 // View can't have baseArrayLayer >= image's arraySize - Expect
15529 // VIEW_CREATE_ERROR
15530 imgViewInfo.subresourceRange.baseArrayLayer = 1;
15531 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15532 m_errorMonitor->VerifyFound();
15533 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15534
Mike Weiblenc16b2aa2017-01-25 13:02:44 -070015535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015536 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
15537 imgViewInfo.subresourceRange.levelCount = 0;
15538 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15539 m_errorMonitor->VerifyFound();
15540 imgViewInfo.subresourceRange.levelCount = 1;
15541
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015542 m_errorMonitor->SetDesiredFailureMsg(
15543 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15544 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060015545 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
15546 imgViewInfo.subresourceRange.layerCount = 0;
15547 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15548 m_errorMonitor->VerifyFound();
15549 imgViewInfo.subresourceRange.layerCount = 1;
15550
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15552 "Formats MUST be IDENTICAL unless "
15553 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
15554 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060015555 // Can't use depth format for view into color image - Expect INVALID_FORMAT
15556 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
15557 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15558 m_errorMonitor->VerifyFound();
15559 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15560
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060015562 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
15563 // VIEW_CREATE_ERROR
15564 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
15565 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15566 m_errorMonitor->VerifyFound();
15567 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15568
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015570 // TODO: Update framework to easily passing mutable flag into ImageObj init
15571 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070015572 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
15573 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15574 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060015575 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
15576 // VIEW_CREATE_ERROR
15577 VkImageCreateInfo mutImgInfo = image.create_info();
15578 VkImage mutImage;
15579 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015580 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060015581 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
15582 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15583 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
15584 ASSERT_VK_SUCCESS(ret);
15585 imgViewInfo.image = mutImage;
15586 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15587 m_errorMonitor->VerifyFound();
15588 imgViewInfo.image = image.handle();
15589 vkDestroyImage(m_device->handle(), mutImage, NULL);
15590}
15591
15592TEST_F(VkLayerTest, MiscImageLayerTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015593 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
15594
15595 ASSERT_NO_FATAL_FAILURE(InitState());
15596
Rene Lindsay135204f2016-12-22 17:11:09 -070015597 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060015598 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070015599 image.init(128, 128, VK_FORMAT_R16G16B16A16_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015600 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060015601 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060015602 vk_testing::Buffer buffer;
15603 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070015604 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060015605 VkBufferImageCopy region = {};
15606 region.bufferRowLength = 128;
15607 region.bufferImageHeight = 128;
15608 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15609 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070015610 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015611 region.imageExtent.height = 4;
15612 region.imageExtent.width = 4;
15613 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070015614
15615 VkImageObj image2(m_device);
15616 image2.init(128, 128, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015617 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070015618 ASSERT_TRUE(image2.initialized());
15619 vk_testing::Buffer buffer2;
15620 VkMemoryPropertyFlags reqs2 = 0;
15621 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
15622 VkBufferImageCopy region2 = {};
15623 region2.bufferRowLength = 128;
15624 region2.bufferImageHeight = 128;
15625 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15626 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
15627 region2.imageSubresource.layerCount = 1;
15628 region2.imageExtent.height = 4;
15629 region2.imageExtent.width = 4;
15630 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015631 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060015632
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070015633 // Image must have offset.z of 0 and extent.depth of 1
15634 // Introduce failure by setting imageExtent.depth to 0
15635 region.imageExtent.depth = 0;
15636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
15637 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015638 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070015639 m_errorMonitor->VerifyFound();
15640
15641 region.imageExtent.depth = 1;
15642
15643 // Image must have offset.z of 0 and extent.depth of 1
15644 // Introduce failure by setting imageOffset.z to 4
15645 region.imageOffset.z = 4;
15646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
15647 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015648 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070015649 m_errorMonitor->VerifyFound();
15650
15651 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015652 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
15653 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070015654 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015656 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
15657 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015658 m_errorMonitor->VerifyFound();
15659
15660 // BufferOffset must be a multiple of 4
15661 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070015662 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070015664 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
15665 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015666 m_errorMonitor->VerifyFound();
15667
15668 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
15669 region.bufferOffset = 0;
15670 region.imageExtent.height = 128;
15671 region.imageExtent.width = 128;
15672 // Introduce failure by setting bufferRowLength > 0 but less than width
15673 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015675 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
15676 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015677 m_errorMonitor->VerifyFound();
15678
15679 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
15680 region.bufferRowLength = 128;
15681 // Introduce failure by setting bufferRowHeight > 0 but less than height
15682 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015684 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
15685 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015686 m_errorMonitor->VerifyFound();
15687
15688 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060015689 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070015690 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
15691 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060015692 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070015693 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15694 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060015695 VkImageBlit blitRegion = {};
15696 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15697 blitRegion.srcSubresource.baseArrayLayer = 0;
15698 blitRegion.srcSubresource.layerCount = 1;
15699 blitRegion.srcSubresource.mipLevel = 0;
15700 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15701 blitRegion.dstSubresource.baseArrayLayer = 0;
15702 blitRegion.dstSubresource.layerCount = 1;
15703 blitRegion.dstSubresource.mipLevel = 0;
15704
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060015705 // Look for NULL-blit warning
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "Offsets specify a zero-volume area.");
15707 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
15708 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060015709 m_errorMonitor->VerifyFound();
15710
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070015711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015712 VkImageMemoryBarrier img_barrier;
15713 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
15714 img_barrier.pNext = NULL;
15715 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
15716 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
15717 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15718 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15719 img_barrier.image = image.handle();
15720 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15721 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15722 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15723 img_barrier.subresourceRange.baseArrayLayer = 0;
15724 img_barrier.subresourceRange.baseMipLevel = 0;
15725 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
15726 img_barrier.subresourceRange.layerCount = 0;
15727 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015728 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
15729 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060015730 m_errorMonitor->VerifyFound();
15731 img_barrier.subresourceRange.layerCount = 1;
15732}
15733
15734TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060015735 TEST_DESCRIPTION("Exceed the limits of image format ");
15736
Cody Northropc31a84f2016-08-22 10:41:47 -060015737 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060015739 VkImageCreateInfo image_create_info = {};
15740 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15741 image_create_info.pNext = NULL;
15742 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15743 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15744 image_create_info.extent.width = 32;
15745 image_create_info.extent.height = 32;
15746 image_create_info.extent.depth = 1;
15747 image_create_info.mipLevels = 1;
15748 image_create_info.arrayLayers = 1;
15749 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15750 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15751 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15752 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15753 image_create_info.flags = 0;
15754
15755 VkImage nullImg;
15756 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015757 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
15758 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070015759 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015760 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15761 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15762 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070015763 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015764
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060015766 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
15767 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15768 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15769 m_errorMonitor->VerifyFound();
15770 image_create_info.mipLevels = 1;
15771
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015772 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060015773 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
15774 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15775 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15776 m_errorMonitor->VerifyFound();
15777 image_create_info.arrayLayers = 1;
15778
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060015780 int samples = imgFmtProps.sampleCounts >> 1;
15781 image_create_info.samples = (VkSampleCountFlagBits)samples;
15782 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15783 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15784 m_errorMonitor->VerifyFound();
15785 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15786
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15788 "pCreateInfo->initialLayout, must be "
15789 "VK_IMAGE_LAYOUT_UNDEFINED or "
15790 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060015791 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15792 // Expect INVALID_LAYOUT
15793 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15794 m_errorMonitor->VerifyFound();
15795 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15796}
15797
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015798TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015799 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060015800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015801
15802 ASSERT_NO_FATAL_FAILURE(InitState());
15803
15804 VkImageObj src_image(m_device);
15805 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
15806 VkImageObj dst_image(m_device);
15807 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
15808
Tony Barbour552f6c02016-12-21 14:34:07 -070015809 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015810 VkImageCopy copy_region;
15811 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15812 copy_region.srcSubresource.mipLevel = 0;
15813 copy_region.srcSubresource.baseArrayLayer = 0;
15814 copy_region.srcSubresource.layerCount = 0;
15815 copy_region.srcOffset.x = 0;
15816 copy_region.srcOffset.y = 0;
15817 copy_region.srcOffset.z = 0;
15818 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15819 copy_region.dstSubresource.mipLevel = 0;
15820 copy_region.dstSubresource.baseArrayLayer = 0;
15821 copy_region.dstSubresource.layerCount = 0;
15822 copy_region.dstOffset.x = 0;
15823 copy_region.dstOffset.y = 0;
15824 copy_region.dstOffset.z = 0;
15825 copy_region.extent.width = 64;
15826 copy_region.extent.height = 64;
15827 copy_region.extent.depth = 1;
15828 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
15829 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070015830 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015831
15832 m_errorMonitor->VerifyFound();
15833}
15834
15835TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015836 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060015837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015838
15839 ASSERT_NO_FATAL_FAILURE(InitState());
15840
15841 VkImageObj src_image(m_device);
15842 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
15843 VkImageObj dst_image(m_device);
15844 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
15845
Tony Barbour552f6c02016-12-21 14:34:07 -070015846 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015847 VkImageCopy copy_region;
15848 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15849 copy_region.srcSubresource.mipLevel = 0;
15850 copy_region.srcSubresource.baseArrayLayer = 0;
15851 copy_region.srcSubresource.layerCount = 0;
15852 copy_region.srcOffset.x = 0;
15853 copy_region.srcOffset.y = 0;
15854 copy_region.srcOffset.z = 0;
15855 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15856 copy_region.dstSubresource.mipLevel = 0;
15857 copy_region.dstSubresource.baseArrayLayer = 0;
15858 copy_region.dstSubresource.layerCount = 0;
15859 copy_region.dstOffset.x = 0;
15860 copy_region.dstOffset.y = 0;
15861 copy_region.dstOffset.z = 0;
15862 copy_region.extent.width = 64;
15863 copy_region.extent.height = 64;
15864 copy_region.extent.depth = 1;
15865 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
15866 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070015867 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015868
15869 m_errorMonitor->VerifyFound();
15870}
15871
Karl Schultz6addd812016-02-02 17:17:23 -070015872TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060015873 VkResult err;
15874 bool pass;
15875
15876 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060015878
15879 ASSERT_NO_FATAL_FAILURE(InitState());
15880
15881 // Create two images of different types and try to copy between them
15882 VkImage srcImage;
15883 VkImage dstImage;
15884 VkDeviceMemory srcMem;
15885 VkDeviceMemory destMem;
15886 VkMemoryRequirements memReqs;
15887
15888 VkImageCreateInfo image_create_info = {};
15889 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15890 image_create_info.pNext = NULL;
15891 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15892 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15893 image_create_info.extent.width = 32;
15894 image_create_info.extent.height = 32;
15895 image_create_info.extent.depth = 1;
15896 image_create_info.mipLevels = 1;
15897 image_create_info.arrayLayers = 1;
15898 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15899 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15900 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15901 image_create_info.flags = 0;
15902
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015903 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060015904 ASSERT_VK_SUCCESS(err);
15905
15906 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15907 // Introduce failure by creating second image with a different-sized format.
15908 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
15909
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015910 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060015911 ASSERT_VK_SUCCESS(err);
15912
15913 // Allocate memory
15914 VkMemoryAllocateInfo memAlloc = {};
15915 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15916 memAlloc.pNext = NULL;
15917 memAlloc.allocationSize = 0;
15918 memAlloc.memoryTypeIndex = 0;
15919
15920 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
15921 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015922 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060015923 ASSERT_TRUE(pass);
15924 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
15925 ASSERT_VK_SUCCESS(err);
15926
15927 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
15928 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015929 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060015930 ASSERT_TRUE(pass);
15931 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
15932 ASSERT_VK_SUCCESS(err);
15933
15934 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15935 ASSERT_VK_SUCCESS(err);
15936 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
15937 ASSERT_VK_SUCCESS(err);
15938
Tony Barbour552f6c02016-12-21 14:34:07 -070015939 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060015940 VkImageCopy copyRegion;
15941 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15942 copyRegion.srcSubresource.mipLevel = 0;
15943 copyRegion.srcSubresource.baseArrayLayer = 0;
15944 copyRegion.srcSubresource.layerCount = 0;
15945 copyRegion.srcOffset.x = 0;
15946 copyRegion.srcOffset.y = 0;
15947 copyRegion.srcOffset.z = 0;
15948 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15949 copyRegion.dstSubresource.mipLevel = 0;
15950 copyRegion.dstSubresource.baseArrayLayer = 0;
15951 copyRegion.dstSubresource.layerCount = 0;
15952 copyRegion.dstOffset.x = 0;
15953 copyRegion.dstOffset.y = 0;
15954 copyRegion.dstOffset.z = 0;
15955 copyRegion.extent.width = 1;
15956 copyRegion.extent.height = 1;
15957 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015958 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015959 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060015960
15961 m_errorMonitor->VerifyFound();
15962
15963 vkDestroyImage(m_device->device(), srcImage, NULL);
15964 vkDestroyImage(m_device->device(), dstImage, NULL);
15965 vkFreeMemory(m_device->device(), srcMem, NULL);
15966 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015967}
15968
Karl Schultz6addd812016-02-02 17:17:23 -070015969TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
15970 VkResult err;
15971 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015972
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015973 // Create a color image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15975 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015976
Mike Stroyana3082432015-09-25 13:39:21 -060015977 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015978
15979 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015980 VkImage srcImage;
15981 VkImage dstImage;
15982 VkDeviceMemory srcMem;
15983 VkDeviceMemory destMem;
15984 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015985
15986 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015987 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15988 image_create_info.pNext = NULL;
15989 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15990 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15991 image_create_info.extent.width = 32;
15992 image_create_info.extent.height = 32;
15993 image_create_info.extent.depth = 1;
15994 image_create_info.mipLevels = 1;
15995 image_create_info.arrayLayers = 1;
15996 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15997 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15998 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15999 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016000
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016001 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016002 ASSERT_VK_SUCCESS(err);
16003
Karl Schultzbdb75952016-04-19 11:36:49 -060016004 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16005
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016006 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070016007 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016008 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016009 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016010
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016011 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016012 ASSERT_VK_SUCCESS(err);
16013
16014 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016015 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016016 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16017 memAlloc.pNext = NULL;
16018 memAlloc.allocationSize = 0;
16019 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016020
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016021 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016022 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016023 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016024 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016025 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016026 ASSERT_VK_SUCCESS(err);
16027
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016028 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016029 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016030 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016031 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016032 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016033 ASSERT_VK_SUCCESS(err);
16034
16035 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16036 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016037 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016038 ASSERT_VK_SUCCESS(err);
16039
Tony Barbour552f6c02016-12-21 14:34:07 -070016040 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016041 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016042 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016043 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016044 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016045 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016046 copyRegion.srcOffset.x = 0;
16047 copyRegion.srcOffset.y = 0;
16048 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016049 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016050 copyRegion.dstSubresource.mipLevel = 0;
16051 copyRegion.dstSubresource.baseArrayLayer = 0;
16052 copyRegion.dstSubresource.layerCount = 0;
16053 copyRegion.dstOffset.x = 0;
16054 copyRegion.dstOffset.y = 0;
16055 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016056 copyRegion.extent.width = 1;
16057 copyRegion.extent.height = 1;
16058 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016059 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016060 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016061
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016062 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016063
Chia-I Wuf7458c52015-10-26 21:10:41 +080016064 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016065 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016066 vkFreeMemory(m_device->device(), srcMem, NULL);
16067 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016068}
16069
Karl Schultz6addd812016-02-02 17:17:23 -070016070TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
16071 VkResult err;
16072 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016073
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016074 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16075 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016076
Mike Stroyana3082432015-09-25 13:39:21 -060016077 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016078
16079 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070016080 VkImage srcImage;
16081 VkImage dstImage;
16082 VkDeviceMemory srcMem;
16083 VkDeviceMemory destMem;
16084 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016085
16086 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016087 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16088 image_create_info.pNext = NULL;
16089 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16090 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16091 image_create_info.extent.width = 32;
16092 image_create_info.extent.height = 1;
16093 image_create_info.extent.depth = 1;
16094 image_create_info.mipLevels = 1;
16095 image_create_info.arrayLayers = 1;
16096 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16097 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16098 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16099 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016100
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016101 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016102 ASSERT_VK_SUCCESS(err);
16103
Karl Schultz6addd812016-02-02 17:17:23 -070016104 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016105
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016106 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016107 ASSERT_VK_SUCCESS(err);
16108
16109 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016110 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016111 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16112 memAlloc.pNext = NULL;
16113 memAlloc.allocationSize = 0;
16114 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016115
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016116 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016117 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016118 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016119 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016120 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016121 ASSERT_VK_SUCCESS(err);
16122
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016123 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016124 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016125 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016126 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016127 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016128 ASSERT_VK_SUCCESS(err);
16129
16130 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16131 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016132 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016133 ASSERT_VK_SUCCESS(err);
16134
Tony Barbour552f6c02016-12-21 14:34:07 -070016135 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016136 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016137 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16138 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016139 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016140 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016141 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016142 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016143 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016144 resolveRegion.srcOffset.x = 0;
16145 resolveRegion.srcOffset.y = 0;
16146 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016147 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016148 resolveRegion.dstSubresource.mipLevel = 0;
16149 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016150 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016151 resolveRegion.dstOffset.x = 0;
16152 resolveRegion.dstOffset.y = 0;
16153 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016154 resolveRegion.extent.width = 1;
16155 resolveRegion.extent.height = 1;
16156 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016157 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016158 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016159
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016160 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016161
Chia-I Wuf7458c52015-10-26 21:10:41 +080016162 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016163 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016164 vkFreeMemory(m_device->device(), srcMem, NULL);
16165 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016166}
16167
Karl Schultz6addd812016-02-02 17:17:23 -070016168TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
16169 VkResult err;
16170 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016171
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16173 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016174
Mike Stroyana3082432015-09-25 13:39:21 -060016175 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016176
Chris Forbesa7530692016-05-08 12:35:39 +120016177 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070016178 VkImage srcImage;
16179 VkImage dstImage;
16180 VkDeviceMemory srcMem;
16181 VkDeviceMemory destMem;
16182 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016183
16184 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016185 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16186 image_create_info.pNext = NULL;
16187 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16188 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16189 image_create_info.extent.width = 32;
16190 image_create_info.extent.height = 1;
16191 image_create_info.extent.depth = 1;
16192 image_create_info.mipLevels = 1;
16193 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120016194 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016195 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16196 // Note: Some implementations expect color attachment usage for any
16197 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016198 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016199 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016200
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016201 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016202 ASSERT_VK_SUCCESS(err);
16203
Karl Schultz6addd812016-02-02 17:17:23 -070016204 // Note: Some implementations expect color attachment usage for any
16205 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016206 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016207
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016208 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016209 ASSERT_VK_SUCCESS(err);
16210
16211 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016212 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016213 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16214 memAlloc.pNext = NULL;
16215 memAlloc.allocationSize = 0;
16216 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016217
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016218 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016219 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016220 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016221 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016222 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016223 ASSERT_VK_SUCCESS(err);
16224
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016225 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016226 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016227 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016228 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016229 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016230 ASSERT_VK_SUCCESS(err);
16231
16232 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16233 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016234 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016235 ASSERT_VK_SUCCESS(err);
16236
Tony Barbour552f6c02016-12-21 14:34:07 -070016237 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016238 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016239 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16240 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016241 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016242 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016243 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016244 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016245 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016246 resolveRegion.srcOffset.x = 0;
16247 resolveRegion.srcOffset.y = 0;
16248 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016249 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016250 resolveRegion.dstSubresource.mipLevel = 0;
16251 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016252 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016253 resolveRegion.dstOffset.x = 0;
16254 resolveRegion.dstOffset.y = 0;
16255 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016256 resolveRegion.extent.width = 1;
16257 resolveRegion.extent.height = 1;
16258 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016259 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016260 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016261
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016262 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016263
Chia-I Wuf7458c52015-10-26 21:10:41 +080016264 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016265 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016266 vkFreeMemory(m_device->device(), srcMem, NULL);
16267 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016268}
16269
Karl Schultz6addd812016-02-02 17:17:23 -070016270TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
16271 VkResult err;
16272 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016273
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070016274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016275 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016276
Mike Stroyana3082432015-09-25 13:39:21 -060016277 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016278
16279 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016280 VkImage srcImage;
16281 VkImage dstImage;
16282 VkDeviceMemory srcMem;
16283 VkDeviceMemory destMem;
16284 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016285
16286 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016287 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16288 image_create_info.pNext = NULL;
16289 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16290 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16291 image_create_info.extent.width = 32;
16292 image_create_info.extent.height = 1;
16293 image_create_info.extent.depth = 1;
16294 image_create_info.mipLevels = 1;
16295 image_create_info.arrayLayers = 1;
16296 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16297 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16298 // Note: Some implementations expect color attachment usage for any
16299 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016300 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016301 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016302
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016303 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016304 ASSERT_VK_SUCCESS(err);
16305
Karl Schultz6addd812016-02-02 17:17:23 -070016306 // Set format to something other than source image
16307 image_create_info.format = VK_FORMAT_R32_SFLOAT;
16308 // Note: Some implementations expect color attachment usage for any
16309 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016310 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016311 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016312
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016313 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016314 ASSERT_VK_SUCCESS(err);
16315
16316 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016317 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016318 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16319 memAlloc.pNext = NULL;
16320 memAlloc.allocationSize = 0;
16321 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016322
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016323 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016324 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016325 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016326 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016327 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016328 ASSERT_VK_SUCCESS(err);
16329
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016330 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016331 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016332 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016333 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016334 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016335 ASSERT_VK_SUCCESS(err);
16336
16337 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16338 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016339 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016340 ASSERT_VK_SUCCESS(err);
16341
Tony Barbour552f6c02016-12-21 14:34:07 -070016342 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016343 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016344 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16345 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016346 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016347 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016348 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016349 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016350 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016351 resolveRegion.srcOffset.x = 0;
16352 resolveRegion.srcOffset.y = 0;
16353 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016354 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016355 resolveRegion.dstSubresource.mipLevel = 0;
16356 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016357 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016358 resolveRegion.dstOffset.x = 0;
16359 resolveRegion.dstOffset.y = 0;
16360 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016361 resolveRegion.extent.width = 1;
16362 resolveRegion.extent.height = 1;
16363 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016364 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016365 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016366
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016367 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016368
Chia-I Wuf7458c52015-10-26 21:10:41 +080016369 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016370 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016371 vkFreeMemory(m_device->device(), srcMem, NULL);
16372 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016373}
16374
Karl Schultz6addd812016-02-02 17:17:23 -070016375TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
16376 VkResult err;
16377 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016378
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070016379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016380 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016381
Mike Stroyana3082432015-09-25 13:39:21 -060016382 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016383
16384 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016385 VkImage srcImage;
16386 VkImage dstImage;
16387 VkDeviceMemory srcMem;
16388 VkDeviceMemory destMem;
16389 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016390
16391 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016392 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16393 image_create_info.pNext = NULL;
16394 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16395 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16396 image_create_info.extent.width = 32;
16397 image_create_info.extent.height = 1;
16398 image_create_info.extent.depth = 1;
16399 image_create_info.mipLevels = 1;
16400 image_create_info.arrayLayers = 1;
16401 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16402 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16403 // Note: Some implementations expect color attachment usage for any
16404 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016405 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016406 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016407
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016408 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016409 ASSERT_VK_SUCCESS(err);
16410
Karl Schultz6addd812016-02-02 17:17:23 -070016411 image_create_info.imageType = VK_IMAGE_TYPE_1D;
16412 // Note: Some implementations expect color attachment usage for any
16413 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016414 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016415 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016416
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016417 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016418 ASSERT_VK_SUCCESS(err);
16419
16420 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016421 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016422 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16423 memAlloc.pNext = NULL;
16424 memAlloc.allocationSize = 0;
16425 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016426
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016427 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016428 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016429 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016430 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016431 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016432 ASSERT_VK_SUCCESS(err);
16433
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016434 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016435 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016436 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016437 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016438 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016439 ASSERT_VK_SUCCESS(err);
16440
16441 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16442 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016443 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016444 ASSERT_VK_SUCCESS(err);
16445
Tony Barbour552f6c02016-12-21 14:34:07 -070016446 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016447 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016448 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16449 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016450 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016451 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016452 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016453 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016454 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016455 resolveRegion.srcOffset.x = 0;
16456 resolveRegion.srcOffset.y = 0;
16457 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016458 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016459 resolveRegion.dstSubresource.mipLevel = 0;
16460 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016461 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016462 resolveRegion.dstOffset.x = 0;
16463 resolveRegion.dstOffset.y = 0;
16464 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016465 resolveRegion.extent.width = 1;
16466 resolveRegion.extent.height = 1;
16467 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016468 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016469 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016470
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016471 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016472
Chia-I Wuf7458c52015-10-26 21:10:41 +080016473 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016474 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016475 vkFreeMemory(m_device->device(), srcMem, NULL);
16476 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016477}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016478
Karl Schultz6addd812016-02-02 17:17:23 -070016479TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016480 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070016481 // to using a DS format, then cause it to hit error due to COLOR_BIT not
16482 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016483 // The image format check comes 2nd in validation so we trigger it first,
16484 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070016485 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016486
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16488 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016489
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016490 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016491
Chia-I Wu1b99bb22015-10-27 19:25:11 +080016492 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016493 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16494 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016495
16496 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016497 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16498 ds_pool_ci.pNext = NULL;
16499 ds_pool_ci.maxSets = 1;
16500 ds_pool_ci.poolSizeCount = 1;
16501 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016502
16503 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016504 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016505 ASSERT_VK_SUCCESS(err);
16506
16507 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016508 dsl_binding.binding = 0;
16509 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16510 dsl_binding.descriptorCount = 1;
16511 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16512 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016513
16514 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016515 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16516 ds_layout_ci.pNext = NULL;
16517 ds_layout_ci.bindingCount = 1;
16518 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016519 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016520 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016521 ASSERT_VK_SUCCESS(err);
16522
16523 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016524 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080016525 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070016526 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016527 alloc_info.descriptorPool = ds_pool;
16528 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016529 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016530 ASSERT_VK_SUCCESS(err);
16531
Karl Schultz6addd812016-02-02 17:17:23 -070016532 VkImage image_bad;
16533 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016534 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060016535 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016536 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070016537 const int32_t tex_width = 32;
16538 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016539
16540 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016541 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16542 image_create_info.pNext = NULL;
16543 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16544 image_create_info.format = tex_format_bad;
16545 image_create_info.extent.width = tex_width;
16546 image_create_info.extent.height = tex_height;
16547 image_create_info.extent.depth = 1;
16548 image_create_info.mipLevels = 1;
16549 image_create_info.arrayLayers = 1;
16550 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16551 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016552 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016553 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016554
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016555 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016556 ASSERT_VK_SUCCESS(err);
16557 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016558 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16559 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016560 ASSERT_VK_SUCCESS(err);
16561
Rene Lindsayf1e89c82016-12-28 13:18:31 -070016562 // ---Bind image memory---
16563 VkMemoryRequirements img_mem_reqs;
16564 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
16565 VkMemoryAllocateInfo image_alloc_info = {};
16566 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16567 image_alloc_info.pNext = NULL;
16568 image_alloc_info.memoryTypeIndex = 0;
16569 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016570 bool pass =
16571 m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &image_alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070016572 ASSERT_TRUE(pass);
16573 VkDeviceMemory mem;
16574 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
16575 ASSERT_VK_SUCCESS(err);
16576 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
16577 ASSERT_VK_SUCCESS(err);
16578 // -----------------------
16579
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016580 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016581 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070016582 image_view_create_info.image = image_bad;
16583 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16584 image_view_create_info.format = tex_format_bad;
16585 image_view_create_info.subresourceRange.baseArrayLayer = 0;
16586 image_view_create_info.subresourceRange.baseMipLevel = 0;
16587 image_view_create_info.subresourceRange.layerCount = 1;
16588 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070016589 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016590
16591 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016592 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016593
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016594 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016595
Chia-I Wuf7458c52015-10-26 21:10:41 +080016596 vkDestroyImage(m_device->device(), image_bad, NULL);
16597 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016598 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16599 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070016600
16601 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016602}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016603
16604TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016605 TEST_DESCRIPTION(
16606 "Call ClearColorImage w/ a depth|stencil image and "
16607 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016608
16609 ASSERT_NO_FATAL_FAILURE(InitState());
16610 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16611
Tony Barbour552f6c02016-12-21 14:34:07 -070016612 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016613
16614 // Color image
16615 VkClearColorValue clear_color;
16616 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
16617 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
16618 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
16619 const int32_t img_width = 32;
16620 const int32_t img_height = 32;
16621 VkImageCreateInfo image_create_info = {};
16622 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16623 image_create_info.pNext = NULL;
16624 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16625 image_create_info.format = color_format;
16626 image_create_info.extent.width = img_width;
16627 image_create_info.extent.height = img_height;
16628 image_create_info.extent.depth = 1;
16629 image_create_info.mipLevels = 1;
16630 image_create_info.arrayLayers = 1;
16631 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16632 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16633 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16634
16635 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016636 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016637
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016638 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016639
16640 // Depth/Stencil image
16641 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016642 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016643 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
16644 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
16645 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
16646 ds_image_create_info.extent.width = 64;
16647 ds_image_create_info.extent.height = 64;
16648 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070016649 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016650
16651 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016652 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016653
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016654 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 -060016655
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016657
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016658 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016659 &color_range);
16660
16661 m_errorMonitor->VerifyFound();
16662
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16664 "vkCmdClearColorImage called with "
16665 "image created without "
16666 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060016667
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070016668 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060016669 &color_range);
16670
16671 m_errorMonitor->VerifyFound();
16672
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016673 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16675 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016676
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016677 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
16678 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016679
16680 m_errorMonitor->VerifyFound();
16681}
Tobin Ehliscde08892015-09-22 10:11:37 -060016682
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016683// WSI Enabled Tests
16684//
Chris Forbes09368e42016-10-13 11:59:22 +130016685#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016686TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
16687
16688#if defined(VK_USE_PLATFORM_XCB_KHR)
16689 VkSurfaceKHR surface = VK_NULL_HANDLE;
16690
16691 VkResult err;
16692 bool pass;
16693 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
16694 VkSwapchainCreateInfoKHR swapchain_create_info = {};
16695 // uint32_t swapchain_image_count = 0;
16696 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
16697 // uint32_t image_index = 0;
16698 // VkPresentInfoKHR present_info = {};
16699
16700 ASSERT_NO_FATAL_FAILURE(InitState());
16701
16702 // Use the create function from one of the VK_KHR_*_surface extension in
16703 // order to create a surface, testing all known errors in the process,
16704 // before successfully creating a surface:
16705 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
16706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
16707 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
16708 pass = (err != VK_SUCCESS);
16709 ASSERT_TRUE(pass);
16710 m_errorMonitor->VerifyFound();
16711
16712 // Next, try to create a surface with the wrong
16713 // VkXcbSurfaceCreateInfoKHR::sType:
16714 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
16715 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
16716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
16717 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
16718 pass = (err != VK_SUCCESS);
16719 ASSERT_TRUE(pass);
16720 m_errorMonitor->VerifyFound();
16721
16722 // Create a native window, and then correctly create a surface:
16723 xcb_connection_t *connection;
16724 xcb_screen_t *screen;
16725 xcb_window_t xcb_window;
16726 xcb_intern_atom_reply_t *atom_wm_delete_window;
16727
16728 const xcb_setup_t *setup;
16729 xcb_screen_iterator_t iter;
16730 int scr;
16731 uint32_t value_mask, value_list[32];
16732 int width = 1;
16733 int height = 1;
16734
16735 connection = xcb_connect(NULL, &scr);
16736 ASSERT_TRUE(connection != NULL);
16737 setup = xcb_get_setup(connection);
16738 iter = xcb_setup_roots_iterator(setup);
16739 while (scr-- > 0)
16740 xcb_screen_next(&iter);
16741 screen = iter.data;
16742
16743 xcb_window = xcb_generate_id(connection);
16744
16745 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
16746 value_list[0] = screen->black_pixel;
16747 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
16748
16749 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
16750 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
16751
16752 /* Magic code that will send notification when window is destroyed */
16753 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
16754 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
16755
16756 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
16757 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
16758 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
16759 free(reply);
16760
16761 xcb_map_window(connection, xcb_window);
16762
16763 // Force the x/y coordinates to 100,100 results are identical in consecutive
16764 // runs
16765 const uint32_t coords[] = { 100, 100 };
16766 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
16767
16768 // Finally, try to correctly create a surface:
16769 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
16770 xcb_create_info.pNext = NULL;
16771 xcb_create_info.flags = 0;
16772 xcb_create_info.connection = connection;
16773 xcb_create_info.window = xcb_window;
16774 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
16775 pass = (err == VK_SUCCESS);
16776 ASSERT_TRUE(pass);
16777
16778 // Check if surface supports presentation:
16779
16780 // 1st, do so without having queried the queue families:
16781 VkBool32 supported = false;
16782 // TODO: Get the following error to come out:
16783 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16784 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
16785 "function");
16786 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
16787 pass = (err != VK_SUCCESS);
16788 // ASSERT_TRUE(pass);
16789 // m_errorMonitor->VerifyFound();
16790
16791 // Next, query a queue family index that's too large:
16792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
16793 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
16794 pass = (err != VK_SUCCESS);
16795 ASSERT_TRUE(pass);
16796 m_errorMonitor->VerifyFound();
16797
16798 // Finally, do so correctly:
16799 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
16800 // SUPPORTED
16801 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
16802 pass = (err == VK_SUCCESS);
16803 ASSERT_TRUE(pass);
16804
16805 // Before proceeding, try to create a swapchain without having called
16806 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
16807 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
16808 swapchain_create_info.pNext = NULL;
16809 swapchain_create_info.flags = 0;
16810 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16811 swapchain_create_info.surface = surface;
16812 swapchain_create_info.imageArrayLayers = 1;
16813 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
16814 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
16815 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16816 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
16817 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16818 pass = (err != VK_SUCCESS);
16819 ASSERT_TRUE(pass);
16820 m_errorMonitor->VerifyFound();
16821
16822 // Get the surface capabilities:
16823 VkSurfaceCapabilitiesKHR surface_capabilities;
16824
16825 // Do so correctly (only error logged by this entrypoint is if the
16826 // extension isn't enabled):
16827 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
16828 pass = (err == VK_SUCCESS);
16829 ASSERT_TRUE(pass);
16830
16831 // Get the surface formats:
16832 uint32_t surface_format_count;
16833
16834 // First, try without a pointer to surface_format_count:
16835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
16836 "specified as NULL");
16837 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
16838 pass = (err == VK_SUCCESS);
16839 ASSERT_TRUE(pass);
16840 m_errorMonitor->VerifyFound();
16841
16842 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
16843 // correctly done a 1st try (to get the count):
16844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
16845 surface_format_count = 0;
16846 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
16847 pass = (err == VK_SUCCESS);
16848 ASSERT_TRUE(pass);
16849 m_errorMonitor->VerifyFound();
16850
16851 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
16852 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
16853 pass = (err == VK_SUCCESS);
16854 ASSERT_TRUE(pass);
16855
16856 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
16857 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
16858
16859 // Next, do a 2nd try with surface_format_count being set too high:
16860 surface_format_count += 5;
16861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
16862 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
16863 pass = (err == VK_SUCCESS);
16864 ASSERT_TRUE(pass);
16865 m_errorMonitor->VerifyFound();
16866
16867 // Finally, do a correct 1st and 2nd try:
16868 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
16869 pass = (err == VK_SUCCESS);
16870 ASSERT_TRUE(pass);
16871 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
16872 pass = (err == VK_SUCCESS);
16873 ASSERT_TRUE(pass);
16874
16875 // Get the surface present modes:
16876 uint32_t surface_present_mode_count;
16877
16878 // First, try without a pointer to surface_format_count:
16879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
16880 "specified as NULL");
16881
16882 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
16883 pass = (err == VK_SUCCESS);
16884 ASSERT_TRUE(pass);
16885 m_errorMonitor->VerifyFound();
16886
16887 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
16888 // correctly done a 1st try (to get the count):
16889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
16890 surface_present_mode_count = 0;
16891 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
16892 (VkPresentModeKHR *)&surface_present_mode_count);
16893 pass = (err == VK_SUCCESS);
16894 ASSERT_TRUE(pass);
16895 m_errorMonitor->VerifyFound();
16896
16897 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
16898 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
16899 pass = (err == VK_SUCCESS);
16900 ASSERT_TRUE(pass);
16901
16902 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
16903 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
16904
16905 // Next, do a 2nd try with surface_format_count being set too high:
16906 surface_present_mode_count += 5;
16907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
16908 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
16909 pass = (err == VK_SUCCESS);
16910 ASSERT_TRUE(pass);
16911 m_errorMonitor->VerifyFound();
16912
16913 // Finally, do a correct 1st and 2nd try:
16914 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
16915 pass = (err == VK_SUCCESS);
16916 ASSERT_TRUE(pass);
16917 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
16918 pass = (err == VK_SUCCESS);
16919 ASSERT_TRUE(pass);
16920
16921 // Create a swapchain:
16922
16923 // First, try without a pointer to swapchain_create_info:
16924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
16925 "specified as NULL");
16926
16927 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
16928 pass = (err != VK_SUCCESS);
16929 ASSERT_TRUE(pass);
16930 m_errorMonitor->VerifyFound();
16931
16932 // Next, call with a non-NULL swapchain_create_info, that has the wrong
16933 // sType:
16934 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
16935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
16936
16937 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16938 pass = (err != VK_SUCCESS);
16939 ASSERT_TRUE(pass);
16940 m_errorMonitor->VerifyFound();
16941
16942 // Next, call with a NULL swapchain pointer:
16943 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
16944 swapchain_create_info.pNext = NULL;
16945 swapchain_create_info.flags = 0;
16946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
16947 "specified as NULL");
16948
16949 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
16950 pass = (err != VK_SUCCESS);
16951 ASSERT_TRUE(pass);
16952 m_errorMonitor->VerifyFound();
16953
16954 // TODO: Enhance swapchain layer so that
16955 // swapchain_create_info.queueFamilyIndexCount is checked against something?
16956
16957 // Next, call with a queue family index that's too large:
16958 uint32_t queueFamilyIndex[2] = { 100000, 0 };
16959 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
16960 swapchain_create_info.queueFamilyIndexCount = 2;
16961 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
16962 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
16963 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16964 pass = (err != VK_SUCCESS);
16965 ASSERT_TRUE(pass);
16966 m_errorMonitor->VerifyFound();
16967
16968 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
16969 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
16970 swapchain_create_info.queueFamilyIndexCount = 1;
16971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16972 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
16973 "pCreateInfo->pQueueFamilyIndices).");
16974 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16975 pass = (err != VK_SUCCESS);
16976 ASSERT_TRUE(pass);
16977 m_errorMonitor->VerifyFound();
16978
16979 // Next, call with an invalid imageSharingMode:
16980 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
16981 swapchain_create_info.queueFamilyIndexCount = 1;
16982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16983 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
16984 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16985 pass = (err != VK_SUCCESS);
16986 ASSERT_TRUE(pass);
16987 m_errorMonitor->VerifyFound();
16988 // Fix for the future:
16989 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
16990 // SUPPORTED
16991 swapchain_create_info.queueFamilyIndexCount = 0;
16992 queueFamilyIndex[0] = 0;
16993 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
16994
16995 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
16996 // Get the images from a swapchain:
16997 // Acquire an image from a swapchain:
16998 // Present an image to a swapchain:
16999 // Destroy the swapchain:
17000
17001 // TODOs:
17002 //
17003 // - Try destroying the device without first destroying the swapchain
17004 //
17005 // - Try destroying the device without first destroying the surface
17006 //
17007 // - Try destroying the surface without first destroying the swapchain
17008
17009 // Destroy the surface:
17010 vkDestroySurfaceKHR(instance(), surface, NULL);
17011
17012 // Tear down the window:
17013 xcb_destroy_window(connection, xcb_window);
17014 xcb_disconnect(connection);
17015
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017016#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017017 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017018#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017019}
Chris Forbes09368e42016-10-13 11:59:22 +130017020#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017021
17022//
17023// POSITIVE VALIDATION TESTS
17024//
17025// These tests do not expect to encounter ANY validation errors pass only if this is true
17026
Tobin Ehlise0006882016-11-03 10:14:28 -060017027TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017028 TEST_DESCRIPTION(
17029 "Perform an image layout transition in a secondary command buffer followed "
17030 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060017031 VkResult err;
17032 m_errorMonitor->ExpectSuccess();
17033 ASSERT_NO_FATAL_FAILURE(InitState());
17034 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17035 // Allocate a secondary and primary cmd buffer
17036 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
17037 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17038 command_buffer_allocate_info.commandPool = m_commandPool;
17039 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
17040 command_buffer_allocate_info.commandBufferCount = 1;
17041
17042 VkCommandBuffer secondary_command_buffer;
17043 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
17044 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17045 VkCommandBuffer primary_command_buffer;
17046 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
17047 VkCommandBufferBeginInfo command_buffer_begin_info = {};
17048 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
17049 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
17050 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17051 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
17052 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
17053
17054 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
17055 ASSERT_VK_SUCCESS(err);
17056 VkImageObj image(m_device);
17057 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17058 ASSERT_TRUE(image.initialized());
17059 VkImageMemoryBarrier img_barrier = {};
17060 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17061 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17062 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17063 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17064 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17065 img_barrier.image = image.handle();
17066 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17067 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17068 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17069 img_barrier.subresourceRange.baseArrayLayer = 0;
17070 img_barrier.subresourceRange.baseMipLevel = 0;
17071 img_barrier.subresourceRange.layerCount = 1;
17072 img_barrier.subresourceRange.levelCount = 1;
17073 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
17074 0, nullptr, 1, &img_barrier);
17075 err = vkEndCommandBuffer(secondary_command_buffer);
17076 ASSERT_VK_SUCCESS(err);
17077
17078 // Now update primary cmd buffer to execute secondary and transitions image
17079 command_buffer_begin_info.pInheritanceInfo = nullptr;
17080 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
17081 ASSERT_VK_SUCCESS(err);
17082 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
17083 VkImageMemoryBarrier img_barrier2 = {};
17084 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17085 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17086 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17087 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17088 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17089 img_barrier2.image = image.handle();
17090 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17091 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17092 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17093 img_barrier2.subresourceRange.baseArrayLayer = 0;
17094 img_barrier2.subresourceRange.baseMipLevel = 0;
17095 img_barrier2.subresourceRange.layerCount = 1;
17096 img_barrier2.subresourceRange.levelCount = 1;
17097 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
17098 nullptr, 1, &img_barrier2);
17099 err = vkEndCommandBuffer(primary_command_buffer);
17100 ASSERT_VK_SUCCESS(err);
17101 VkSubmitInfo submit_info = {};
17102 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17103 submit_info.commandBufferCount = 1;
17104 submit_info.pCommandBuffers = &primary_command_buffer;
17105 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
17106 ASSERT_VK_SUCCESS(err);
17107 m_errorMonitor->VerifyNotFound();
17108 err = vkDeviceWaitIdle(m_device->device());
17109 ASSERT_VK_SUCCESS(err);
17110 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &secondary_command_buffer);
17111 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &primary_command_buffer);
17112}
17113
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017114// This is a positive test. No failures are expected.
17115TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017116 TEST_DESCRIPTION(
17117 "Ensure that the vkUpdateDescriptorSets validation code "
17118 "is ignoring VkWriteDescriptorSet members that are not "
17119 "related to the descriptor type specified by "
17120 "VkWriteDescriptorSet::descriptorType. Correct "
17121 "validation behavior will result in the test running to "
17122 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017123
17124 const uintptr_t invalid_ptr = 0xcdcdcdcd;
17125
17126 ASSERT_NO_FATAL_FAILURE(InitState());
17127
17128 // Image Case
17129 {
17130 m_errorMonitor->ExpectSuccess();
17131
17132 VkImage image;
17133 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
17134 const int32_t tex_width = 32;
17135 const int32_t tex_height = 32;
17136 VkImageCreateInfo image_create_info = {};
17137 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17138 image_create_info.pNext = NULL;
17139 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17140 image_create_info.format = tex_format;
17141 image_create_info.extent.width = tex_width;
17142 image_create_info.extent.height = tex_height;
17143 image_create_info.extent.depth = 1;
17144 image_create_info.mipLevels = 1;
17145 image_create_info.arrayLayers = 1;
17146 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17147 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17148 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17149 image_create_info.flags = 0;
17150 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
17151 ASSERT_VK_SUCCESS(err);
17152
17153 VkMemoryRequirements memory_reqs;
17154 VkDeviceMemory image_memory;
17155 bool pass;
17156 VkMemoryAllocateInfo memory_info = {};
17157 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17158 memory_info.pNext = NULL;
17159 memory_info.allocationSize = 0;
17160 memory_info.memoryTypeIndex = 0;
17161 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
17162 memory_info.allocationSize = memory_reqs.size;
17163 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17164 ASSERT_TRUE(pass);
17165 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
17166 ASSERT_VK_SUCCESS(err);
17167 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
17168 ASSERT_VK_SUCCESS(err);
17169
17170 VkImageViewCreateInfo image_view_create_info = {};
17171 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
17172 image_view_create_info.image = image;
17173 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17174 image_view_create_info.format = tex_format;
17175 image_view_create_info.subresourceRange.layerCount = 1;
17176 image_view_create_info.subresourceRange.baseMipLevel = 0;
17177 image_view_create_info.subresourceRange.levelCount = 1;
17178 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17179
17180 VkImageView view;
17181 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
17182 ASSERT_VK_SUCCESS(err);
17183
17184 VkDescriptorPoolSize ds_type_count = {};
17185 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17186 ds_type_count.descriptorCount = 1;
17187
17188 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17189 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17190 ds_pool_ci.pNext = NULL;
17191 ds_pool_ci.maxSets = 1;
17192 ds_pool_ci.poolSizeCount = 1;
17193 ds_pool_ci.pPoolSizes = &ds_type_count;
17194
17195 VkDescriptorPool ds_pool;
17196 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17197 ASSERT_VK_SUCCESS(err);
17198
17199 VkDescriptorSetLayoutBinding dsl_binding = {};
17200 dsl_binding.binding = 0;
17201 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17202 dsl_binding.descriptorCount = 1;
17203 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17204 dsl_binding.pImmutableSamplers = NULL;
17205
17206 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17207 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17208 ds_layout_ci.pNext = NULL;
17209 ds_layout_ci.bindingCount = 1;
17210 ds_layout_ci.pBindings = &dsl_binding;
17211 VkDescriptorSetLayout ds_layout;
17212 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17213 ASSERT_VK_SUCCESS(err);
17214
17215 VkDescriptorSet descriptor_set;
17216 VkDescriptorSetAllocateInfo alloc_info = {};
17217 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17218 alloc_info.descriptorSetCount = 1;
17219 alloc_info.descriptorPool = ds_pool;
17220 alloc_info.pSetLayouts = &ds_layout;
17221 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17222 ASSERT_VK_SUCCESS(err);
17223
17224 VkDescriptorImageInfo image_info = {};
17225 image_info.imageView = view;
17226 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
17227
17228 VkWriteDescriptorSet descriptor_write;
17229 memset(&descriptor_write, 0, sizeof(descriptor_write));
17230 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17231 descriptor_write.dstSet = descriptor_set;
17232 descriptor_write.dstBinding = 0;
17233 descriptor_write.descriptorCount = 1;
17234 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17235 descriptor_write.pImageInfo = &image_info;
17236
17237 // Set pBufferInfo and pTexelBufferView to invalid values, which should
17238 // be
17239 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
17240 // This will most likely produce a crash if the parameter_validation
17241 // layer
17242 // does not correctly ignore pBufferInfo.
17243 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
17244 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
17245
17246 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17247
17248 m_errorMonitor->VerifyNotFound();
17249
17250 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17251 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17252 vkDestroyImageView(m_device->device(), view, NULL);
17253 vkDestroyImage(m_device->device(), image, NULL);
17254 vkFreeMemory(m_device->device(), image_memory, NULL);
17255 }
17256
17257 // Buffer Case
17258 {
17259 m_errorMonitor->ExpectSuccess();
17260
17261 VkBuffer buffer;
17262 uint32_t queue_family_index = 0;
17263 VkBufferCreateInfo buffer_create_info = {};
17264 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17265 buffer_create_info.size = 1024;
17266 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17267 buffer_create_info.queueFamilyIndexCount = 1;
17268 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
17269
17270 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
17271 ASSERT_VK_SUCCESS(err);
17272
17273 VkMemoryRequirements memory_reqs;
17274 VkDeviceMemory buffer_memory;
17275 bool pass;
17276 VkMemoryAllocateInfo memory_info = {};
17277 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17278 memory_info.pNext = NULL;
17279 memory_info.allocationSize = 0;
17280 memory_info.memoryTypeIndex = 0;
17281
17282 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
17283 memory_info.allocationSize = memory_reqs.size;
17284 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17285 ASSERT_TRUE(pass);
17286
17287 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
17288 ASSERT_VK_SUCCESS(err);
17289 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
17290 ASSERT_VK_SUCCESS(err);
17291
17292 VkDescriptorPoolSize ds_type_count = {};
17293 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17294 ds_type_count.descriptorCount = 1;
17295
17296 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17297 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17298 ds_pool_ci.pNext = NULL;
17299 ds_pool_ci.maxSets = 1;
17300 ds_pool_ci.poolSizeCount = 1;
17301 ds_pool_ci.pPoolSizes = &ds_type_count;
17302
17303 VkDescriptorPool ds_pool;
17304 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17305 ASSERT_VK_SUCCESS(err);
17306
17307 VkDescriptorSetLayoutBinding dsl_binding = {};
17308 dsl_binding.binding = 0;
17309 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17310 dsl_binding.descriptorCount = 1;
17311 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17312 dsl_binding.pImmutableSamplers = NULL;
17313
17314 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17315 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17316 ds_layout_ci.pNext = NULL;
17317 ds_layout_ci.bindingCount = 1;
17318 ds_layout_ci.pBindings = &dsl_binding;
17319 VkDescriptorSetLayout ds_layout;
17320 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17321 ASSERT_VK_SUCCESS(err);
17322
17323 VkDescriptorSet descriptor_set;
17324 VkDescriptorSetAllocateInfo alloc_info = {};
17325 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17326 alloc_info.descriptorSetCount = 1;
17327 alloc_info.descriptorPool = ds_pool;
17328 alloc_info.pSetLayouts = &ds_layout;
17329 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17330 ASSERT_VK_SUCCESS(err);
17331
17332 VkDescriptorBufferInfo buffer_info = {};
17333 buffer_info.buffer = buffer;
17334 buffer_info.offset = 0;
17335 buffer_info.range = 1024;
17336
17337 VkWriteDescriptorSet descriptor_write;
17338 memset(&descriptor_write, 0, sizeof(descriptor_write));
17339 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17340 descriptor_write.dstSet = descriptor_set;
17341 descriptor_write.dstBinding = 0;
17342 descriptor_write.descriptorCount = 1;
17343 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17344 descriptor_write.pBufferInfo = &buffer_info;
17345
17346 // Set pImageInfo and pTexelBufferView to invalid values, which should
17347 // be
17348 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
17349 // This will most likely produce a crash if the parameter_validation
17350 // layer
17351 // does not correctly ignore pImageInfo.
17352 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
17353 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
17354
17355 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17356
17357 m_errorMonitor->VerifyNotFound();
17358
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017359 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17360 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17361 vkDestroyBuffer(m_device->device(), buffer, NULL);
17362 vkFreeMemory(m_device->device(), buffer_memory, NULL);
17363 }
17364
17365 // Texel Buffer Case
17366 {
17367 m_errorMonitor->ExpectSuccess();
17368
17369 VkBuffer buffer;
17370 uint32_t queue_family_index = 0;
17371 VkBufferCreateInfo buffer_create_info = {};
17372 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17373 buffer_create_info.size = 1024;
17374 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
17375 buffer_create_info.queueFamilyIndexCount = 1;
17376 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
17377
17378 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
17379 ASSERT_VK_SUCCESS(err);
17380
17381 VkMemoryRequirements memory_reqs;
17382 VkDeviceMemory buffer_memory;
17383 bool pass;
17384 VkMemoryAllocateInfo memory_info = {};
17385 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17386 memory_info.pNext = NULL;
17387 memory_info.allocationSize = 0;
17388 memory_info.memoryTypeIndex = 0;
17389
17390 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
17391 memory_info.allocationSize = memory_reqs.size;
17392 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17393 ASSERT_TRUE(pass);
17394
17395 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
17396 ASSERT_VK_SUCCESS(err);
17397 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
17398 ASSERT_VK_SUCCESS(err);
17399
17400 VkBufferViewCreateInfo buff_view_ci = {};
17401 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
17402 buff_view_ci.buffer = buffer;
17403 buff_view_ci.format = VK_FORMAT_R8_UNORM;
17404 buff_view_ci.range = VK_WHOLE_SIZE;
17405 VkBufferView buffer_view;
17406 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
17407
17408 VkDescriptorPoolSize ds_type_count = {};
17409 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
17410 ds_type_count.descriptorCount = 1;
17411
17412 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17413 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17414 ds_pool_ci.pNext = NULL;
17415 ds_pool_ci.maxSets = 1;
17416 ds_pool_ci.poolSizeCount = 1;
17417 ds_pool_ci.pPoolSizes = &ds_type_count;
17418
17419 VkDescriptorPool ds_pool;
17420 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17421 ASSERT_VK_SUCCESS(err);
17422
17423 VkDescriptorSetLayoutBinding dsl_binding = {};
17424 dsl_binding.binding = 0;
17425 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
17426 dsl_binding.descriptorCount = 1;
17427 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17428 dsl_binding.pImmutableSamplers = NULL;
17429
17430 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17431 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17432 ds_layout_ci.pNext = NULL;
17433 ds_layout_ci.bindingCount = 1;
17434 ds_layout_ci.pBindings = &dsl_binding;
17435 VkDescriptorSetLayout ds_layout;
17436 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17437 ASSERT_VK_SUCCESS(err);
17438
17439 VkDescriptorSet descriptor_set;
17440 VkDescriptorSetAllocateInfo alloc_info = {};
17441 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17442 alloc_info.descriptorSetCount = 1;
17443 alloc_info.descriptorPool = ds_pool;
17444 alloc_info.pSetLayouts = &ds_layout;
17445 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17446 ASSERT_VK_SUCCESS(err);
17447
17448 VkWriteDescriptorSet descriptor_write;
17449 memset(&descriptor_write, 0, sizeof(descriptor_write));
17450 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17451 descriptor_write.dstSet = descriptor_set;
17452 descriptor_write.dstBinding = 0;
17453 descriptor_write.descriptorCount = 1;
17454 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
17455 descriptor_write.pTexelBufferView = &buffer_view;
17456
17457 // Set pImageInfo and pBufferInfo to invalid values, which should be
17458 // ignored for descriptorType ==
17459 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
17460 // This will most likely produce a crash if the parameter_validation
17461 // layer
17462 // does not correctly ignore pImageInfo and pBufferInfo.
17463 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
17464 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
17465
17466 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17467
17468 m_errorMonitor->VerifyNotFound();
17469
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017470 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17471 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17472 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
17473 vkDestroyBuffer(m_device->device(), buffer, NULL);
17474 vkFreeMemory(m_device->device(), buffer_memory, NULL);
17475 }
17476}
17477
Tobin Ehlisf7428442016-10-25 07:58:24 -060017478TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
17479 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
17480
17481 ASSERT_NO_FATAL_FAILURE(InitState());
17482 // Create layout where two binding #s are "1"
17483 static const uint32_t NUM_BINDINGS = 3;
17484 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
17485 dsl_binding[0].binding = 1;
17486 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17487 dsl_binding[0].descriptorCount = 1;
17488 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17489 dsl_binding[0].pImmutableSamplers = NULL;
17490 dsl_binding[1].binding = 0;
17491 dsl_binding[1].descriptorCount = 1;
17492 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17493 dsl_binding[1].descriptorCount = 1;
17494 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17495 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017496 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060017497 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17498 dsl_binding[2].descriptorCount = 1;
17499 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17500 dsl_binding[2].pImmutableSamplers = NULL;
17501
17502 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17503 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17504 ds_layout_ci.pNext = NULL;
17505 ds_layout_ci.bindingCount = NUM_BINDINGS;
17506 ds_layout_ci.pBindings = dsl_binding;
17507 VkDescriptorSetLayout ds_layout;
17508 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
17509 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17510 m_errorMonitor->VerifyFound();
17511}
17512
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060017513TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017514 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
17515
17516 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017517
Tony Barbour552f6c02016-12-21 14:34:07 -070017518 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017519
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060017520 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
17521
17522 {
17523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
17524 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
17525 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17526 m_errorMonitor->VerifyFound();
17527 }
17528
17529 {
17530 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
17531 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
17532 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17533 m_errorMonitor->VerifyFound();
17534 }
17535
17536 {
17537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
17538 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
17539 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17540 m_errorMonitor->VerifyFound();
17541 }
17542
17543 {
17544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
17545 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
17546 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17547 m_errorMonitor->VerifyFound();
17548 }
17549
17550 {
17551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
17552 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
17553 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17554 m_errorMonitor->VerifyFound();
17555 }
17556
17557 {
17558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
17559 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
17560 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17561 m_errorMonitor->VerifyFound();
17562 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017563
17564 {
17565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
17566 VkRect2D scissor = {{-1, 0}, {16, 16}};
17567 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17568 m_errorMonitor->VerifyFound();
17569 }
17570
17571 {
17572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
17573 VkRect2D scissor = {{0, -2}, {16, 16}};
17574 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17575 m_errorMonitor->VerifyFound();
17576 }
17577
17578 {
17579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
17580 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
17581 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17582 m_errorMonitor->VerifyFound();
17583 }
17584
17585 {
17586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
17587 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
17588 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17589 m_errorMonitor->VerifyFound();
17590 }
17591
Tony Barbour552f6c02016-12-21 14:34:07 -070017592 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017593}
17594
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017595// This is a positive test. No failures are expected.
17596TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
17597 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
17598 VkResult err;
17599
17600 ASSERT_NO_FATAL_FAILURE(InitState());
17601 m_errorMonitor->ExpectSuccess();
17602 VkDescriptorPoolSize ds_type_count = {};
17603 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17604 ds_type_count.descriptorCount = 2;
17605
17606 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17607 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17608 ds_pool_ci.pNext = NULL;
17609 ds_pool_ci.maxSets = 1;
17610 ds_pool_ci.poolSizeCount = 1;
17611 ds_pool_ci.pPoolSizes = &ds_type_count;
17612
17613 VkDescriptorPool ds_pool;
17614 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17615 ASSERT_VK_SUCCESS(err);
17616
17617 // Create layout with two uniform buffer descriptors w/ empty binding between them
17618 static const uint32_t NUM_BINDINGS = 3;
17619 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
17620 dsl_binding[0].binding = 0;
17621 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17622 dsl_binding[0].descriptorCount = 1;
17623 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
17624 dsl_binding[0].pImmutableSamplers = NULL;
17625 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017626 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017627 dsl_binding[2].binding = 2;
17628 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17629 dsl_binding[2].descriptorCount = 1;
17630 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
17631 dsl_binding[2].pImmutableSamplers = NULL;
17632
17633 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17634 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17635 ds_layout_ci.pNext = NULL;
17636 ds_layout_ci.bindingCount = NUM_BINDINGS;
17637 ds_layout_ci.pBindings = dsl_binding;
17638 VkDescriptorSetLayout ds_layout;
17639 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17640 ASSERT_VK_SUCCESS(err);
17641
17642 VkDescriptorSet descriptor_set = {};
17643 VkDescriptorSetAllocateInfo alloc_info = {};
17644 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17645 alloc_info.descriptorSetCount = 1;
17646 alloc_info.descriptorPool = ds_pool;
17647 alloc_info.pSetLayouts = &ds_layout;
17648 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17649 ASSERT_VK_SUCCESS(err);
17650
17651 // Create a buffer to be used for update
17652 VkBufferCreateInfo buff_ci = {};
17653 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17654 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17655 buff_ci.size = 256;
17656 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17657 VkBuffer buffer;
17658 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
17659 ASSERT_VK_SUCCESS(err);
17660 // Have to bind memory to buffer before descriptor update
17661 VkMemoryAllocateInfo mem_alloc = {};
17662 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17663 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017664 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017665 mem_alloc.memoryTypeIndex = 0;
17666
17667 VkMemoryRequirements mem_reqs;
17668 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
17669 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
17670 if (!pass) {
17671 vkDestroyBuffer(m_device->device(), buffer, NULL);
17672 return;
17673 }
17674
17675 VkDeviceMemory mem;
17676 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
17677 ASSERT_VK_SUCCESS(err);
17678 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
17679 ASSERT_VK_SUCCESS(err);
17680
17681 // Only update the descriptor at binding 2
17682 VkDescriptorBufferInfo buff_info = {};
17683 buff_info.buffer = buffer;
17684 buff_info.offset = 0;
17685 buff_info.range = VK_WHOLE_SIZE;
17686 VkWriteDescriptorSet descriptor_write = {};
17687 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17688 descriptor_write.dstBinding = 2;
17689 descriptor_write.descriptorCount = 1;
17690 descriptor_write.pTexelBufferView = nullptr;
17691 descriptor_write.pBufferInfo = &buff_info;
17692 descriptor_write.pImageInfo = nullptr;
17693 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17694 descriptor_write.dstSet = descriptor_set;
17695
17696 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17697
17698 m_errorMonitor->VerifyNotFound();
17699 // Cleanup
17700 vkFreeMemory(m_device->device(), mem, NULL);
17701 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17702 vkDestroyBuffer(m_device->device(), buffer, NULL);
17703 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17704}
17705
17706// This is a positive test. No failures are expected.
17707TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
17708 VkResult err;
17709 bool pass;
17710
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017711 TEST_DESCRIPTION(
17712 "Create a buffer, allocate memory, bind memory, destroy "
17713 "the buffer, create an image, and bind the same memory to "
17714 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017715
17716 m_errorMonitor->ExpectSuccess();
17717
17718 ASSERT_NO_FATAL_FAILURE(InitState());
17719
17720 VkBuffer buffer;
17721 VkImage image;
17722 VkDeviceMemory mem;
17723 VkMemoryRequirements mem_reqs;
17724
17725 VkBufferCreateInfo buf_info = {};
17726 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17727 buf_info.pNext = NULL;
17728 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17729 buf_info.size = 256;
17730 buf_info.queueFamilyIndexCount = 0;
17731 buf_info.pQueueFamilyIndices = NULL;
17732 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17733 buf_info.flags = 0;
17734 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
17735 ASSERT_VK_SUCCESS(err);
17736
17737 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
17738
17739 VkMemoryAllocateInfo alloc_info = {};
17740 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17741 alloc_info.pNext = NULL;
17742 alloc_info.memoryTypeIndex = 0;
17743
17744 // Ensure memory is big enough for both bindings
17745 alloc_info.allocationSize = 0x10000;
17746
17747 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
17748 if (!pass) {
17749 vkDestroyBuffer(m_device->device(), buffer, NULL);
17750 return;
17751 }
17752
17753 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
17754 ASSERT_VK_SUCCESS(err);
17755
17756 uint8_t *pData;
17757 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
17758 ASSERT_VK_SUCCESS(err);
17759
17760 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
17761
17762 vkUnmapMemory(m_device->device(), mem);
17763
17764 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
17765 ASSERT_VK_SUCCESS(err);
17766
17767 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
17768 // memory. In fact, it was never used by the GPU.
17769 // Just be be sure, wait for idle.
17770 vkDestroyBuffer(m_device->device(), buffer, NULL);
17771 vkDeviceWaitIdle(m_device->device());
17772
Tobin Ehlis6a005702016-12-28 15:25:56 -070017773 // Use optimal as some platforms report linear support but then fail image creation
17774 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
17775 VkImageFormatProperties image_format_properties;
17776 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
17777 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
17778 if (image_format_properties.maxExtent.width == 0) {
17779 printf("Image format not supported; skipped.\n");
17780 vkFreeMemory(m_device->device(), mem, NULL);
17781 return;
17782 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017783 VkImageCreateInfo image_create_info = {};
17784 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17785 image_create_info.pNext = NULL;
17786 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17787 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
17788 image_create_info.extent.width = 64;
17789 image_create_info.extent.height = 64;
17790 image_create_info.extent.depth = 1;
17791 image_create_info.mipLevels = 1;
17792 image_create_info.arrayLayers = 1;
17793 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070017794 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017795 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
17796 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17797 image_create_info.queueFamilyIndexCount = 0;
17798 image_create_info.pQueueFamilyIndices = NULL;
17799 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17800 image_create_info.flags = 0;
17801
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017802 /* Create a mappable image. It will be the texture if linear images are ok
17803 * to be textures or it will be the staging image if they are not.
17804 */
17805 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
17806 ASSERT_VK_SUCCESS(err);
17807
17808 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
17809
Tobin Ehlis6a005702016-12-28 15:25:56 -070017810 VkMemoryAllocateInfo mem_alloc = {};
17811 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17812 mem_alloc.pNext = NULL;
17813 mem_alloc.allocationSize = 0;
17814 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017815 mem_alloc.allocationSize = mem_reqs.size;
17816
17817 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
17818 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070017819 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017820 vkDestroyImage(m_device->device(), image, NULL);
17821 return;
17822 }
17823
17824 // VALIDATION FAILURE:
17825 err = vkBindImageMemory(m_device->device(), image, mem, 0);
17826 ASSERT_VK_SUCCESS(err);
17827
17828 m_errorMonitor->VerifyNotFound();
17829
17830 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017831 vkDestroyImage(m_device->device(), image, NULL);
17832}
17833
Tony Barbourab713912017-02-02 14:17:35 -070017834// This is a positive test. No failures are expected.
17835TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
17836 VkResult err;
17837
17838 TEST_DESCRIPTION(
17839 "Call all applicable destroy and free routines with NULL"
17840 "handles, expecting no validation errors");
17841
17842 m_errorMonitor->ExpectSuccess();
17843
17844 ASSERT_NO_FATAL_FAILURE(InitState());
17845 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
17846 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
17847 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
17848 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
17849 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
17850 vkDestroyDevice(VK_NULL_HANDLE, NULL);
17851 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
17852 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
17853 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
17854 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
17855 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
17856 vkDestroyInstance(VK_NULL_HANDLE, NULL);
17857 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
17858 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
17859 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
17860 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
17861 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
17862 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
17863 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
17864 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
17865
17866 VkCommandPool command_pool;
17867 VkCommandPoolCreateInfo pool_create_info{};
17868 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17869 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17870 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17871 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17872 VkCommandBuffer command_buffers[3] = {};
17873 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17874 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17875 command_buffer_allocate_info.commandPool = command_pool;
17876 command_buffer_allocate_info.commandBufferCount = 1;
17877 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17878 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
17879 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
17880 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
17881
17882 VkDescriptorPoolSize ds_type_count = {};
17883 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17884 ds_type_count.descriptorCount = 1;
17885
17886 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17887 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17888 ds_pool_ci.pNext = NULL;
17889 ds_pool_ci.maxSets = 1;
17890 ds_pool_ci.poolSizeCount = 1;
17891 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
17892 ds_pool_ci.pPoolSizes = &ds_type_count;
17893
17894 VkDescriptorPool ds_pool;
17895 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17896 ASSERT_VK_SUCCESS(err);
17897
17898 VkDescriptorSetLayoutBinding dsl_binding = {};
17899 dsl_binding.binding = 2;
17900 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17901 dsl_binding.descriptorCount = 1;
17902 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17903 dsl_binding.pImmutableSamplers = NULL;
17904 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17905 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17906 ds_layout_ci.pNext = NULL;
17907 ds_layout_ci.bindingCount = 1;
17908 ds_layout_ci.pBindings = &dsl_binding;
17909 VkDescriptorSetLayout ds_layout;
17910 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17911 ASSERT_VK_SUCCESS(err);
17912
17913 VkDescriptorSet descriptor_sets[3] = {};
17914 VkDescriptorSetAllocateInfo alloc_info = {};
17915 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17916 alloc_info.descriptorSetCount = 1;
17917 alloc_info.descriptorPool = ds_pool;
17918 alloc_info.pSetLayouts = &ds_layout;
17919 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
17920 ASSERT_VK_SUCCESS(err);
17921 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
17922 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17923 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17924
17925 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
17926
17927 m_errorMonitor->VerifyNotFound();
17928}
17929
Tony Barbour626994c2017-02-08 15:29:37 -070017930TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070017931 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070017932
17933 m_errorMonitor->ExpectSuccess();
17934
17935 ASSERT_NO_FATAL_FAILURE(InitState());
17936 VkCommandBuffer cmd_bufs[4];
17937 VkCommandBufferAllocateInfo alloc_info;
17938 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17939 alloc_info.pNext = NULL;
17940 alloc_info.commandBufferCount = 4;
17941 alloc_info.commandPool = m_commandPool;
17942 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17943 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
17944 VkImageObj image(m_device);
17945 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17946 ASSERT_TRUE(image.initialized());
17947 VkCommandBufferBeginInfo cb_binfo;
17948 cb_binfo.pNext = NULL;
17949 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17950 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
17951 cb_binfo.flags = 0;
17952 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
17953 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
17954 VkImageMemoryBarrier img_barrier = {};
17955 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17956 img_barrier.pNext = NULL;
17957 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17958 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17959 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17960 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
17961 img_barrier.image = image.handle();
17962 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17963 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17964 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17965 img_barrier.subresourceRange.baseArrayLayer = 0;
17966 img_barrier.subresourceRange.baseMipLevel = 0;
17967 img_barrier.subresourceRange.layerCount = 1;
17968 img_barrier.subresourceRange.levelCount = 1;
17969 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17970 &img_barrier);
17971 vkEndCommandBuffer(cmd_bufs[0]);
17972 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
17973 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
17974 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17975 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17976 &img_barrier);
17977 vkEndCommandBuffer(cmd_bufs[1]);
17978 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
17979 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17980 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
17981 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17982 &img_barrier);
17983 vkEndCommandBuffer(cmd_bufs[2]);
17984 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
17985 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
17986 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
17987 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17988 &img_barrier);
17989 vkEndCommandBuffer(cmd_bufs[3]);
17990
17991 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
17992 VkSemaphore semaphore1, semaphore2;
17993 VkSemaphoreCreateInfo semaphore_create_info{};
17994 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
17995 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
17996 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
17997 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
17998 VkSubmitInfo submit_info[3];
17999 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18000 submit_info[0].pNext = nullptr;
18001 submit_info[0].commandBufferCount = 1;
18002 submit_info[0].pCommandBuffers = &cmd_bufs[0];
18003 submit_info[0].signalSemaphoreCount = 1;
18004 submit_info[0].pSignalSemaphores = &semaphore1;
18005 submit_info[0].waitSemaphoreCount = 0;
18006 submit_info[0].pWaitDstStageMask = nullptr;
18007 submit_info[0].pWaitDstStageMask = flags;
18008 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18009 submit_info[1].pNext = nullptr;
18010 submit_info[1].commandBufferCount = 1;
18011 submit_info[1].pCommandBuffers = &cmd_bufs[1];
18012 submit_info[1].waitSemaphoreCount = 1;
18013 submit_info[1].pWaitSemaphores = &semaphore1;
18014 submit_info[1].signalSemaphoreCount = 1;
18015 submit_info[1].pSignalSemaphores = &semaphore2;
18016 submit_info[1].pWaitDstStageMask = flags;
18017 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18018 submit_info[2].pNext = nullptr;
18019 submit_info[2].commandBufferCount = 2;
18020 submit_info[2].pCommandBuffers = &cmd_bufs[2];
18021 submit_info[2].waitSemaphoreCount = 1;
18022 submit_info[2].pWaitSemaphores = &semaphore2;
18023 submit_info[2].signalSemaphoreCount = 0;
18024 submit_info[2].pSignalSemaphores = nullptr;
18025 submit_info[2].pWaitDstStageMask = flags;
18026 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
18027 vkQueueWaitIdle(m_device->m_queue);
18028
18029 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
18030 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
18031 m_errorMonitor->VerifyNotFound();
18032}
18033
Tobin Ehlis953e8392016-11-17 10:54:13 -070018034TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
18035 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
18036 // We previously had a bug where dynamic offset of inactive bindings was still being used
18037 VkResult err;
18038 m_errorMonitor->ExpectSuccess();
18039
18040 ASSERT_NO_FATAL_FAILURE(InitState());
18041 ASSERT_NO_FATAL_FAILURE(InitViewport());
18042 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18043
18044 VkDescriptorPoolSize ds_type_count = {};
18045 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
18046 ds_type_count.descriptorCount = 3;
18047
18048 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18049 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18050 ds_pool_ci.pNext = NULL;
18051 ds_pool_ci.maxSets = 1;
18052 ds_pool_ci.poolSizeCount = 1;
18053 ds_pool_ci.pPoolSizes = &ds_type_count;
18054
18055 VkDescriptorPool ds_pool;
18056 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18057 ASSERT_VK_SUCCESS(err);
18058
18059 const uint32_t BINDING_COUNT = 3;
18060 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070018061 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070018062 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
18063 dsl_binding[0].descriptorCount = 1;
18064 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18065 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070018066 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070018067 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
18068 dsl_binding[1].descriptorCount = 1;
18069 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18070 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070018071 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070018072 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
18073 dsl_binding[2].descriptorCount = 1;
18074 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18075 dsl_binding[2].pImmutableSamplers = NULL;
18076
18077 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18078 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18079 ds_layout_ci.pNext = NULL;
18080 ds_layout_ci.bindingCount = BINDING_COUNT;
18081 ds_layout_ci.pBindings = dsl_binding;
18082 VkDescriptorSetLayout ds_layout;
18083 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18084 ASSERT_VK_SUCCESS(err);
18085
18086 VkDescriptorSet descriptor_set;
18087 VkDescriptorSetAllocateInfo alloc_info = {};
18088 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18089 alloc_info.descriptorSetCount = 1;
18090 alloc_info.descriptorPool = ds_pool;
18091 alloc_info.pSetLayouts = &ds_layout;
18092 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18093 ASSERT_VK_SUCCESS(err);
18094
18095 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
18096 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
18097 pipeline_layout_ci.pNext = NULL;
18098 pipeline_layout_ci.setLayoutCount = 1;
18099 pipeline_layout_ci.pSetLayouts = &ds_layout;
18100
18101 VkPipelineLayout pipeline_layout;
18102 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
18103 ASSERT_VK_SUCCESS(err);
18104
18105 // Create two buffers to update the descriptors with
18106 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
18107 uint32_t qfi = 0;
18108 VkBufferCreateInfo buffCI = {};
18109 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18110 buffCI.size = 2048;
18111 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18112 buffCI.queueFamilyIndexCount = 1;
18113 buffCI.pQueueFamilyIndices = &qfi;
18114
18115 VkBuffer dyub1;
18116 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
18117 ASSERT_VK_SUCCESS(err);
18118 // buffer2
18119 buffCI.size = 1024;
18120 VkBuffer dyub2;
18121 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
18122 ASSERT_VK_SUCCESS(err);
18123 // Allocate memory and bind to buffers
18124 VkMemoryAllocateInfo mem_alloc[2] = {};
18125 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18126 mem_alloc[0].pNext = NULL;
18127 mem_alloc[0].memoryTypeIndex = 0;
18128 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18129 mem_alloc[1].pNext = NULL;
18130 mem_alloc[1].memoryTypeIndex = 0;
18131
18132 VkMemoryRequirements mem_reqs1;
18133 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
18134 VkMemoryRequirements mem_reqs2;
18135 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
18136 mem_alloc[0].allocationSize = mem_reqs1.size;
18137 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
18138 mem_alloc[1].allocationSize = mem_reqs2.size;
18139 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
18140 if (!pass) {
18141 vkDestroyBuffer(m_device->device(), dyub1, NULL);
18142 vkDestroyBuffer(m_device->device(), dyub2, NULL);
18143 return;
18144 }
18145
18146 VkDeviceMemory mem1;
18147 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
18148 ASSERT_VK_SUCCESS(err);
18149 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
18150 ASSERT_VK_SUCCESS(err);
18151 VkDeviceMemory mem2;
18152 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
18153 ASSERT_VK_SUCCESS(err);
18154 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
18155 ASSERT_VK_SUCCESS(err);
18156 // Update descriptors
18157 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
18158 buff_info[0].buffer = dyub1;
18159 buff_info[0].offset = 0;
18160 buff_info[0].range = 256;
18161 buff_info[1].buffer = dyub1;
18162 buff_info[1].offset = 256;
18163 buff_info[1].range = 512;
18164 buff_info[2].buffer = dyub2;
18165 buff_info[2].offset = 0;
18166 buff_info[2].range = 512;
18167
18168 VkWriteDescriptorSet descriptor_write;
18169 memset(&descriptor_write, 0, sizeof(descriptor_write));
18170 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18171 descriptor_write.dstSet = descriptor_set;
18172 descriptor_write.dstBinding = 0;
18173 descriptor_write.descriptorCount = BINDING_COUNT;
18174 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
18175 descriptor_write.pBufferInfo = buff_info;
18176
18177 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18178
Tony Barbour552f6c02016-12-21 14:34:07 -070018179 m_commandBuffer->BeginCommandBuffer();
18180 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070018181
18182 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018183 char const *vsSource =
18184 "#version 450\n"
18185 "\n"
18186 "out gl_PerVertex { \n"
18187 " vec4 gl_Position;\n"
18188 "};\n"
18189 "void main(){\n"
18190 " gl_Position = vec4(1);\n"
18191 "}\n";
18192 char const *fsSource =
18193 "#version 450\n"
18194 "\n"
18195 "layout(location=0) out vec4 x;\n"
18196 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
18197 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
18198 "void main(){\n"
18199 " x = vec4(bar1.y) + vec4(bar2.y);\n"
18200 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070018201 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
18202 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
18203 VkPipelineObj pipe(m_device);
18204 pipe.SetViewport(m_viewports);
18205 pipe.SetScissor(m_scissors);
18206 pipe.AddShader(&vs);
18207 pipe.AddShader(&fs);
18208 pipe.AddColorAttachment();
18209 pipe.CreateVKPipeline(pipeline_layout, renderPass());
18210
18211 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
18212 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
18213 // we used to have a bug in this case.
18214 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
18215 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
18216 &descriptor_set, BINDING_COUNT, dyn_off);
18217 Draw(1, 0, 0, 0);
18218 m_errorMonitor->VerifyNotFound();
18219
18220 vkDestroyBuffer(m_device->device(), dyub1, NULL);
18221 vkDestroyBuffer(m_device->device(), dyub2, NULL);
18222 vkFreeMemory(m_device->device(), mem1, NULL);
18223 vkFreeMemory(m_device->device(), mem2, NULL);
18224
18225 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
18226 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18227 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18228}
18229
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018230TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018231 TEST_DESCRIPTION(
18232 "Ensure that validations handling of non-coherent memory "
18233 "mapping while using VK_WHOLE_SIZE does not cause access "
18234 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018235 VkResult err;
18236 uint8_t *pData;
18237 ASSERT_NO_FATAL_FAILURE(InitState());
18238
18239 VkDeviceMemory mem;
18240 VkMemoryRequirements mem_reqs;
18241 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018242 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018243 VkMemoryAllocateInfo alloc_info = {};
18244 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18245 alloc_info.pNext = NULL;
18246 alloc_info.memoryTypeIndex = 0;
18247
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018248 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018249 alloc_info.allocationSize = allocation_size;
18250
18251 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
18252 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018253 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018254 if (!pass) {
18255 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018256 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
18257 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018258 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018259 pass = m_device->phy().set_memory_type(
18260 mem_reqs.memoryTypeBits, &alloc_info,
18261 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
18262 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018263 if (!pass) {
18264 return;
18265 }
18266 }
18267 }
18268
18269 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
18270 ASSERT_VK_SUCCESS(err);
18271
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018272 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018273 m_errorMonitor->ExpectSuccess();
18274 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
18275 ASSERT_VK_SUCCESS(err);
18276 VkMappedMemoryRange mmr = {};
18277 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18278 mmr.memory = mem;
18279 mmr.offset = 0;
18280 mmr.size = VK_WHOLE_SIZE;
18281 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18282 ASSERT_VK_SUCCESS(err);
18283 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
18284 ASSERT_VK_SUCCESS(err);
18285 m_errorMonitor->VerifyNotFound();
18286 vkUnmapMemory(m_device->device(), mem);
18287
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018288 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018289 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018290 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018291 ASSERT_VK_SUCCESS(err);
18292 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18293 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018294 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018295 mmr.size = VK_WHOLE_SIZE;
18296 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18297 ASSERT_VK_SUCCESS(err);
18298 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
18299 ASSERT_VK_SUCCESS(err);
18300 m_errorMonitor->VerifyNotFound();
18301 vkUnmapMemory(m_device->device(), mem);
18302
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018303 // Map with offset and size
18304 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018305 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018306 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018307 ASSERT_VK_SUCCESS(err);
18308 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18309 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018310 mmr.offset = 4 * atom_size;
18311 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018312 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18313 ASSERT_VK_SUCCESS(err);
18314 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
18315 ASSERT_VK_SUCCESS(err);
18316 m_errorMonitor->VerifyNotFound();
18317 vkUnmapMemory(m_device->device(), mem);
18318
18319 // Map without offset and flush WHOLE_SIZE with two separate offsets
18320 m_errorMonitor->ExpectSuccess();
18321 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
18322 ASSERT_VK_SUCCESS(err);
18323 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18324 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018325 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018326 mmr.size = VK_WHOLE_SIZE;
18327 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18328 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018329 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018330 mmr.size = VK_WHOLE_SIZE;
18331 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18332 ASSERT_VK_SUCCESS(err);
18333 m_errorMonitor->VerifyNotFound();
18334 vkUnmapMemory(m_device->device(), mem);
18335
18336 vkFreeMemory(m_device->device(), mem, NULL);
18337}
18338
18339// This is a positive test. We used to expect error in this case but spec now allows it
18340TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
18341 m_errorMonitor->ExpectSuccess();
18342 vk_testing::Fence testFence;
18343 VkFenceCreateInfo fenceInfo = {};
18344 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18345 fenceInfo.pNext = NULL;
18346
18347 ASSERT_NO_FATAL_FAILURE(InitState());
18348 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018349 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018350 VkResult result = vkResetFences(m_device->device(), 1, fences);
18351 ASSERT_VK_SUCCESS(result);
18352
18353 m_errorMonitor->VerifyNotFound();
18354}
18355
18356TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
18357 m_errorMonitor->ExpectSuccess();
18358
18359 ASSERT_NO_FATAL_FAILURE(InitState());
18360 VkResult err;
18361
18362 // Record (empty!) command buffer that can be submitted multiple times
18363 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018364 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
18365 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018366 m_commandBuffer->BeginCommandBuffer(&cbbi);
18367 m_commandBuffer->EndCommandBuffer();
18368
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018369 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018370 VkFence fence;
18371 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
18372 ASSERT_VK_SUCCESS(err);
18373
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018374 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018375 VkSemaphore s1, s2;
18376 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
18377 ASSERT_VK_SUCCESS(err);
18378 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
18379 ASSERT_VK_SUCCESS(err);
18380
18381 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018382 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018383 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
18384 ASSERT_VK_SUCCESS(err);
18385
18386 // Submit CB again, signaling s2.
18387 si.pSignalSemaphores = &s2;
18388 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
18389 ASSERT_VK_SUCCESS(err);
18390
18391 // Wait for fence.
18392 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18393 ASSERT_VK_SUCCESS(err);
18394
18395 // CB is still in flight from second submission, but semaphore s1 is no
18396 // longer in flight. delete it.
18397 vkDestroySemaphore(m_device->device(), s1, nullptr);
18398
18399 m_errorMonitor->VerifyNotFound();
18400
18401 // Force device idle and clean up remaining objects
18402 vkDeviceWaitIdle(m_device->device());
18403 vkDestroySemaphore(m_device->device(), s2, nullptr);
18404 vkDestroyFence(m_device->device(), fence, nullptr);
18405}
18406
18407TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
18408 m_errorMonitor->ExpectSuccess();
18409
18410 ASSERT_NO_FATAL_FAILURE(InitState());
18411 VkResult err;
18412
18413 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018414 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018415 VkFence f1;
18416 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
18417 ASSERT_VK_SUCCESS(err);
18418
18419 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018420 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018421 VkFence f2;
18422 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
18423 ASSERT_VK_SUCCESS(err);
18424
18425 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018426 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018427 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
18428
18429 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018430 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018431 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
18432
18433 // Should have both retired!
18434 vkDestroyFence(m_device->device(), f1, nullptr);
18435 vkDestroyFence(m_device->device(), f2, nullptr);
18436
18437 m_errorMonitor->VerifyNotFound();
18438}
18439
18440TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018441 TEST_DESCRIPTION(
18442 "Verify that creating an image view from an image with valid usage "
18443 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018444
18445 ASSERT_NO_FATAL_FAILURE(InitState());
18446
18447 m_errorMonitor->ExpectSuccess();
18448 // Verify that we can create a view with usage INPUT_ATTACHMENT
18449 VkImageObj image(m_device);
18450 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18451 ASSERT_TRUE(image.initialized());
18452 VkImageView imageView;
18453 VkImageViewCreateInfo ivci = {};
18454 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18455 ivci.image = image.handle();
18456 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
18457 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
18458 ivci.subresourceRange.layerCount = 1;
18459 ivci.subresourceRange.baseMipLevel = 0;
18460 ivci.subresourceRange.levelCount = 1;
18461 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18462
18463 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
18464 m_errorMonitor->VerifyNotFound();
18465 vkDestroyImageView(m_device->device(), imageView, NULL);
18466}
18467
18468// This is a positive test. No failures are expected.
18469TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018470 TEST_DESCRIPTION(
18471 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
18472 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018473
18474 ASSERT_NO_FATAL_FAILURE(InitState());
18475
18476 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018477 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018478
18479 m_errorMonitor->ExpectSuccess();
18480
18481 VkImage image;
18482 VkImageCreateInfo image_create_info = {};
18483 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18484 image_create_info.pNext = NULL;
18485 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18486 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18487 image_create_info.extent.width = 64;
18488 image_create_info.extent.height = 64;
18489 image_create_info.extent.depth = 1;
18490 image_create_info.mipLevels = 1;
18491 image_create_info.arrayLayers = 1;
18492 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18493 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18494 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
18495 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
18496 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18497 ASSERT_VK_SUCCESS(err);
18498
18499 VkMemoryRequirements memory_reqs;
18500 VkDeviceMemory memory_one, memory_two;
18501 bool pass;
18502 VkMemoryAllocateInfo memory_info = {};
18503 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18504 memory_info.pNext = NULL;
18505 memory_info.allocationSize = 0;
18506 memory_info.memoryTypeIndex = 0;
18507 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18508 // Find an image big enough to allow sparse mapping of 2 memory regions
18509 // Increase the image size until it is at least twice the
18510 // size of the required alignment, to ensure we can bind both
18511 // allocated memory blocks to the image on aligned offsets.
18512 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
18513 vkDestroyImage(m_device->device(), image, nullptr);
18514 image_create_info.extent.width *= 2;
18515 image_create_info.extent.height *= 2;
18516 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
18517 ASSERT_VK_SUCCESS(err);
18518 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18519 }
18520 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
18521 // at the end of the first
18522 memory_info.allocationSize = memory_reqs.alignment;
18523 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18524 ASSERT_TRUE(pass);
18525 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
18526 ASSERT_VK_SUCCESS(err);
18527 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
18528 ASSERT_VK_SUCCESS(err);
18529 VkSparseMemoryBind binds[2];
18530 binds[0].flags = 0;
18531 binds[0].memory = memory_one;
18532 binds[0].memoryOffset = 0;
18533 binds[0].resourceOffset = 0;
18534 binds[0].size = memory_info.allocationSize;
18535 binds[1].flags = 0;
18536 binds[1].memory = memory_two;
18537 binds[1].memoryOffset = 0;
18538 binds[1].resourceOffset = memory_info.allocationSize;
18539 binds[1].size = memory_info.allocationSize;
18540
18541 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
18542 opaqueBindInfo.image = image;
18543 opaqueBindInfo.bindCount = 2;
18544 opaqueBindInfo.pBinds = binds;
18545
18546 VkFence fence = VK_NULL_HANDLE;
18547 VkBindSparseInfo bindSparseInfo = {};
18548 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
18549 bindSparseInfo.imageOpaqueBindCount = 1;
18550 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
18551
18552 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
18553 vkQueueWaitIdle(m_device->m_queue);
18554 vkDestroyImage(m_device->device(), image, NULL);
18555 vkFreeMemory(m_device->device(), memory_one, NULL);
18556 vkFreeMemory(m_device->device(), memory_two, NULL);
18557 m_errorMonitor->VerifyNotFound();
18558}
18559
18560TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018561 TEST_DESCRIPTION(
18562 "Ensure that CmdBeginRenderPass with an attachment's "
18563 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
18564 "the command buffer has prior knowledge of that "
18565 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018566
18567 m_errorMonitor->ExpectSuccess();
18568
18569 ASSERT_NO_FATAL_FAILURE(InitState());
18570
18571 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018572 VkAttachmentDescription attachment = {0,
18573 VK_FORMAT_R8G8B8A8_UNORM,
18574 VK_SAMPLE_COUNT_1_BIT,
18575 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18576 VK_ATTACHMENT_STORE_OP_STORE,
18577 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18578 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18579 VK_IMAGE_LAYOUT_UNDEFINED,
18580 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018581
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018582 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018583
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018584 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018585
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018586 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018587
18588 VkRenderPass rp;
18589 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18590 ASSERT_VK_SUCCESS(err);
18591
18592 // A compatible framebuffer.
18593 VkImageObj image(m_device);
18594 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18595 ASSERT_TRUE(image.initialized());
18596
18597 VkImageViewCreateInfo ivci = {
18598 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18599 nullptr,
18600 0,
18601 image.handle(),
18602 VK_IMAGE_VIEW_TYPE_2D,
18603 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018604 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
18605 VK_COMPONENT_SWIZZLE_IDENTITY},
18606 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018607 };
18608 VkImageView view;
18609 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18610 ASSERT_VK_SUCCESS(err);
18611
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018612 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018613 VkFramebuffer fb;
18614 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18615 ASSERT_VK_SUCCESS(err);
18616
18617 // Record a single command buffer which uses this renderpass twice. The
18618 // bug is triggered at the beginning of the second renderpass, when the
18619 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018620 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Tony Barbour552f6c02016-12-21 14:34:07 -070018621 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018622 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18623 vkCmdEndRenderPass(m_commandBuffer->handle());
18624 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18625
18626 m_errorMonitor->VerifyNotFound();
18627
18628 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070018629 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018630
18631 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18632 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18633 vkDestroyImageView(m_device->device(), view, nullptr);
18634}
18635
18636TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018637 TEST_DESCRIPTION(
18638 "This test should pass. Create a Framebuffer and "
18639 "command buffer, bind them together, then destroy "
18640 "command pool and framebuffer and verify there are no "
18641 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018642
18643 m_errorMonitor->ExpectSuccess();
18644
18645 ASSERT_NO_FATAL_FAILURE(InitState());
18646
18647 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018648 VkAttachmentDescription attachment = {0,
18649 VK_FORMAT_R8G8B8A8_UNORM,
18650 VK_SAMPLE_COUNT_1_BIT,
18651 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18652 VK_ATTACHMENT_STORE_OP_STORE,
18653 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18654 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18655 VK_IMAGE_LAYOUT_UNDEFINED,
18656 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018657
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018658 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018659
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018660 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018661
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018662 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018663
18664 VkRenderPass rp;
18665 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18666 ASSERT_VK_SUCCESS(err);
18667
18668 // A compatible framebuffer.
18669 VkImageObj image(m_device);
18670 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18671 ASSERT_TRUE(image.initialized());
18672
18673 VkImageViewCreateInfo ivci = {
18674 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18675 nullptr,
18676 0,
18677 image.handle(),
18678 VK_IMAGE_VIEW_TYPE_2D,
18679 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018680 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
18681 VK_COMPONENT_SWIZZLE_IDENTITY},
18682 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018683 };
18684 VkImageView view;
18685 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18686 ASSERT_VK_SUCCESS(err);
18687
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018688 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018689 VkFramebuffer fb;
18690 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18691 ASSERT_VK_SUCCESS(err);
18692
18693 // Explicitly create a command buffer to bind the FB to so that we can then
18694 // destroy the command pool in order to implicitly free command buffer
18695 VkCommandPool command_pool;
18696 VkCommandPoolCreateInfo pool_create_info{};
18697 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18698 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18699 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18700 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18701
18702 VkCommandBuffer command_buffer;
18703 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18704 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18705 command_buffer_allocate_info.commandPool = command_pool;
18706 command_buffer_allocate_info.commandBufferCount = 1;
18707 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18708 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
18709
18710 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018711 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018712 VkCommandBufferBeginInfo begin_info{};
18713 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18714 vkBeginCommandBuffer(command_buffer, &begin_info);
18715
18716 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18717 vkCmdEndRenderPass(command_buffer);
18718 vkEndCommandBuffer(command_buffer);
18719 vkDestroyImageView(m_device->device(), view, nullptr);
18720 // Destroy command pool to implicitly free command buffer
18721 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18722 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18723 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18724 m_errorMonitor->VerifyNotFound();
18725}
18726
18727TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018728 TEST_DESCRIPTION(
18729 "Ensure that CmdBeginRenderPass applies the layout "
18730 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018731
18732 m_errorMonitor->ExpectSuccess();
18733
18734 ASSERT_NO_FATAL_FAILURE(InitState());
18735
18736 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018737 VkAttachmentDescription attachment = {0,
18738 VK_FORMAT_R8G8B8A8_UNORM,
18739 VK_SAMPLE_COUNT_1_BIT,
18740 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18741 VK_ATTACHMENT_STORE_OP_STORE,
18742 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18743 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18744 VK_IMAGE_LAYOUT_UNDEFINED,
18745 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018746
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018747 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018748
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018749 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018750
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018751 VkSubpassDependency dep = {0,
18752 0,
18753 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18754 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18755 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18756 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18757 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018758
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018759 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018760
18761 VkResult err;
18762 VkRenderPass rp;
18763 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18764 ASSERT_VK_SUCCESS(err);
18765
18766 // A compatible framebuffer.
18767 VkImageObj image(m_device);
18768 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18769 ASSERT_TRUE(image.initialized());
18770
18771 VkImageViewCreateInfo ivci = {
18772 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18773 nullptr,
18774 0,
18775 image.handle(),
18776 VK_IMAGE_VIEW_TYPE_2D,
18777 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018778 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
18779 VK_COMPONENT_SWIZZLE_IDENTITY},
18780 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018781 };
18782 VkImageView view;
18783 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18784 ASSERT_VK_SUCCESS(err);
18785
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018786 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018787 VkFramebuffer fb;
18788 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18789 ASSERT_VK_SUCCESS(err);
18790
18791 // Record a single command buffer which issues a pipeline barrier w/
18792 // image memory barrier for the attachment. This detects the previously
18793 // missing tracking of the subpass layout by throwing a validation error
18794 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018795 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Tony Barbour552f6c02016-12-21 14:34:07 -070018796 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018797 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18798
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018799 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
18800 nullptr,
18801 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18802 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18803 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
18804 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
18805 VK_QUEUE_FAMILY_IGNORED,
18806 VK_QUEUE_FAMILY_IGNORED,
18807 image.handle(),
18808 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018809 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018810 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
18811 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018812
18813 vkCmdEndRenderPass(m_commandBuffer->handle());
18814 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070018815 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018816
18817 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18818 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18819 vkDestroyImageView(m_device->device(), view, nullptr);
18820}
18821
18822TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018823 TEST_DESCRIPTION(
18824 "Validate that when an imageView of a depth/stencil image "
18825 "is used as a depth/stencil framebuffer attachment, the "
18826 "aspectMask is ignored and both depth and stencil image "
18827 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018828
18829 VkFormatProperties format_properties;
18830 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
18831 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
18832 return;
18833 }
18834
18835 m_errorMonitor->ExpectSuccess();
18836
18837 ASSERT_NO_FATAL_FAILURE(InitState());
18838
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018839 VkAttachmentDescription attachment = {0,
18840 VK_FORMAT_D32_SFLOAT_S8_UINT,
18841 VK_SAMPLE_COUNT_1_BIT,
18842 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18843 VK_ATTACHMENT_STORE_OP_STORE,
18844 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18845 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18846 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
18847 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018848
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018849 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018850
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018851 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018852
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018853 VkSubpassDependency dep = {0,
18854 0,
18855 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18856 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18857 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18858 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18859 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018860
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018861 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018862
18863 VkResult err;
18864 VkRenderPass rp;
18865 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18866 ASSERT_VK_SUCCESS(err);
18867
18868 VkImageObj image(m_device);
18869 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018870 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018871 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018872 ASSERT_TRUE(image.initialized());
18873 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
18874
18875 VkImageViewCreateInfo ivci = {
18876 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18877 nullptr,
18878 0,
18879 image.handle(),
18880 VK_IMAGE_VIEW_TYPE_2D,
18881 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018882 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
18883 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018884 };
18885 VkImageView view;
18886 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18887 ASSERT_VK_SUCCESS(err);
18888
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018889 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018890 VkFramebuffer fb;
18891 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18892 ASSERT_VK_SUCCESS(err);
18893
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018894 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Tony Barbour552f6c02016-12-21 14:34:07 -070018895 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018896 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18897
18898 VkImageMemoryBarrier imb = {};
18899 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18900 imb.pNext = nullptr;
18901 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
18902 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18903 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18904 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18905 imb.srcQueueFamilyIndex = 0;
18906 imb.dstQueueFamilyIndex = 0;
18907 imb.image = image.handle();
18908 imb.subresourceRange.aspectMask = 0x6;
18909 imb.subresourceRange.baseMipLevel = 0;
18910 imb.subresourceRange.levelCount = 0x1;
18911 imb.subresourceRange.baseArrayLayer = 0;
18912 imb.subresourceRange.layerCount = 0x1;
18913
18914 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018915 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
18916 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018917
18918 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070018919 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018920 QueueCommandBuffer(false);
18921 m_errorMonitor->VerifyNotFound();
18922
18923 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18924 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18925 vkDestroyImageView(m_device->device(), view, nullptr);
18926}
18927
18928TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018929 TEST_DESCRIPTION(
18930 "Ensure that layout transitions work correctly without "
18931 "errors, when an attachment reference is "
18932 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018933
18934 m_errorMonitor->ExpectSuccess();
18935
18936 ASSERT_NO_FATAL_FAILURE(InitState());
18937
18938 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018939 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018940
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018941 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018942
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018943 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018944
18945 VkRenderPass rp;
18946 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18947 ASSERT_VK_SUCCESS(err);
18948
18949 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018950 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018951 VkFramebuffer fb;
18952 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18953 ASSERT_VK_SUCCESS(err);
18954
18955 // Record a command buffer which just begins and ends the renderpass. The
18956 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018957 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Tony Barbour552f6c02016-12-21 14:34:07 -070018958 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018959 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18960 vkCmdEndRenderPass(m_commandBuffer->handle());
18961 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070018962 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018963
18964 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18965 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18966}
18967
18968// This is a positive test. No errors are expected.
18969TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018970 TEST_DESCRIPTION(
18971 "Create a stencil-only attachment with a LOAD_OP set to "
18972 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018973 VkResult result = VK_SUCCESS;
18974 VkImageFormatProperties formatProps;
18975 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018976 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
18977 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018978 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
18979 return;
18980 }
18981
18982 ASSERT_NO_FATAL_FAILURE(InitState());
18983 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
18984 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018985 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018986 VkAttachmentDescription att = {};
18987 VkAttachmentReference ref = {};
18988 att.format = depth_stencil_fmt;
18989 att.samples = VK_SAMPLE_COUNT_1_BIT;
18990 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
18991 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
18992 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
18993 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
18994 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18995 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18996
18997 VkClearValue clear;
18998 clear.depthStencil.depth = 1.0;
18999 clear.depthStencil.stencil = 0;
19000 ref.attachment = 0;
19001 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19002
19003 VkSubpassDescription subpass = {};
19004 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
19005 subpass.flags = 0;
19006 subpass.inputAttachmentCount = 0;
19007 subpass.pInputAttachments = NULL;
19008 subpass.colorAttachmentCount = 0;
19009 subpass.pColorAttachments = NULL;
19010 subpass.pResolveAttachments = NULL;
19011 subpass.pDepthStencilAttachment = &ref;
19012 subpass.preserveAttachmentCount = 0;
19013 subpass.pPreserveAttachments = NULL;
19014
19015 VkRenderPass rp;
19016 VkRenderPassCreateInfo rp_info = {};
19017 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
19018 rp_info.attachmentCount = 1;
19019 rp_info.pAttachments = &att;
19020 rp_info.subpassCount = 1;
19021 rp_info.pSubpasses = &subpass;
19022 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
19023 ASSERT_VK_SUCCESS(result);
19024
19025 VkImageView *depthView = m_depthStencil->BindInfo();
19026 VkFramebufferCreateInfo fb_info = {};
19027 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
19028 fb_info.pNext = NULL;
19029 fb_info.renderPass = rp;
19030 fb_info.attachmentCount = 1;
19031 fb_info.pAttachments = depthView;
19032 fb_info.width = 100;
19033 fb_info.height = 100;
19034 fb_info.layers = 1;
19035 VkFramebuffer fb;
19036 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
19037 ASSERT_VK_SUCCESS(result);
19038
19039 VkRenderPassBeginInfo rpbinfo = {};
19040 rpbinfo.clearValueCount = 1;
19041 rpbinfo.pClearValues = &clear;
19042 rpbinfo.pNext = NULL;
19043 rpbinfo.renderPass = rp;
19044 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
19045 rpbinfo.renderArea.extent.width = 100;
19046 rpbinfo.renderArea.extent.height = 100;
19047 rpbinfo.renderArea.offset.x = 0;
19048 rpbinfo.renderArea.offset.y = 0;
19049 rpbinfo.framebuffer = fb;
19050
19051 VkFence fence = {};
19052 VkFenceCreateInfo fence_ci = {};
19053 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19054 fence_ci.pNext = nullptr;
19055 fence_ci.flags = 0;
19056 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
19057 ASSERT_VK_SUCCESS(result);
19058
19059 m_commandBuffer->BeginCommandBuffer();
19060 m_commandBuffer->BeginRenderPass(rpbinfo);
19061 m_commandBuffer->EndRenderPass();
19062 m_commandBuffer->EndCommandBuffer();
19063 m_commandBuffer->QueueCommandBuffer(fence);
19064
19065 VkImageObj destImage(m_device);
19066 destImage.init(100, 100, depth_stencil_fmt, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019067 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019068 VkImageMemoryBarrier barrier = {};
19069 VkImageSubresourceRange range;
19070 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19071 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
19072 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
19073 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19074 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19075 barrier.image = m_depthStencil->handle();
19076 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19077 range.baseMipLevel = 0;
19078 range.levelCount = 1;
19079 range.baseArrayLayer = 0;
19080 range.layerCount = 1;
19081 barrier.subresourceRange = range;
19082 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19083 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
19084 cmdbuf.BeginCommandBuffer();
19085 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019086 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019087 barrier.srcAccessMask = 0;
19088 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
19089 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19090 barrier.image = destImage.handle();
19091 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
19092 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019093 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019094 VkImageCopy cregion;
19095 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19096 cregion.srcSubresource.mipLevel = 0;
19097 cregion.srcSubresource.baseArrayLayer = 0;
19098 cregion.srcSubresource.layerCount = 1;
19099 cregion.srcOffset.x = 0;
19100 cregion.srcOffset.y = 0;
19101 cregion.srcOffset.z = 0;
19102 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19103 cregion.dstSubresource.mipLevel = 0;
19104 cregion.dstSubresource.baseArrayLayer = 0;
19105 cregion.dstSubresource.layerCount = 1;
19106 cregion.dstOffset.x = 0;
19107 cregion.dstOffset.y = 0;
19108 cregion.dstOffset.z = 0;
19109 cregion.extent.width = 100;
19110 cregion.extent.height = 100;
19111 cregion.extent.depth = 1;
19112 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019113 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019114 cmdbuf.EndCommandBuffer();
19115
19116 VkSubmitInfo submit_info;
19117 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19118 submit_info.pNext = NULL;
19119 submit_info.waitSemaphoreCount = 0;
19120 submit_info.pWaitSemaphores = NULL;
19121 submit_info.pWaitDstStageMask = NULL;
19122 submit_info.commandBufferCount = 1;
19123 submit_info.pCommandBuffers = &cmdbuf.handle();
19124 submit_info.signalSemaphoreCount = 0;
19125 submit_info.pSignalSemaphores = NULL;
19126
19127 m_errorMonitor->ExpectSuccess();
19128 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19129 m_errorMonitor->VerifyNotFound();
19130
19131 vkQueueWaitIdle(m_device->m_queue);
19132 vkDestroyFence(m_device->device(), fence, nullptr);
19133 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19134 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19135}
19136
19137// This is a positive test. No errors should be generated.
19138TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
19139 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
19140
19141 m_errorMonitor->ExpectSuccess();
19142 ASSERT_NO_FATAL_FAILURE(InitState());
19143
19144 VkEvent event;
19145 VkEventCreateInfo event_create_info{};
19146 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
19147 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
19148
19149 VkCommandPool command_pool;
19150 VkCommandPoolCreateInfo pool_create_info{};
19151 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19152 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19153 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19154 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19155
19156 VkCommandBuffer command_buffer;
19157 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19158 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19159 command_buffer_allocate_info.commandPool = command_pool;
19160 command_buffer_allocate_info.commandBufferCount = 1;
19161 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19162 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
19163
19164 VkQueue queue = VK_NULL_HANDLE;
19165 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
19166
19167 {
19168 VkCommandBufferBeginInfo begin_info{};
19169 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19170 vkBeginCommandBuffer(command_buffer, &begin_info);
19171
19172 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019173 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019174 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
19175 vkEndCommandBuffer(command_buffer);
19176 }
19177 {
19178 VkSubmitInfo submit_info{};
19179 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19180 submit_info.commandBufferCount = 1;
19181 submit_info.pCommandBuffers = &command_buffer;
19182 submit_info.signalSemaphoreCount = 0;
19183 submit_info.pSignalSemaphores = nullptr;
19184 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19185 }
19186 { vkSetEvent(m_device->device(), event); }
19187
19188 vkQueueWaitIdle(queue);
19189
19190 vkDestroyEvent(m_device->device(), event, nullptr);
19191 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
19192 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19193
19194 m_errorMonitor->VerifyNotFound();
19195}
19196// This is a positive test. No errors should be generated.
19197TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
19198 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
19199
19200 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019201 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019202
19203 m_errorMonitor->ExpectSuccess();
19204
19205 VkQueryPool query_pool;
19206 VkQueryPoolCreateInfo query_pool_create_info{};
19207 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
19208 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
19209 query_pool_create_info.queryCount = 1;
19210 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
19211
19212 VkCommandPool command_pool;
19213 VkCommandPoolCreateInfo pool_create_info{};
19214 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19215 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19216 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19217 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19218
19219 VkCommandBuffer command_buffer;
19220 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19221 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19222 command_buffer_allocate_info.commandPool = command_pool;
19223 command_buffer_allocate_info.commandBufferCount = 1;
19224 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19225 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
19226
19227 VkCommandBuffer secondary_command_buffer;
19228 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19229 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
19230
19231 VkQueue queue = VK_NULL_HANDLE;
19232 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19233
19234 uint32_t qfi = 0;
19235 VkBufferCreateInfo buff_create_info = {};
19236 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19237 buff_create_info.size = 1024;
19238 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
19239 buff_create_info.queueFamilyIndexCount = 1;
19240 buff_create_info.pQueueFamilyIndices = &qfi;
19241
19242 VkResult err;
19243 VkBuffer buffer;
19244 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
19245 ASSERT_VK_SUCCESS(err);
19246 VkMemoryAllocateInfo mem_alloc = {};
19247 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19248 mem_alloc.pNext = NULL;
19249 mem_alloc.allocationSize = 1024;
19250 mem_alloc.memoryTypeIndex = 0;
19251
19252 VkMemoryRequirements memReqs;
19253 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
19254 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
19255 if (!pass) {
19256 vkDestroyBuffer(m_device->device(), buffer, NULL);
19257 return;
19258 }
19259
19260 VkDeviceMemory mem;
19261 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19262 ASSERT_VK_SUCCESS(err);
19263 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19264 ASSERT_VK_SUCCESS(err);
19265
19266 VkCommandBufferInheritanceInfo hinfo = {};
19267 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19268 hinfo.renderPass = VK_NULL_HANDLE;
19269 hinfo.subpass = 0;
19270 hinfo.framebuffer = VK_NULL_HANDLE;
19271 hinfo.occlusionQueryEnable = VK_FALSE;
19272 hinfo.queryFlags = 0;
19273 hinfo.pipelineStatistics = 0;
19274
19275 {
19276 VkCommandBufferBeginInfo begin_info{};
19277 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19278 begin_info.pInheritanceInfo = &hinfo;
19279 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
19280
19281 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
19282 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
19283
19284 vkEndCommandBuffer(secondary_command_buffer);
19285
19286 begin_info.pInheritanceInfo = nullptr;
19287 vkBeginCommandBuffer(command_buffer, &begin_info);
19288
19289 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
19290 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
19291
19292 vkEndCommandBuffer(command_buffer);
19293 }
19294 {
19295 VkSubmitInfo submit_info{};
19296 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19297 submit_info.commandBufferCount = 1;
19298 submit_info.pCommandBuffers = &command_buffer;
19299 submit_info.signalSemaphoreCount = 0;
19300 submit_info.pSignalSemaphores = nullptr;
19301 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19302 }
19303
19304 vkQueueWaitIdle(queue);
19305
19306 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
19307 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
19308 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
19309 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19310 vkDestroyBuffer(m_device->device(), buffer, NULL);
19311 vkFreeMemory(m_device->device(), mem, NULL);
19312
19313 m_errorMonitor->VerifyNotFound();
19314}
19315
19316// This is a positive test. No errors should be generated.
19317TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
19318 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
19319
19320 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019321 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019322
19323 m_errorMonitor->ExpectSuccess();
19324
19325 VkQueryPool query_pool;
19326 VkQueryPoolCreateInfo query_pool_create_info{};
19327 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
19328 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
19329 query_pool_create_info.queryCount = 1;
19330 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
19331
19332 VkCommandPool command_pool;
19333 VkCommandPoolCreateInfo pool_create_info{};
19334 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19335 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19336 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19337 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19338
19339 VkCommandBuffer command_buffer[2];
19340 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19341 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19342 command_buffer_allocate_info.commandPool = command_pool;
19343 command_buffer_allocate_info.commandBufferCount = 2;
19344 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19345 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19346
19347 VkQueue queue = VK_NULL_HANDLE;
19348 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19349
19350 uint32_t qfi = 0;
19351 VkBufferCreateInfo buff_create_info = {};
19352 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19353 buff_create_info.size = 1024;
19354 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
19355 buff_create_info.queueFamilyIndexCount = 1;
19356 buff_create_info.pQueueFamilyIndices = &qfi;
19357
19358 VkResult err;
19359 VkBuffer buffer;
19360 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
19361 ASSERT_VK_SUCCESS(err);
19362 VkMemoryAllocateInfo mem_alloc = {};
19363 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19364 mem_alloc.pNext = NULL;
19365 mem_alloc.allocationSize = 1024;
19366 mem_alloc.memoryTypeIndex = 0;
19367
19368 VkMemoryRequirements memReqs;
19369 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
19370 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
19371 if (!pass) {
19372 vkDestroyBuffer(m_device->device(), buffer, NULL);
19373 return;
19374 }
19375
19376 VkDeviceMemory mem;
19377 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19378 ASSERT_VK_SUCCESS(err);
19379 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19380 ASSERT_VK_SUCCESS(err);
19381
19382 {
19383 VkCommandBufferBeginInfo begin_info{};
19384 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19385 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19386
19387 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
19388 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
19389
19390 vkEndCommandBuffer(command_buffer[0]);
19391
19392 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19393
19394 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
19395
19396 vkEndCommandBuffer(command_buffer[1]);
19397 }
19398 {
19399 VkSubmitInfo submit_info{};
19400 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19401 submit_info.commandBufferCount = 2;
19402 submit_info.pCommandBuffers = command_buffer;
19403 submit_info.signalSemaphoreCount = 0;
19404 submit_info.pSignalSemaphores = nullptr;
19405 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19406 }
19407
19408 vkQueueWaitIdle(queue);
19409
19410 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
19411 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
19412 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19413 vkDestroyBuffer(m_device->device(), buffer, NULL);
19414 vkFreeMemory(m_device->device(), mem, NULL);
19415
19416 m_errorMonitor->VerifyNotFound();
19417}
19418
Tony Barbourc46924f2016-11-04 11:49:52 -060019419TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019420 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
19421
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019422 ASSERT_NO_FATAL_FAILURE(InitState());
19423 VkEvent event;
19424 VkEventCreateInfo event_create_info{};
19425 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
19426 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
19427
19428 VkCommandPool command_pool;
19429 VkCommandPoolCreateInfo pool_create_info{};
19430 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19431 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19432 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19433 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19434
19435 VkCommandBuffer command_buffer;
19436 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19437 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19438 command_buffer_allocate_info.commandPool = command_pool;
19439 command_buffer_allocate_info.commandBufferCount = 1;
19440 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19441 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
19442
19443 VkQueue queue = VK_NULL_HANDLE;
19444 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
19445
19446 {
19447 VkCommandBufferBeginInfo begin_info{};
19448 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19449 vkBeginCommandBuffer(command_buffer, &begin_info);
19450
19451 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019452 vkEndCommandBuffer(command_buffer);
19453 }
19454 {
19455 VkSubmitInfo submit_info{};
19456 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19457 submit_info.commandBufferCount = 1;
19458 submit_info.pCommandBuffers = &command_buffer;
19459 submit_info.signalSemaphoreCount = 0;
19460 submit_info.pSignalSemaphores = nullptr;
19461 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19462 }
19463 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19465 "that is already in use by a "
19466 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019467 vkSetEvent(m_device->device(), event);
19468 m_errorMonitor->VerifyFound();
19469 }
19470
19471 vkQueueWaitIdle(queue);
19472
19473 vkDestroyEvent(m_device->device(), event, nullptr);
19474 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
19475 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19476}
19477
19478// This is a positive test. No errors should be generated.
19479TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019480 TEST_DESCRIPTION(
19481 "Two command buffers with two separate fences are each "
19482 "run through a Submit & WaitForFences cycle 3 times. This "
19483 "previously revealed a bug so running this positive test "
19484 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019485 m_errorMonitor->ExpectSuccess();
19486
19487 ASSERT_NO_FATAL_FAILURE(InitState());
19488 VkQueue queue = VK_NULL_HANDLE;
19489 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
19490
19491 static const uint32_t NUM_OBJECTS = 2;
19492 static const uint32_t NUM_FRAMES = 3;
19493 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
19494 VkFence fences[NUM_OBJECTS] = {};
19495
19496 VkCommandPool cmd_pool;
19497 VkCommandPoolCreateInfo cmd_pool_ci = {};
19498 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19499 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
19500 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19501 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
19502 ASSERT_VK_SUCCESS(err);
19503
19504 VkCommandBufferAllocateInfo cmd_buf_info = {};
19505 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19506 cmd_buf_info.commandPool = cmd_pool;
19507 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19508 cmd_buf_info.commandBufferCount = 1;
19509
19510 VkFenceCreateInfo fence_ci = {};
19511 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19512 fence_ci.pNext = nullptr;
19513 fence_ci.flags = 0;
19514
19515 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
19516 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
19517 ASSERT_VK_SUCCESS(err);
19518 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
19519 ASSERT_VK_SUCCESS(err);
19520 }
19521
19522 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
19523 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
19524 // Create empty cmd buffer
19525 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
19526 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19527
19528 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
19529 ASSERT_VK_SUCCESS(err);
19530 err = vkEndCommandBuffer(cmd_buffers[obj]);
19531 ASSERT_VK_SUCCESS(err);
19532
19533 VkSubmitInfo submit_info = {};
19534 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19535 submit_info.commandBufferCount = 1;
19536 submit_info.pCommandBuffers = &cmd_buffers[obj];
19537 // Submit cmd buffer and wait for fence
19538 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
19539 ASSERT_VK_SUCCESS(err);
19540 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
19541 ASSERT_VK_SUCCESS(err);
19542 err = vkResetFences(m_device->device(), 1, &fences[obj]);
19543 ASSERT_VK_SUCCESS(err);
19544 }
19545 }
19546 m_errorMonitor->VerifyNotFound();
19547 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
19548 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
19549 vkDestroyFence(m_device->device(), fences[i], nullptr);
19550 }
19551}
19552// This is a positive test. No errors should be generated.
19553TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019554 TEST_DESCRIPTION(
19555 "Two command buffers, each in a separate QueueSubmit call "
19556 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019557
19558 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019559 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019560
19561 m_errorMonitor->ExpectSuccess();
19562
19563 VkSemaphore semaphore;
19564 VkSemaphoreCreateInfo semaphore_create_info{};
19565 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19566 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19567
19568 VkCommandPool command_pool;
19569 VkCommandPoolCreateInfo pool_create_info{};
19570 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19571 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19572 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19573 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19574
19575 VkCommandBuffer command_buffer[2];
19576 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19577 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19578 command_buffer_allocate_info.commandPool = command_pool;
19579 command_buffer_allocate_info.commandBufferCount = 2;
19580 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19581 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19582
19583 VkQueue queue = VK_NULL_HANDLE;
19584 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19585
19586 {
19587 VkCommandBufferBeginInfo begin_info{};
19588 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19589 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19590
19591 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019592 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019593
19594 VkViewport viewport{};
19595 viewport.maxDepth = 1.0f;
19596 viewport.minDepth = 0.0f;
19597 viewport.width = 512;
19598 viewport.height = 512;
19599 viewport.x = 0;
19600 viewport.y = 0;
19601 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19602 vkEndCommandBuffer(command_buffer[0]);
19603 }
19604 {
19605 VkCommandBufferBeginInfo begin_info{};
19606 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19607 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19608
19609 VkViewport viewport{};
19610 viewport.maxDepth = 1.0f;
19611 viewport.minDepth = 0.0f;
19612 viewport.width = 512;
19613 viewport.height = 512;
19614 viewport.x = 0;
19615 viewport.y = 0;
19616 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19617 vkEndCommandBuffer(command_buffer[1]);
19618 }
19619 {
19620 VkSubmitInfo submit_info{};
19621 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19622 submit_info.commandBufferCount = 1;
19623 submit_info.pCommandBuffers = &command_buffer[0];
19624 submit_info.signalSemaphoreCount = 1;
19625 submit_info.pSignalSemaphores = &semaphore;
19626 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19627 }
19628 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019629 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019630 VkSubmitInfo submit_info{};
19631 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19632 submit_info.commandBufferCount = 1;
19633 submit_info.pCommandBuffers = &command_buffer[1];
19634 submit_info.waitSemaphoreCount = 1;
19635 submit_info.pWaitSemaphores = &semaphore;
19636 submit_info.pWaitDstStageMask = flags;
19637 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19638 }
19639
19640 vkQueueWaitIdle(m_device->m_queue);
19641
19642 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19643 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19644 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19645
19646 m_errorMonitor->VerifyNotFound();
19647}
19648
19649// This is a positive test. No errors should be generated.
19650TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019651 TEST_DESCRIPTION(
19652 "Two command buffers, each in a separate QueueSubmit call "
19653 "submitted on separate queues, the second having a fence"
19654 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019655
19656 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019657 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019658
19659 m_errorMonitor->ExpectSuccess();
19660
19661 VkFence fence;
19662 VkFenceCreateInfo fence_create_info{};
19663 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19664 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19665
19666 VkSemaphore semaphore;
19667 VkSemaphoreCreateInfo semaphore_create_info{};
19668 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19669 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19670
19671 VkCommandPool command_pool;
19672 VkCommandPoolCreateInfo pool_create_info{};
19673 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19674 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19675 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19676 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19677
19678 VkCommandBuffer command_buffer[2];
19679 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19680 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19681 command_buffer_allocate_info.commandPool = command_pool;
19682 command_buffer_allocate_info.commandBufferCount = 2;
19683 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19684 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19685
19686 VkQueue queue = VK_NULL_HANDLE;
19687 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19688
19689 {
19690 VkCommandBufferBeginInfo begin_info{};
19691 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19692 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19693
19694 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019695 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019696
19697 VkViewport viewport{};
19698 viewport.maxDepth = 1.0f;
19699 viewport.minDepth = 0.0f;
19700 viewport.width = 512;
19701 viewport.height = 512;
19702 viewport.x = 0;
19703 viewport.y = 0;
19704 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19705 vkEndCommandBuffer(command_buffer[0]);
19706 }
19707 {
19708 VkCommandBufferBeginInfo begin_info{};
19709 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19710 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19711
19712 VkViewport viewport{};
19713 viewport.maxDepth = 1.0f;
19714 viewport.minDepth = 0.0f;
19715 viewport.width = 512;
19716 viewport.height = 512;
19717 viewport.x = 0;
19718 viewport.y = 0;
19719 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19720 vkEndCommandBuffer(command_buffer[1]);
19721 }
19722 {
19723 VkSubmitInfo submit_info{};
19724 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19725 submit_info.commandBufferCount = 1;
19726 submit_info.pCommandBuffers = &command_buffer[0];
19727 submit_info.signalSemaphoreCount = 1;
19728 submit_info.pSignalSemaphores = &semaphore;
19729 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19730 }
19731 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019732 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019733 VkSubmitInfo submit_info{};
19734 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19735 submit_info.commandBufferCount = 1;
19736 submit_info.pCommandBuffers = &command_buffer[1];
19737 submit_info.waitSemaphoreCount = 1;
19738 submit_info.pWaitSemaphores = &semaphore;
19739 submit_info.pWaitDstStageMask = flags;
19740 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19741 }
19742
19743 vkQueueWaitIdle(m_device->m_queue);
19744
19745 vkDestroyFence(m_device->device(), fence, nullptr);
19746 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19747 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19748 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19749
19750 m_errorMonitor->VerifyNotFound();
19751}
19752
19753// This is a positive test. No errors should be generated.
19754TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019755 TEST_DESCRIPTION(
19756 "Two command buffers, each in a separate QueueSubmit call "
19757 "submitted on separate queues, the second having a fence"
19758 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019759
19760 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019761 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019762
19763 m_errorMonitor->ExpectSuccess();
19764
19765 VkFence fence;
19766 VkFenceCreateInfo fence_create_info{};
19767 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19768 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19769
19770 VkSemaphore semaphore;
19771 VkSemaphoreCreateInfo semaphore_create_info{};
19772 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19773 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19774
19775 VkCommandPool command_pool;
19776 VkCommandPoolCreateInfo pool_create_info{};
19777 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19778 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19779 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19780 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19781
19782 VkCommandBuffer command_buffer[2];
19783 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19784 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19785 command_buffer_allocate_info.commandPool = command_pool;
19786 command_buffer_allocate_info.commandBufferCount = 2;
19787 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19788 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19789
19790 VkQueue queue = VK_NULL_HANDLE;
19791 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19792
19793 {
19794 VkCommandBufferBeginInfo begin_info{};
19795 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19796 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19797
19798 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019799 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019800
19801 VkViewport viewport{};
19802 viewport.maxDepth = 1.0f;
19803 viewport.minDepth = 0.0f;
19804 viewport.width = 512;
19805 viewport.height = 512;
19806 viewport.x = 0;
19807 viewport.y = 0;
19808 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19809 vkEndCommandBuffer(command_buffer[0]);
19810 }
19811 {
19812 VkCommandBufferBeginInfo begin_info{};
19813 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19814 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19815
19816 VkViewport viewport{};
19817 viewport.maxDepth = 1.0f;
19818 viewport.minDepth = 0.0f;
19819 viewport.width = 512;
19820 viewport.height = 512;
19821 viewport.x = 0;
19822 viewport.y = 0;
19823 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19824 vkEndCommandBuffer(command_buffer[1]);
19825 }
19826 {
19827 VkSubmitInfo submit_info{};
19828 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19829 submit_info.commandBufferCount = 1;
19830 submit_info.pCommandBuffers = &command_buffer[0];
19831 submit_info.signalSemaphoreCount = 1;
19832 submit_info.pSignalSemaphores = &semaphore;
19833 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19834 }
19835 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019836 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019837 VkSubmitInfo submit_info{};
19838 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19839 submit_info.commandBufferCount = 1;
19840 submit_info.pCommandBuffers = &command_buffer[1];
19841 submit_info.waitSemaphoreCount = 1;
19842 submit_info.pWaitSemaphores = &semaphore;
19843 submit_info.pWaitDstStageMask = flags;
19844 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19845 }
19846
19847 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19848 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19849
19850 vkDestroyFence(m_device->device(), fence, nullptr);
19851 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19852 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19853 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19854
19855 m_errorMonitor->VerifyNotFound();
19856}
19857
19858TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019859 ASSERT_NO_FATAL_FAILURE(InitState());
19860 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
19861 printf("Test requires two queues, skipping\n");
19862 return;
19863 }
19864
19865 VkResult err;
19866
19867 m_errorMonitor->ExpectSuccess();
19868
19869 VkQueue q0 = m_device->m_queue;
19870 VkQueue q1 = nullptr;
19871 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
19872 ASSERT_NE(q1, nullptr);
19873
19874 // An (empty) command buffer. We must have work in the first submission --
19875 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019876 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019877 VkCommandPool pool;
19878 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
19879 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019880 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
19881 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019882 VkCommandBuffer cb;
19883 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
19884 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019885 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019886 err = vkBeginCommandBuffer(cb, &cbbi);
19887 ASSERT_VK_SUCCESS(err);
19888 err = vkEndCommandBuffer(cb);
19889 ASSERT_VK_SUCCESS(err);
19890
19891 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019892 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019893 VkSemaphore s;
19894 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
19895 ASSERT_VK_SUCCESS(err);
19896
19897 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019898 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019899
19900 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
19901 ASSERT_VK_SUCCESS(err);
19902
19903 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019904 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019905 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019906
19907 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
19908 ASSERT_VK_SUCCESS(err);
19909
19910 // Wait for q0 idle
19911 err = vkQueueWaitIdle(q0);
19912 ASSERT_VK_SUCCESS(err);
19913
19914 // Command buffer should have been completed (it was on q0); reset the pool.
19915 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
19916
19917 m_errorMonitor->VerifyNotFound();
19918
19919 // Force device completely idle and clean up resources
19920 vkDeviceWaitIdle(m_device->device());
19921 vkDestroyCommandPool(m_device->device(), pool, nullptr);
19922 vkDestroySemaphore(m_device->device(), s, nullptr);
19923}
19924
19925// This is a positive test. No errors should be generated.
19926TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019927 TEST_DESCRIPTION(
19928 "Two command buffers, each in a separate QueueSubmit call "
19929 "submitted on separate queues, the second having a fence, "
19930 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019931
19932 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019933 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019934
19935 m_errorMonitor->ExpectSuccess();
19936
19937 ASSERT_NO_FATAL_FAILURE(InitState());
19938 VkFence fence;
19939 VkFenceCreateInfo fence_create_info{};
19940 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19941 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19942
19943 VkSemaphore semaphore;
19944 VkSemaphoreCreateInfo semaphore_create_info{};
19945 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19946 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19947
19948 VkCommandPool command_pool;
19949 VkCommandPoolCreateInfo pool_create_info{};
19950 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19951 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19952 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19953 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19954
19955 VkCommandBuffer command_buffer[2];
19956 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19957 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19958 command_buffer_allocate_info.commandPool = command_pool;
19959 command_buffer_allocate_info.commandBufferCount = 2;
19960 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19961 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19962
19963 VkQueue queue = VK_NULL_HANDLE;
19964 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19965
19966 {
19967 VkCommandBufferBeginInfo begin_info{};
19968 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19969 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19970
19971 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019972 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019973
19974 VkViewport viewport{};
19975 viewport.maxDepth = 1.0f;
19976 viewport.minDepth = 0.0f;
19977 viewport.width = 512;
19978 viewport.height = 512;
19979 viewport.x = 0;
19980 viewport.y = 0;
19981 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19982 vkEndCommandBuffer(command_buffer[0]);
19983 }
19984 {
19985 VkCommandBufferBeginInfo begin_info{};
19986 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19987 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19988
19989 VkViewport viewport{};
19990 viewport.maxDepth = 1.0f;
19991 viewport.minDepth = 0.0f;
19992 viewport.width = 512;
19993 viewport.height = 512;
19994 viewport.x = 0;
19995 viewport.y = 0;
19996 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19997 vkEndCommandBuffer(command_buffer[1]);
19998 }
19999 {
20000 VkSubmitInfo submit_info{};
20001 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20002 submit_info.commandBufferCount = 1;
20003 submit_info.pCommandBuffers = &command_buffer[0];
20004 submit_info.signalSemaphoreCount = 1;
20005 submit_info.pSignalSemaphores = &semaphore;
20006 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20007 }
20008 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020009 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020010 VkSubmitInfo submit_info{};
20011 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20012 submit_info.commandBufferCount = 1;
20013 submit_info.pCommandBuffers = &command_buffer[1];
20014 submit_info.waitSemaphoreCount = 1;
20015 submit_info.pWaitSemaphores = &semaphore;
20016 submit_info.pWaitDstStageMask = flags;
20017 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
20018 }
20019
20020 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20021
20022 vkDestroyFence(m_device->device(), fence, nullptr);
20023 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
20024 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20025 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20026
20027 m_errorMonitor->VerifyNotFound();
20028}
20029
20030// This is a positive test. No errors should be generated.
20031TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020032 TEST_DESCRIPTION(
20033 "Two command buffers, each in a separate QueueSubmit call "
20034 "on the same queue, sharing a signal/wait semaphore, the "
20035 "second having a fence, "
20036 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020037
20038 m_errorMonitor->ExpectSuccess();
20039
20040 ASSERT_NO_FATAL_FAILURE(InitState());
20041 VkFence fence;
20042 VkFenceCreateInfo fence_create_info{};
20043 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20044 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20045
20046 VkSemaphore semaphore;
20047 VkSemaphoreCreateInfo semaphore_create_info{};
20048 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20049 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
20050
20051 VkCommandPool command_pool;
20052 VkCommandPoolCreateInfo pool_create_info{};
20053 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20054 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20055 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20056 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20057
20058 VkCommandBuffer command_buffer[2];
20059 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20060 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20061 command_buffer_allocate_info.commandPool = command_pool;
20062 command_buffer_allocate_info.commandBufferCount = 2;
20063 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20064 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20065
20066 {
20067 VkCommandBufferBeginInfo begin_info{};
20068 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20069 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20070
20071 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020072 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020073
20074 VkViewport viewport{};
20075 viewport.maxDepth = 1.0f;
20076 viewport.minDepth = 0.0f;
20077 viewport.width = 512;
20078 viewport.height = 512;
20079 viewport.x = 0;
20080 viewport.y = 0;
20081 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20082 vkEndCommandBuffer(command_buffer[0]);
20083 }
20084 {
20085 VkCommandBufferBeginInfo begin_info{};
20086 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20087 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20088
20089 VkViewport viewport{};
20090 viewport.maxDepth = 1.0f;
20091 viewport.minDepth = 0.0f;
20092 viewport.width = 512;
20093 viewport.height = 512;
20094 viewport.x = 0;
20095 viewport.y = 0;
20096 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20097 vkEndCommandBuffer(command_buffer[1]);
20098 }
20099 {
20100 VkSubmitInfo submit_info{};
20101 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20102 submit_info.commandBufferCount = 1;
20103 submit_info.pCommandBuffers = &command_buffer[0];
20104 submit_info.signalSemaphoreCount = 1;
20105 submit_info.pSignalSemaphores = &semaphore;
20106 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20107 }
20108 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020109 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020110 VkSubmitInfo submit_info{};
20111 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20112 submit_info.commandBufferCount = 1;
20113 submit_info.pCommandBuffers = &command_buffer[1];
20114 submit_info.waitSemaphoreCount = 1;
20115 submit_info.pWaitSemaphores = &semaphore;
20116 submit_info.pWaitDstStageMask = flags;
20117 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
20118 }
20119
20120 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20121
20122 vkDestroyFence(m_device->device(), fence, nullptr);
20123 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
20124 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20125 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20126
20127 m_errorMonitor->VerifyNotFound();
20128}
20129
20130// This is a positive test. No errors should be generated.
20131TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020132 TEST_DESCRIPTION(
20133 "Two command buffers, each in a separate QueueSubmit call "
20134 "on the same queue, no fences, followed by a third QueueSubmit with NO "
20135 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020136
20137 m_errorMonitor->ExpectSuccess();
20138
20139 ASSERT_NO_FATAL_FAILURE(InitState());
20140 VkFence fence;
20141 VkFenceCreateInfo fence_create_info{};
20142 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20143 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20144
20145 VkCommandPool command_pool;
20146 VkCommandPoolCreateInfo pool_create_info{};
20147 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20148 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20149 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20150 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20151
20152 VkCommandBuffer command_buffer[2];
20153 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20154 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20155 command_buffer_allocate_info.commandPool = command_pool;
20156 command_buffer_allocate_info.commandBufferCount = 2;
20157 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20158 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20159
20160 {
20161 VkCommandBufferBeginInfo begin_info{};
20162 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20163 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20164
20165 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020166 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020167
20168 VkViewport viewport{};
20169 viewport.maxDepth = 1.0f;
20170 viewport.minDepth = 0.0f;
20171 viewport.width = 512;
20172 viewport.height = 512;
20173 viewport.x = 0;
20174 viewport.y = 0;
20175 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20176 vkEndCommandBuffer(command_buffer[0]);
20177 }
20178 {
20179 VkCommandBufferBeginInfo begin_info{};
20180 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20181 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20182
20183 VkViewport viewport{};
20184 viewport.maxDepth = 1.0f;
20185 viewport.minDepth = 0.0f;
20186 viewport.width = 512;
20187 viewport.height = 512;
20188 viewport.x = 0;
20189 viewport.y = 0;
20190 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20191 vkEndCommandBuffer(command_buffer[1]);
20192 }
20193 {
20194 VkSubmitInfo submit_info{};
20195 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20196 submit_info.commandBufferCount = 1;
20197 submit_info.pCommandBuffers = &command_buffer[0];
20198 submit_info.signalSemaphoreCount = 0;
20199 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
20200 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20201 }
20202 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020203 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020204 VkSubmitInfo submit_info{};
20205 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20206 submit_info.commandBufferCount = 1;
20207 submit_info.pCommandBuffers = &command_buffer[1];
20208 submit_info.waitSemaphoreCount = 0;
20209 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
20210 submit_info.pWaitDstStageMask = flags;
20211 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20212 }
20213
20214 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
20215
20216 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20217 ASSERT_VK_SUCCESS(err);
20218
20219 vkDestroyFence(m_device->device(), fence, nullptr);
20220 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20221 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20222
20223 m_errorMonitor->VerifyNotFound();
20224}
20225
20226// This is a positive test. No errors should be generated.
20227TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020228 TEST_DESCRIPTION(
20229 "Two command buffers, each in a separate QueueSubmit call "
20230 "on the same queue, the second having a fence, followed "
20231 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020232
20233 m_errorMonitor->ExpectSuccess();
20234
20235 ASSERT_NO_FATAL_FAILURE(InitState());
20236 VkFence fence;
20237 VkFenceCreateInfo fence_create_info{};
20238 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20239 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20240
20241 VkCommandPool command_pool;
20242 VkCommandPoolCreateInfo pool_create_info{};
20243 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20244 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20245 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20246 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20247
20248 VkCommandBuffer command_buffer[2];
20249 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20250 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20251 command_buffer_allocate_info.commandPool = command_pool;
20252 command_buffer_allocate_info.commandBufferCount = 2;
20253 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20254 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20255
20256 {
20257 VkCommandBufferBeginInfo begin_info{};
20258 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20259 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20260
20261 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020262 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020263
20264 VkViewport viewport{};
20265 viewport.maxDepth = 1.0f;
20266 viewport.minDepth = 0.0f;
20267 viewport.width = 512;
20268 viewport.height = 512;
20269 viewport.x = 0;
20270 viewport.y = 0;
20271 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20272 vkEndCommandBuffer(command_buffer[0]);
20273 }
20274 {
20275 VkCommandBufferBeginInfo begin_info{};
20276 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20277 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20278
20279 VkViewport viewport{};
20280 viewport.maxDepth = 1.0f;
20281 viewport.minDepth = 0.0f;
20282 viewport.width = 512;
20283 viewport.height = 512;
20284 viewport.x = 0;
20285 viewport.y = 0;
20286 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20287 vkEndCommandBuffer(command_buffer[1]);
20288 }
20289 {
20290 VkSubmitInfo submit_info{};
20291 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20292 submit_info.commandBufferCount = 1;
20293 submit_info.pCommandBuffers = &command_buffer[0];
20294 submit_info.signalSemaphoreCount = 0;
20295 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
20296 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20297 }
20298 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020299 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020300 VkSubmitInfo submit_info{};
20301 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20302 submit_info.commandBufferCount = 1;
20303 submit_info.pCommandBuffers = &command_buffer[1];
20304 submit_info.waitSemaphoreCount = 0;
20305 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
20306 submit_info.pWaitDstStageMask = flags;
20307 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
20308 }
20309
20310 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20311
20312 vkDestroyFence(m_device->device(), fence, nullptr);
20313 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20314 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20315
20316 m_errorMonitor->VerifyNotFound();
20317}
20318
20319// This is a positive test. No errors should be generated.
20320TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020321 TEST_DESCRIPTION(
20322 "Two command buffers each in a separate SubmitInfo sent in a single "
20323 "QueueSubmit call followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020324 ASSERT_NO_FATAL_FAILURE(InitState());
20325
20326 m_errorMonitor->ExpectSuccess();
20327
20328 VkFence fence;
20329 VkFenceCreateInfo fence_create_info{};
20330 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20331 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20332
20333 VkSemaphore semaphore;
20334 VkSemaphoreCreateInfo semaphore_create_info{};
20335 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20336 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
20337
20338 VkCommandPool command_pool;
20339 VkCommandPoolCreateInfo pool_create_info{};
20340 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20341 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20342 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20343 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20344
20345 VkCommandBuffer command_buffer[2];
20346 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20347 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20348 command_buffer_allocate_info.commandPool = command_pool;
20349 command_buffer_allocate_info.commandBufferCount = 2;
20350 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20351 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20352
20353 {
20354 VkCommandBufferBeginInfo begin_info{};
20355 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20356 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20357
20358 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020359 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020360
20361 VkViewport viewport{};
20362 viewport.maxDepth = 1.0f;
20363 viewport.minDepth = 0.0f;
20364 viewport.width = 512;
20365 viewport.height = 512;
20366 viewport.x = 0;
20367 viewport.y = 0;
20368 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20369 vkEndCommandBuffer(command_buffer[0]);
20370 }
20371 {
20372 VkCommandBufferBeginInfo begin_info{};
20373 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20374 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20375
20376 VkViewport viewport{};
20377 viewport.maxDepth = 1.0f;
20378 viewport.minDepth = 0.0f;
20379 viewport.width = 512;
20380 viewport.height = 512;
20381 viewport.x = 0;
20382 viewport.y = 0;
20383 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20384 vkEndCommandBuffer(command_buffer[1]);
20385 }
20386 {
20387 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020388 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020389
20390 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20391 submit_info[0].pNext = NULL;
20392 submit_info[0].commandBufferCount = 1;
20393 submit_info[0].pCommandBuffers = &command_buffer[0];
20394 submit_info[0].signalSemaphoreCount = 1;
20395 submit_info[0].pSignalSemaphores = &semaphore;
20396 submit_info[0].waitSemaphoreCount = 0;
20397 submit_info[0].pWaitSemaphores = NULL;
20398 submit_info[0].pWaitDstStageMask = 0;
20399
20400 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20401 submit_info[1].pNext = NULL;
20402 submit_info[1].commandBufferCount = 1;
20403 submit_info[1].pCommandBuffers = &command_buffer[1];
20404 submit_info[1].waitSemaphoreCount = 1;
20405 submit_info[1].pWaitSemaphores = &semaphore;
20406 submit_info[1].pWaitDstStageMask = flags;
20407 submit_info[1].signalSemaphoreCount = 0;
20408 submit_info[1].pSignalSemaphores = NULL;
20409 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
20410 }
20411
20412 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20413
20414 vkDestroyFence(m_device->device(), fence, nullptr);
20415 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20416 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20417 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
20418
20419 m_errorMonitor->VerifyNotFound();
20420}
20421
20422TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
20423 m_errorMonitor->ExpectSuccess();
20424
20425 ASSERT_NO_FATAL_FAILURE(InitState());
20426 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20427
Tony Barbour552f6c02016-12-21 14:34:07 -070020428 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020429
20430 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
20431 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
20432 m_errorMonitor->VerifyNotFound();
20433 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
20434 m_errorMonitor->VerifyNotFound();
20435 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
20436 m_errorMonitor->VerifyNotFound();
20437
20438 m_commandBuffer->EndCommandBuffer();
20439 m_errorMonitor->VerifyNotFound();
20440}
20441
20442TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020443 TEST_DESCRIPTION(
20444 "Positive test where we create a renderpass with an "
20445 "attachment that uses LOAD_OP_CLEAR, the first subpass "
20446 "has a valid layout, and a second subpass then uses a "
20447 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020448 m_errorMonitor->ExpectSuccess();
20449 ASSERT_NO_FATAL_FAILURE(InitState());
20450
20451 VkAttachmentReference attach[2] = {};
20452 attach[0].attachment = 0;
20453 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20454 attach[1].attachment = 0;
20455 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
20456 VkSubpassDescription subpasses[2] = {};
20457 // First subpass clears DS attach on load
20458 subpasses[0].pDepthStencilAttachment = &attach[0];
20459 // 2nd subpass reads in DS as input attachment
20460 subpasses[1].inputAttachmentCount = 1;
20461 subpasses[1].pInputAttachments = &attach[1];
20462 VkAttachmentDescription attach_desc = {};
20463 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
20464 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
20465 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
20466 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20467 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20468 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20469 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20470 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
20471 VkRenderPassCreateInfo rpci = {};
20472 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20473 rpci.attachmentCount = 1;
20474 rpci.pAttachments = &attach_desc;
20475 rpci.subpassCount = 2;
20476 rpci.pSubpasses = subpasses;
20477
20478 // Now create RenderPass and verify no errors
20479 VkRenderPass rp;
20480 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
20481 m_errorMonitor->VerifyNotFound();
20482
20483 vkDestroyRenderPass(m_device->device(), rp, NULL);
20484}
20485
20486TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020487 TEST_DESCRIPTION(
20488 "Test that pipeline validation accepts matrices passed "
20489 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020490 m_errorMonitor->ExpectSuccess();
20491
20492 ASSERT_NO_FATAL_FAILURE(InitState());
20493 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20494
20495 VkVertexInputBindingDescription input_binding;
20496 memset(&input_binding, 0, sizeof(input_binding));
20497
20498 VkVertexInputAttributeDescription input_attribs[2];
20499 memset(input_attribs, 0, sizeof(input_attribs));
20500
20501 for (int i = 0; i < 2; i++) {
20502 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
20503 input_attribs[i].location = i;
20504 }
20505
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020506 char const *vsSource =
20507 "#version 450\n"
20508 "\n"
20509 "layout(location=0) in mat2x4 x;\n"
20510 "out gl_PerVertex {\n"
20511 " vec4 gl_Position;\n"
20512 "};\n"
20513 "void main(){\n"
20514 " gl_Position = x[0] + x[1];\n"
20515 "}\n";
20516 char const *fsSource =
20517 "#version 450\n"
20518 "\n"
20519 "layout(location=0) out vec4 color;\n"
20520 "void main(){\n"
20521 " color = vec4(1);\n"
20522 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020523
20524 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20525 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20526
20527 VkPipelineObj pipe(m_device);
20528 pipe.AddColorAttachment();
20529 pipe.AddShader(&vs);
20530 pipe.AddShader(&fs);
20531
20532 pipe.AddVertexInputBindings(&input_binding, 1);
20533 pipe.AddVertexInputAttribs(input_attribs, 2);
20534
20535 VkDescriptorSetObj descriptorSet(m_device);
20536 descriptorSet.AppendDummy();
20537 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20538
20539 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20540
20541 /* expect success */
20542 m_errorMonitor->VerifyNotFound();
20543}
20544
20545TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
20546 m_errorMonitor->ExpectSuccess();
20547
20548 ASSERT_NO_FATAL_FAILURE(InitState());
20549 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20550
20551 VkVertexInputBindingDescription input_binding;
20552 memset(&input_binding, 0, sizeof(input_binding));
20553
20554 VkVertexInputAttributeDescription input_attribs[2];
20555 memset(input_attribs, 0, sizeof(input_attribs));
20556
20557 for (int i = 0; i < 2; i++) {
20558 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
20559 input_attribs[i].location = i;
20560 }
20561
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020562 char const *vsSource =
20563 "#version 450\n"
20564 "\n"
20565 "layout(location=0) in vec4 x[2];\n"
20566 "out gl_PerVertex {\n"
20567 " vec4 gl_Position;\n"
20568 "};\n"
20569 "void main(){\n"
20570 " gl_Position = x[0] + x[1];\n"
20571 "}\n";
20572 char const *fsSource =
20573 "#version 450\n"
20574 "\n"
20575 "layout(location=0) out vec4 color;\n"
20576 "void main(){\n"
20577 " color = vec4(1);\n"
20578 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020579
20580 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20581 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20582
20583 VkPipelineObj pipe(m_device);
20584 pipe.AddColorAttachment();
20585 pipe.AddShader(&vs);
20586 pipe.AddShader(&fs);
20587
20588 pipe.AddVertexInputBindings(&input_binding, 1);
20589 pipe.AddVertexInputAttribs(input_attribs, 2);
20590
20591 VkDescriptorSetObj descriptorSet(m_device);
20592 descriptorSet.AppendDummy();
20593 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20594
20595 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20596
20597 m_errorMonitor->VerifyNotFound();
20598}
20599
20600TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020601 TEST_DESCRIPTION(
20602 "Test that pipeline validation accepts consuming a vertex attribute "
20603 "through multiple vertex shader inputs, each consuming a different "
20604 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020605 m_errorMonitor->ExpectSuccess();
20606
20607 ASSERT_NO_FATAL_FAILURE(InitState());
20608 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20609
20610 VkVertexInputBindingDescription input_binding;
20611 memset(&input_binding, 0, sizeof(input_binding));
20612
20613 VkVertexInputAttributeDescription input_attribs[3];
20614 memset(input_attribs, 0, sizeof(input_attribs));
20615
20616 for (int i = 0; i < 3; i++) {
20617 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
20618 input_attribs[i].location = i;
20619 }
20620
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020621 char const *vsSource =
20622 "#version 450\n"
20623 "\n"
20624 "layout(location=0) in vec4 x;\n"
20625 "layout(location=1) in vec3 y1;\n"
20626 "layout(location=1, component=3) in float y2;\n"
20627 "layout(location=2) in vec4 z;\n"
20628 "out gl_PerVertex {\n"
20629 " vec4 gl_Position;\n"
20630 "};\n"
20631 "void main(){\n"
20632 " gl_Position = x + vec4(y1, y2) + z;\n"
20633 "}\n";
20634 char const *fsSource =
20635 "#version 450\n"
20636 "\n"
20637 "layout(location=0) out vec4 color;\n"
20638 "void main(){\n"
20639 " color = vec4(1);\n"
20640 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020641
20642 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20643 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20644
20645 VkPipelineObj pipe(m_device);
20646 pipe.AddColorAttachment();
20647 pipe.AddShader(&vs);
20648 pipe.AddShader(&fs);
20649
20650 pipe.AddVertexInputBindings(&input_binding, 1);
20651 pipe.AddVertexInputAttribs(input_attribs, 3);
20652
20653 VkDescriptorSetObj descriptorSet(m_device);
20654 descriptorSet.AppendDummy();
20655 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20656
20657 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20658
20659 m_errorMonitor->VerifyNotFound();
20660}
20661
20662TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
20663 m_errorMonitor->ExpectSuccess();
20664
20665 ASSERT_NO_FATAL_FAILURE(InitState());
20666 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20667
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020668 char const *vsSource =
20669 "#version 450\n"
20670 "out gl_PerVertex {\n"
20671 " vec4 gl_Position;\n"
20672 "};\n"
20673 "void main(){\n"
20674 " gl_Position = vec4(0);\n"
20675 "}\n";
20676 char const *fsSource =
20677 "#version 450\n"
20678 "\n"
20679 "layout(location=0) out vec4 color;\n"
20680 "void main(){\n"
20681 " color = vec4(1);\n"
20682 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020683
20684 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20685 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20686
20687 VkPipelineObj pipe(m_device);
20688 pipe.AddColorAttachment();
20689 pipe.AddShader(&vs);
20690 pipe.AddShader(&fs);
20691
20692 VkDescriptorSetObj descriptorSet(m_device);
20693 descriptorSet.AppendDummy();
20694 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20695
20696 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20697
20698 m_errorMonitor->VerifyNotFound();
20699}
20700
20701TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020702 TEST_DESCRIPTION(
20703 "Test that pipeline validation accepts the relaxed type matching rules "
20704 "set out in 14.1.3: fundamental type must match, and producer side must "
20705 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020706 m_errorMonitor->ExpectSuccess();
20707
20708 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
20709
20710 ASSERT_NO_FATAL_FAILURE(InitState());
20711 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20712
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020713 char const *vsSource =
20714 "#version 450\n"
20715 "out gl_PerVertex {\n"
20716 " vec4 gl_Position;\n"
20717 "};\n"
20718 "layout(location=0) out vec3 x;\n"
20719 "layout(location=1) out ivec3 y;\n"
20720 "layout(location=2) out vec3 z;\n"
20721 "void main(){\n"
20722 " gl_Position = vec4(0);\n"
20723 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
20724 "}\n";
20725 char const *fsSource =
20726 "#version 450\n"
20727 "\n"
20728 "layout(location=0) out vec4 color;\n"
20729 "layout(location=0) in float x;\n"
20730 "layout(location=1) flat in int y;\n"
20731 "layout(location=2) in vec2 z;\n"
20732 "void main(){\n"
20733 " color = vec4(1 + x + y + z.x);\n"
20734 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020735
20736 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20737 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20738
20739 VkPipelineObj pipe(m_device);
20740 pipe.AddColorAttachment();
20741 pipe.AddShader(&vs);
20742 pipe.AddShader(&fs);
20743
20744 VkDescriptorSetObj descriptorSet(m_device);
20745 descriptorSet.AppendDummy();
20746 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20747
20748 VkResult err = VK_SUCCESS;
20749 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20750 ASSERT_VK_SUCCESS(err);
20751
20752 m_errorMonitor->VerifyNotFound();
20753}
20754
20755TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020756 TEST_DESCRIPTION(
20757 "Test that pipeline validation accepts per-vertex variables "
20758 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020759 m_errorMonitor->ExpectSuccess();
20760
20761 ASSERT_NO_FATAL_FAILURE(InitState());
20762 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20763
20764 if (!m_device->phy().features().tessellationShader) {
20765 printf("Device does not support tessellation shaders; skipped.\n");
20766 return;
20767 }
20768
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020769 char const *vsSource =
20770 "#version 450\n"
20771 "void main(){}\n";
20772 char const *tcsSource =
20773 "#version 450\n"
20774 "layout(location=0) out int x[];\n"
20775 "layout(vertices=3) out;\n"
20776 "void main(){\n"
20777 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
20778 " gl_TessLevelInner[0] = 1;\n"
20779 " x[gl_InvocationID] = gl_InvocationID;\n"
20780 "}\n";
20781 char const *tesSource =
20782 "#version 450\n"
20783 "layout(triangles, equal_spacing, cw) in;\n"
20784 "layout(location=0) in int x[];\n"
20785 "out gl_PerVertex { vec4 gl_Position; };\n"
20786 "void main(){\n"
20787 " gl_Position.xyz = gl_TessCoord;\n"
20788 " gl_Position.w = x[0] + x[1] + x[2];\n"
20789 "}\n";
20790 char const *fsSource =
20791 "#version 450\n"
20792 "layout(location=0) out vec4 color;\n"
20793 "void main(){\n"
20794 " color = vec4(1);\n"
20795 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020796
20797 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20798 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
20799 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
20800 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20801
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020802 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
20803 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020804
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020805 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020806
20807 VkPipelineObj pipe(m_device);
20808 pipe.SetInputAssembly(&iasci);
20809 pipe.SetTessellation(&tsci);
20810 pipe.AddColorAttachment();
20811 pipe.AddShader(&vs);
20812 pipe.AddShader(&tcs);
20813 pipe.AddShader(&tes);
20814 pipe.AddShader(&fs);
20815
20816 VkDescriptorSetObj descriptorSet(m_device);
20817 descriptorSet.AppendDummy();
20818 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20819
20820 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20821
20822 m_errorMonitor->VerifyNotFound();
20823}
20824
20825TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020826 TEST_DESCRIPTION(
20827 "Test that pipeline validation accepts a user-defined "
20828 "interface block passed into the geometry shader. This "
20829 "is interesting because the 'extra' array level is not "
20830 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020831 m_errorMonitor->ExpectSuccess();
20832
20833 ASSERT_NO_FATAL_FAILURE(InitState());
20834 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20835
20836 if (!m_device->phy().features().geometryShader) {
20837 printf("Device does not support geometry shaders; skipped.\n");
20838 return;
20839 }
20840
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020841 char const *vsSource =
20842 "#version 450\n"
20843 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
20844 "void main(){\n"
20845 " vs_out.x = vec4(1);\n"
20846 "}\n";
20847 char const *gsSource =
20848 "#version 450\n"
20849 "layout(triangles) in;\n"
20850 "layout(triangle_strip, max_vertices=3) out;\n"
20851 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
20852 "out gl_PerVertex { vec4 gl_Position; };\n"
20853 "void main() {\n"
20854 " gl_Position = gs_in[0].x;\n"
20855 " EmitVertex();\n"
20856 "}\n";
20857 char const *fsSource =
20858 "#version 450\n"
20859 "layout(location=0) out vec4 color;\n"
20860 "void main(){\n"
20861 " color = vec4(1);\n"
20862 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020863
20864 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20865 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
20866 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20867
20868 VkPipelineObj pipe(m_device);
20869 pipe.AddColorAttachment();
20870 pipe.AddShader(&vs);
20871 pipe.AddShader(&gs);
20872 pipe.AddShader(&fs);
20873
20874 VkDescriptorSetObj descriptorSet(m_device);
20875 descriptorSet.AppendDummy();
20876 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20877
20878 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20879
20880 m_errorMonitor->VerifyNotFound();
20881}
20882
20883TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020884 TEST_DESCRIPTION(
20885 "Test that pipeline validation accepts basic use of 64bit vertex "
20886 "attributes. This is interesting because they consume multiple "
20887 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020888 m_errorMonitor->ExpectSuccess();
20889
20890 ASSERT_NO_FATAL_FAILURE(InitState());
20891 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20892
20893 if (!m_device->phy().features().shaderFloat64) {
20894 printf("Device does not support 64bit vertex attributes; skipped.\n");
20895 return;
20896 }
20897
20898 VkVertexInputBindingDescription input_bindings[1];
20899 memset(input_bindings, 0, sizeof(input_bindings));
20900
20901 VkVertexInputAttributeDescription input_attribs[4];
20902 memset(input_attribs, 0, sizeof(input_attribs));
20903 input_attribs[0].location = 0;
20904 input_attribs[0].offset = 0;
20905 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20906 input_attribs[1].location = 2;
20907 input_attribs[1].offset = 32;
20908 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20909 input_attribs[2].location = 4;
20910 input_attribs[2].offset = 64;
20911 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20912 input_attribs[3].location = 6;
20913 input_attribs[3].offset = 96;
20914 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20915
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020916 char const *vsSource =
20917 "#version 450\n"
20918 "\n"
20919 "layout(location=0) in dmat4 x;\n"
20920 "out gl_PerVertex {\n"
20921 " vec4 gl_Position;\n"
20922 "};\n"
20923 "void main(){\n"
20924 " gl_Position = vec4(x[0][0]);\n"
20925 "}\n";
20926 char const *fsSource =
20927 "#version 450\n"
20928 "\n"
20929 "layout(location=0) out vec4 color;\n"
20930 "void main(){\n"
20931 " color = vec4(1);\n"
20932 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020933
20934 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20935 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20936
20937 VkPipelineObj pipe(m_device);
20938 pipe.AddColorAttachment();
20939 pipe.AddShader(&vs);
20940 pipe.AddShader(&fs);
20941
20942 pipe.AddVertexInputBindings(input_bindings, 1);
20943 pipe.AddVertexInputAttribs(input_attribs, 4);
20944
20945 VkDescriptorSetObj descriptorSet(m_device);
20946 descriptorSet.AppendDummy();
20947 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20948
20949 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20950
20951 m_errorMonitor->VerifyNotFound();
20952}
20953
20954TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
20955 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
20956 m_errorMonitor->ExpectSuccess();
20957
20958 ASSERT_NO_FATAL_FAILURE(InitState());
20959
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020960 char const *vsSource =
20961 "#version 450\n"
20962 "\n"
20963 "out gl_PerVertex {\n"
20964 " vec4 gl_Position;\n"
20965 "};\n"
20966 "void main(){\n"
20967 " gl_Position = vec4(1);\n"
20968 "}\n";
20969 char const *fsSource =
20970 "#version 450\n"
20971 "\n"
20972 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
20973 "layout(location=0) out vec4 color;\n"
20974 "void main() {\n"
20975 " color = subpassLoad(x);\n"
20976 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020977
20978 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20979 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20980
20981 VkPipelineObj pipe(m_device);
20982 pipe.AddShader(&vs);
20983 pipe.AddShader(&fs);
20984 pipe.AddColorAttachment();
20985 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20986
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020987 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
20988 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020989 VkDescriptorSetLayout dsl;
20990 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
20991 ASSERT_VK_SUCCESS(err);
20992
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020993 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020994 VkPipelineLayout pl;
20995 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
20996 ASSERT_VK_SUCCESS(err);
20997
20998 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020999 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
21000 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
21001 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
21002 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
21003 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021004 };
21005 VkAttachmentReference color = {
21006 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
21007 };
21008 VkAttachmentReference input = {
21009 1, VK_IMAGE_LAYOUT_GENERAL,
21010 };
21011
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021012 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021013
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021014 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021015 VkRenderPass rp;
21016 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21017 ASSERT_VK_SUCCESS(err);
21018
21019 // should be OK. would go wrong here if it's going to...
21020 pipe.CreateVKPipeline(pl, rp);
21021
21022 m_errorMonitor->VerifyNotFound();
21023
21024 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21025 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
21026 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
21027}
21028
21029TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021030 TEST_DESCRIPTION(
21031 "Test that pipeline validation accepts a compute pipeline which declares a "
21032 "descriptor-backed resource which is not provided, but the shader does not "
21033 "statically use it. This is interesting because it requires compute pipelines "
21034 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021035 m_errorMonitor->ExpectSuccess();
21036
21037 ASSERT_NO_FATAL_FAILURE(InitState());
21038
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021039 char const *csSource =
21040 "#version 450\n"
21041 "\n"
21042 "layout(local_size_x=1) in;\n"
21043 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
21044 "void main(){\n"
21045 " // x is not used.\n"
21046 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021047
21048 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
21049
21050 VkDescriptorSetObj descriptorSet(m_device);
21051 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
21052
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021053 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
21054 nullptr,
21055 0,
21056 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
21057 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
21058 descriptorSet.GetPipelineLayout(),
21059 VK_NULL_HANDLE,
21060 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021061
21062 VkPipeline pipe;
21063 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
21064
21065 m_errorMonitor->VerifyNotFound();
21066
21067 if (err == VK_SUCCESS) {
21068 vkDestroyPipeline(m_device->device(), pipe, nullptr);
21069 }
21070}
21071
21072TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021073 TEST_DESCRIPTION(
21074 "Test that pipeline validation accepts a shader consuming only the "
21075 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021076 m_errorMonitor->ExpectSuccess();
21077
21078 ASSERT_NO_FATAL_FAILURE(InitState());
21079
21080 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021081 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
21082 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
21083 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021084 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021085 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021086 VkDescriptorSetLayout dsl;
21087 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
21088 ASSERT_VK_SUCCESS(err);
21089
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021090 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021091 VkPipelineLayout pl;
21092 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
21093 ASSERT_VK_SUCCESS(err);
21094
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021095 char const *csSource =
21096 "#version 450\n"
21097 "\n"
21098 "layout(local_size_x=1) in;\n"
21099 "layout(set=0, binding=0) uniform sampler s;\n"
21100 "layout(set=0, binding=1) uniform texture2D t;\n"
21101 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
21102 "void main() {\n"
21103 " x = texture(sampler2D(t, s), vec2(0));\n"
21104 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021105 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
21106
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021107 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
21108 nullptr,
21109 0,
21110 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
21111 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
21112 pl,
21113 VK_NULL_HANDLE,
21114 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021115
21116 VkPipeline pipe;
21117 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
21118
21119 m_errorMonitor->VerifyNotFound();
21120
21121 if (err == VK_SUCCESS) {
21122 vkDestroyPipeline(m_device->device(), pipe, nullptr);
21123 }
21124
21125 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
21126 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
21127}
21128
21129TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021130 TEST_DESCRIPTION(
21131 "Test that pipeline validation accepts a shader consuming only the "
21132 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021133 m_errorMonitor->ExpectSuccess();
21134
21135 ASSERT_NO_FATAL_FAILURE(InitState());
21136
21137 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021138 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
21139 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
21140 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021141 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021142 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021143 VkDescriptorSetLayout dsl;
21144 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
21145 ASSERT_VK_SUCCESS(err);
21146
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021147 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021148 VkPipelineLayout pl;
21149 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
21150 ASSERT_VK_SUCCESS(err);
21151
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021152 char const *csSource =
21153 "#version 450\n"
21154 "\n"
21155 "layout(local_size_x=1) in;\n"
21156 "layout(set=0, binding=0) uniform texture2D t;\n"
21157 "layout(set=0, binding=1) uniform sampler s;\n"
21158 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
21159 "void main() {\n"
21160 " x = texture(sampler2D(t, s), vec2(0));\n"
21161 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021162 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
21163
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021164 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
21165 nullptr,
21166 0,
21167 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
21168 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
21169 pl,
21170 VK_NULL_HANDLE,
21171 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021172
21173 VkPipeline pipe;
21174 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
21175
21176 m_errorMonitor->VerifyNotFound();
21177
21178 if (err == VK_SUCCESS) {
21179 vkDestroyPipeline(m_device->device(), pipe, nullptr);
21180 }
21181
21182 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
21183 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
21184}
21185
21186TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021187 TEST_DESCRIPTION(
21188 "Test that pipeline validation accepts a shader consuming "
21189 "both the sampler and the image of a combined image+sampler "
21190 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021191 m_errorMonitor->ExpectSuccess();
21192
21193 ASSERT_NO_FATAL_FAILURE(InitState());
21194
21195 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021196 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
21197 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021198 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021199 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021200 VkDescriptorSetLayout dsl;
21201 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
21202 ASSERT_VK_SUCCESS(err);
21203
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021204 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021205 VkPipelineLayout pl;
21206 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
21207 ASSERT_VK_SUCCESS(err);
21208
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021209 char const *csSource =
21210 "#version 450\n"
21211 "\n"
21212 "layout(local_size_x=1) in;\n"
21213 "layout(set=0, binding=0) uniform texture2D t;\n"
21214 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
21215 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
21216 "void main() {\n"
21217 " x = texture(sampler2D(t, s), vec2(0));\n"
21218 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021219 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
21220
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021221 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
21222 nullptr,
21223 0,
21224 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
21225 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
21226 pl,
21227 VK_NULL_HANDLE,
21228 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021229
21230 VkPipeline pipe;
21231 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
21232
21233 m_errorMonitor->VerifyNotFound();
21234
21235 if (err == VK_SUCCESS) {
21236 vkDestroyPipeline(m_device->device(), pipe, nullptr);
21237 }
21238
21239 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
21240 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
21241}
21242
21243TEST_F(VkPositiveLayerTest, ValidStructPNext) {
21244 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
21245
21246 ASSERT_NO_FATAL_FAILURE(InitState());
21247
21248 // Positive test to check parameter_validation and unique_objects support
21249 // for NV_dedicated_allocation
21250 uint32_t extension_count = 0;
21251 bool supports_nv_dedicated_allocation = false;
21252 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
21253 ASSERT_VK_SUCCESS(err);
21254
21255 if (extension_count > 0) {
21256 std::vector<VkExtensionProperties> available_extensions(extension_count);
21257
21258 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
21259 ASSERT_VK_SUCCESS(err);
21260
21261 for (const auto &extension_props : available_extensions) {
21262 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
21263 supports_nv_dedicated_allocation = true;
21264 }
21265 }
21266 }
21267
21268 if (supports_nv_dedicated_allocation) {
21269 m_errorMonitor->ExpectSuccess();
21270
21271 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
21272 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
21273 dedicated_buffer_create_info.pNext = nullptr;
21274 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
21275
21276 uint32_t queue_family_index = 0;
21277 VkBufferCreateInfo buffer_create_info = {};
21278 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21279 buffer_create_info.pNext = &dedicated_buffer_create_info;
21280 buffer_create_info.size = 1024;
21281 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
21282 buffer_create_info.queueFamilyIndexCount = 1;
21283 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
21284
21285 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070021286 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021287 ASSERT_VK_SUCCESS(err);
21288
21289 VkMemoryRequirements memory_reqs;
21290 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
21291
21292 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
21293 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
21294 dedicated_memory_info.pNext = nullptr;
21295 dedicated_memory_info.buffer = buffer;
21296 dedicated_memory_info.image = VK_NULL_HANDLE;
21297
21298 VkMemoryAllocateInfo memory_info = {};
21299 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21300 memory_info.pNext = &dedicated_memory_info;
21301 memory_info.allocationSize = memory_reqs.size;
21302
21303 bool pass;
21304 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
21305 ASSERT_TRUE(pass);
21306
21307 VkDeviceMemory buffer_memory;
21308 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
21309 ASSERT_VK_SUCCESS(err);
21310
21311 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
21312 ASSERT_VK_SUCCESS(err);
21313
21314 vkDestroyBuffer(m_device->device(), buffer, NULL);
21315 vkFreeMemory(m_device->device(), buffer_memory, NULL);
21316
21317 m_errorMonitor->VerifyNotFound();
21318 }
21319}
21320
21321TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
21322 VkResult err;
21323
21324 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
21325
21326 ASSERT_NO_FATAL_FAILURE(InitState());
21327 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21328
21329 std::vector<const char *> device_extension_names;
21330 auto features = m_device->phy().features();
21331 // Artificially disable support for non-solid fill modes
21332 features.fillModeNonSolid = false;
21333 // The sacrificial device object
21334 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
21335
21336 VkRenderpassObj render_pass(&test_device);
21337
21338 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
21339 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
21340 pipeline_layout_ci.setLayoutCount = 0;
21341 pipeline_layout_ci.pSetLayouts = NULL;
21342
21343 VkPipelineLayout pipeline_layout;
21344 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
21345 ASSERT_VK_SUCCESS(err);
21346
21347 VkPipelineRasterizationStateCreateInfo rs_ci = {};
21348 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
21349 rs_ci.pNext = nullptr;
21350 rs_ci.lineWidth = 1.0f;
21351 rs_ci.rasterizerDiscardEnable = true;
21352
21353 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
21354 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
21355
21356 // Set polygonMode=FILL. No error is expected
21357 m_errorMonitor->ExpectSuccess();
21358 {
21359 VkPipelineObj pipe(&test_device);
21360 pipe.AddShader(&vs);
21361 pipe.AddShader(&fs);
21362 pipe.AddColorAttachment();
21363 // Set polygonMode to a good value
21364 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
21365 pipe.SetRasterization(&rs_ci);
21366 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
21367 }
21368 m_errorMonitor->VerifyNotFound();
21369
21370 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
21371}
21372
21373TEST_F(VkPositiveLayerTest, ValidPushConstants) {
21374 VkResult err;
21375 ASSERT_NO_FATAL_FAILURE(InitState());
21376 ASSERT_NO_FATAL_FAILURE(InitViewport());
21377 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21378
21379 VkPipelineLayout pipeline_layout;
21380 VkPushConstantRange pc_range = {};
21381 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
21382 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
21383 pipeline_layout_ci.pushConstantRangeCount = 1;
21384 pipeline_layout_ci.pPushConstantRanges = &pc_range;
21385
21386 //
21387 // Check for invalid push constant ranges in pipeline layouts.
21388 //
21389 struct PipelineLayoutTestCase {
21390 VkPushConstantRange const range;
21391 char const *msg;
21392 };
21393
21394 // Check for overlapping ranges
21395 const uint32_t ranges_per_test = 5;
21396 struct OverlappingRangeTestCase {
21397 VkPushConstantRange const ranges[ranges_per_test];
21398 char const *msg;
21399 };
21400
21401 // Run some positive tests to make sure overlap checking in the layer is OK
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021402 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos = {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
21403 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
21404 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
21405 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
21406 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
21407 ""},
21408 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
21409 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
21410 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
21411 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
21412 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
21413 ""}}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021414 for (const auto &iter : overlapping_range_tests_pos) {
21415 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
21416 m_errorMonitor->ExpectSuccess();
21417 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
21418 m_errorMonitor->VerifyNotFound();
21419 if (VK_SUCCESS == err) {
21420 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
21421 }
21422 }
21423
21424 //
21425 // CmdPushConstants tests
21426 //
21427 const uint8_t dummy_values[100] = {};
21428
Tony Barbour552f6c02016-12-21 14:34:07 -070021429 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021430
21431 // positive overlapping range tests with cmd
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021432 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
21433 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
21434 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
21435 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
21436 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
21437 }};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021438
21439 // Setup ranges: [0,16) [20,36) [36,44) [44,52) [56,80) [80,92)
21440 const VkPushConstantRange pc_range4[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021441 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
21442 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12}, {VK_SHADER_STAGE_VERTEX_BIT, 36, 8}, {VK_SHADER_STAGE_VERTEX_BIT, 56, 24},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021443 };
21444
21445 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range4) / sizeof(VkPushConstantRange);
21446 pipeline_layout_ci.pPushConstantRanges = pc_range4;
21447 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
21448 ASSERT_VK_SUCCESS(err);
21449 for (const auto &iter : cmd_overlap_tests_pos) {
21450 m_errorMonitor->ExpectSuccess();
21451 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021452 iter.range.size, dummy_values);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021453 m_errorMonitor->VerifyNotFound();
21454 }
21455 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
21456
Tony Barbour552f6c02016-12-21 14:34:07 -070021457 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021458}
21459
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021460#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021461TEST_F(VkPositiveLayerTest, LongFenceChain)
21462{
21463 m_errorMonitor->ExpectSuccess();
21464
21465 ASSERT_NO_FATAL_FAILURE(InitState());
21466 VkResult err;
21467
21468 std::vector<VkFence> fences;
21469
21470 const int chainLength = 32768;
21471
21472 for (int i = 0; i < chainLength; i++) {
21473 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
21474 VkFence fence;
21475 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
21476 ASSERT_VK_SUCCESS(err);
21477
21478 fences.push_back(fence);
21479
21480 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
21481 0, nullptr, 0, nullptr };
21482 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
21483 ASSERT_VK_SUCCESS(err);
21484
21485 }
21486
21487 // BOOM, stack overflow.
21488 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
21489
21490 for (auto fence : fences)
21491 vkDestroyFence(m_device->device(), fence, nullptr);
21492
21493 m_errorMonitor->VerifyNotFound();
21494}
21495#endif
21496
Cody Northrop1242dfd2016-07-13 17:24:59 -060021497#if defined(ANDROID) && defined(VALIDATION_APK)
21498static bool initialized = false;
21499static bool active = false;
21500
21501// Convert Intents to argv
21502// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021503std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021504 std::vector<std::string> args;
21505 JavaVM &vm = *app.activity->vm;
21506 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021507 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060021508
21509 JNIEnv &env = *p_env;
21510 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021511 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060021512 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021513 jmethodID get_string_extra_method =
21514 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060021515 jvalue get_string_extra_args;
21516 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021517 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060021518
21519 std::string args_str;
21520 if (extra_str) {
21521 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
21522 args_str = extra_utf;
21523 env.ReleaseStringUTFChars(extra_str, extra_utf);
21524 env.DeleteLocalRef(extra_str);
21525 }
21526
21527 env.DeleteLocalRef(get_string_extra_args.l);
21528 env.DeleteLocalRef(intent);
21529 vm.DetachCurrentThread();
21530
21531 // split args_str
21532 std::stringstream ss(args_str);
21533 std::string arg;
21534 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021535 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021536 }
21537
21538 return args;
21539}
21540
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021541static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021542
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021543static void processCommand(struct android_app *app, int32_t cmd) {
21544 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021545 case APP_CMD_INIT_WINDOW: {
21546 if (app->window) {
21547 initialized = true;
21548 }
21549 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060021550 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021551 case APP_CMD_GAINED_FOCUS: {
21552 active = true;
21553 break;
21554 }
21555 case APP_CMD_LOST_FOCUS: {
21556 active = false;
21557 break;
21558 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021559 }
21560}
21561
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021562void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021563 app_dummy();
21564
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021565 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060021566
21567 int vulkanSupport = InitVulkan();
21568 if (vulkanSupport == 0) {
21569 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
21570 return;
21571 }
21572
21573 app->onAppCmd = processCommand;
21574 app->onInputEvent = processInput;
21575
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021576 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021577 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021578 struct android_poll_source *source;
21579 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021580 if (source) {
21581 source->process(app, source);
21582 }
21583
21584 if (app->destroyRequested != 0) {
21585 VkTestFramework::Finish();
21586 return;
21587 }
21588 }
21589
21590 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021591 // Use the following key to send arguments to gtest, i.e.
21592 // --es args "--gtest_filter=-VkLayerTest.foo"
21593 const char key[] = "args";
21594 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021595
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021596 std::string filter = "";
21597 if (args.size() > 0) {
21598 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
21599 filter += args[0];
21600 } else {
21601 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
21602 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021603
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021604 int argc = 2;
21605 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
21606 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021607
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021608 // Route output to files until we can override the gtest output
21609 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
21610 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021611
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021612 ::testing::InitGoogleTest(&argc, argv);
21613 VkTestFramework::InitArgs(&argc, argv);
21614 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021615
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021616 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060021617
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021618 if (result != 0) {
21619 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
21620 } else {
21621 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
21622 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021623
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021624 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060021625
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021626 fclose(stdout);
21627 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021628
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021629 ANativeActivity_finish(app->activity);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021630
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021631 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060021632 }
21633 }
21634}
21635#endif
21636
Tony Barbour300a6082015-04-07 13:44:53 -060021637int main(int argc, char **argv) {
21638 int result;
21639
Cody Northrop8e54a402016-03-08 22:25:52 -070021640#ifdef ANDROID
21641 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021642 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070021643#endif
21644
Tony Barbour300a6082015-04-07 13:44:53 -060021645 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060021646 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060021647
21648 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
21649
21650 result = RUN_ALL_TESTS();
21651
Tony Barbour6918cd52015-04-09 12:58:51 -060021652 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060021653 return result;
21654}