blob: 670b7ca4dd19989e875537b1b3389fe5fe96b484 [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
2635 // Try to bind memory to an image created with sparse memory flags
2636 {
2637 VkImageCreateInfo sparse_image_create_info = image_create_info;
2638 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2639 VkImageFormatProperties image_format_properties = {};
2640 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2641 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2642 sparse_image_create_info.usage, sparse_image_create_info.flags,
2643 &image_format_properties);
2644 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2645 // most likely means sparse formats aren't supported here; skip this test.
2646 } else {
2647 ASSERT_VK_SUCCESS(err);
2648 if (image_format_properties.maxExtent.width == 0) {
2649 printf("sparse image format not supported; skipped.\n");
2650 return;
2651 } else {
2652 VkImage sparse_image = VK_NULL_HANDLE;
2653 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2654 ASSERT_VK_SUCCESS(err);
2655 VkMemoryRequirements sparse_mem_reqs = {};
2656 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2657 if (sparse_mem_reqs.memoryTypeBits != 0) {
2658 VkMemoryAllocateInfo sparse_mem_alloc = {};
2659 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2660 sparse_mem_alloc.pNext = NULL;
2661 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2662 sparse_mem_alloc.memoryTypeIndex = 0;
2663 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2664 ASSERT_TRUE(pass);
2665 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2666 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2667 ASSERT_VK_SUCCESS(err);
2668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2669 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2670 // This may very well return an error.
2671 (void)err;
2672 m_errorMonitor->VerifyFound();
2673 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2674 }
2675 vkDestroyImage(m_device->device(), sparse_image, NULL);
2676 }
2677 }
2678 }
2679
2680 // Try to bind memory to a buffer created with sparse memory flags
2681 {
2682 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2683 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2684 if (!m_device->phy().features().sparseResidencyBuffer) {
2685 // most likely means sparse formats aren't supported here; skip this test.
2686 } else {
2687 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2688 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2689 ASSERT_VK_SUCCESS(err);
2690 VkMemoryRequirements sparse_mem_reqs = {};
2691 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2692 if (sparse_mem_reqs.memoryTypeBits != 0) {
2693 VkMemoryAllocateInfo sparse_mem_alloc = {};
2694 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2695 sparse_mem_alloc.pNext = NULL;
2696 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2697 sparse_mem_alloc.memoryTypeIndex = 0;
2698 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2699 ASSERT_TRUE(pass);
2700 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2701 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2702 ASSERT_VK_SUCCESS(err);
2703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2704 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2705 // This may very well return an error.
2706 (void)err;
2707 m_errorMonitor->VerifyFound();
2708 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2709 }
2710 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2711 }
2712 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002713}
2714
Karl Schultz6addd812016-02-02 17:17:23 -07002715TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2716 VkResult err;
2717 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002718
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002720
Tobin Ehlisec598302015-09-15 15:02:17 -06002721 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002722
Karl Schultz6addd812016-02-02 17:17:23 -07002723 // Create an image object, allocate memory, destroy the object and then try
2724 // to bind it
2725 VkImage image;
2726 VkDeviceMemory mem;
2727 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002728
Karl Schultz6addd812016-02-02 17:17:23 -07002729 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2730 const int32_t tex_width = 32;
2731 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002732
2733 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002734 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2735 image_create_info.pNext = NULL;
2736 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2737 image_create_info.format = tex_format;
2738 image_create_info.extent.width = tex_width;
2739 image_create_info.extent.height = tex_height;
2740 image_create_info.extent.depth = 1;
2741 image_create_info.mipLevels = 1;
2742 image_create_info.arrayLayers = 1;
2743 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2744 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2745 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2746 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002747
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002748 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002749 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2750 mem_alloc.pNext = NULL;
2751 mem_alloc.allocationSize = 0;
2752 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002753
Chia-I Wuf7458c52015-10-26 21:10:41 +08002754 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002755 ASSERT_VK_SUCCESS(err);
2756
Karl Schultz6addd812016-02-02 17:17:23 -07002757 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002758
2759 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002760 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002761 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002762
2763 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002764 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002765 ASSERT_VK_SUCCESS(err);
2766
2767 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002768 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002769 ASSERT_VK_SUCCESS(err);
2770
2771 // Now Try to bind memory to this destroyed object
2772 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2773 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002774 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002775
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002776 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002777
Chia-I Wuf7458c52015-10-26 21:10:41 +08002778 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002779}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002780
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002781TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
2782 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
2783
2784 ASSERT_NO_FATAL_FAILURE(InitState());
2785 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2786
2787 VkVertexInputBindingDescription input_binding;
2788 memset(&input_binding, 0, sizeof(input_binding));
2789
2790 VkVertexInputAttributeDescription input_attribs;
2791 memset(&input_attribs, 0, sizeof(input_attribs));
2792
2793 // Pick a really bad format for this purpose and make sure it should fail
2794 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
2795 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
2796 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
2797 printf("Format unsuitable for test; skipped.\n");
2798 return;
2799 }
2800
2801 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002802 char const *vsSource =
2803 "#version 450\n"
2804 "\n"
2805 "out gl_PerVertex {\n"
2806 " vec4 gl_Position;\n"
2807 "};\n"
2808 "void main(){\n"
2809 " gl_Position = vec4(1);\n"
2810 "}\n";
2811 char const *fsSource =
2812 "#version 450\n"
2813 "\n"
2814 "layout(location=0) out vec4 color;\n"
2815 "void main(){\n"
2816 " color = vec4(1);\n"
2817 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002818
2819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
2820 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2821 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2822
2823 VkPipelineObj pipe(m_device);
2824 pipe.AddColorAttachment();
2825 pipe.AddShader(&vs);
2826 pipe.AddShader(&fs);
2827
2828 pipe.AddVertexInputBindings(&input_binding, 1);
2829 pipe.AddVertexInputAttribs(&input_attribs, 1);
2830
2831 VkDescriptorSetObj descriptorSet(m_device);
2832 descriptorSet.AppendDummy();
2833 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
2834
2835 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
2836
2837 m_errorMonitor->VerifyFound();
2838}
2839
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002840TEST_F(VkLayerTest, ImageSampleCounts) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002841 TEST_DESCRIPTION(
2842 "Use bad sample counts in image transfer calls to trigger "
2843 "validation errors.");
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002844 ASSERT_NO_FATAL_FAILURE(InitState());
2845
2846 VkMemoryPropertyFlags reqs = 0;
2847 VkImageCreateInfo image_create_info = {};
2848 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2849 image_create_info.pNext = NULL;
2850 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2851 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
2852 image_create_info.extent.width = 256;
2853 image_create_info.extent.height = 256;
2854 image_create_info.extent.depth = 1;
2855 image_create_info.mipLevels = 1;
2856 image_create_info.arrayLayers = 1;
2857 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2858 image_create_info.flags = 0;
2859
2860 VkImageBlit blit_region = {};
2861 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2862 blit_region.srcSubresource.baseArrayLayer = 0;
2863 blit_region.srcSubresource.layerCount = 1;
2864 blit_region.srcSubresource.mipLevel = 0;
2865 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2866 blit_region.dstSubresource.baseArrayLayer = 0;
2867 blit_region.dstSubresource.layerCount = 1;
2868 blit_region.dstSubresource.mipLevel = 0;
2869
2870 // Create two images, the source with sampleCount = 2, and attempt to blit
2871 // between them
2872 {
2873 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002874 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002875 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002876 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002877 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002878 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002879 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002880 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002881 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2883 "was created with a sample count "
2884 "of VK_SAMPLE_COUNT_2_BIT but "
2885 "must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002886 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2887 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002888 m_errorMonitor->VerifyFound();
2889 m_commandBuffer->EndCommandBuffer();
2890 }
2891
2892 // Create two images, the dest with sampleCount = 4, and attempt to blit
2893 // between them
2894 {
2895 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002896 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002897 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002898 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002899 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002900 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002901 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002902 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002903 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002904 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2905 "was created with a sample count "
2906 "of VK_SAMPLE_COUNT_4_BIT but "
2907 "must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002908 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2909 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002910 m_errorMonitor->VerifyFound();
2911 m_commandBuffer->EndCommandBuffer();
2912 }
2913
2914 VkBufferImageCopy copy_region = {};
2915 copy_region.bufferRowLength = 128;
2916 copy_region.bufferImageHeight = 128;
2917 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2918 copy_region.imageSubresource.layerCount = 1;
2919 copy_region.imageExtent.height = 64;
2920 copy_region.imageExtent.width = 64;
2921 copy_region.imageExtent.depth = 1;
2922
2923 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
2924 // buffer to image
2925 {
2926 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002927 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
2928 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002929 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002930 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002931 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002932 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2934 "was created with a sample count "
2935 "of VK_SAMPLE_COUNT_8_BIT but "
2936 "must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002937 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
2938 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002939 m_errorMonitor->VerifyFound();
2940 m_commandBuffer->EndCommandBuffer();
2941 }
2942
2943 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
2944 // image to buffer
2945 {
2946 vk_testing::Buffer dst_buffer;
2947 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
2948 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002949 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002950 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002951 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002952 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2954 "was created with a sample count "
2955 "of VK_SAMPLE_COUNT_2_BIT but "
2956 "must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002957 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002958 dst_buffer.handle(), 1, &copy_region);
2959 m_errorMonitor->VerifyFound();
2960 m_commandBuffer->EndCommandBuffer();
2961 }
2962}
2963
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002964TEST_F(VkLayerTest, BlitImageFormats) {
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002965 ASSERT_NO_FATAL_FAILURE(InitState());
2966
2967 VkImageObj src_image(m_device);
2968 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
2969 VkImageObj dst_image(m_device);
2970 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
2971 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06002972 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 -06002973
2974 VkImageBlit blitRegion = {};
2975 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2976 blitRegion.srcSubresource.baseArrayLayer = 0;
2977 blitRegion.srcSubresource.layerCount = 1;
2978 blitRegion.srcSubresource.mipLevel = 0;
2979 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2980 blitRegion.dstSubresource.baseArrayLayer = 0;
2981 blitRegion.dstSubresource.layerCount = 1;
2982 blitRegion.dstSubresource.mipLevel = 0;
2983
Dave Houlton34df4cb2016-12-01 16:43:06 -07002984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
2985
2986 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
2987 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002988
2989 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07002990 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002991 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(), dst_image.layout(), 1,
2992 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002993
2994 m_errorMonitor->VerifyFound();
2995
Dave Houlton34df4cb2016-12-01 16:43:06 -07002996 // Test should generate 2 VU failures
2997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
2998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002999
3000 // Unsigned int vs signed int
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003001 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(), dst_image2.layout(), 1,
3002 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003003
Dave Houlton34df4cb2016-12-01 16:43:06 -07003004 // TODO: Note that this only verifies that at least one of the VU enums was found
3005 // 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 -06003006 m_errorMonitor->VerifyFound();
3007
Tony Barbour552f6c02016-12-21 14:34:07 -07003008 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003009}
3010
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003011TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3012 VkResult err;
3013 bool pass;
3014
3015 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
3016 ASSERT_NO_FATAL_FAILURE(InitState());
3017
3018 // If w/d/h granularity is 1, test is not meaningful
3019 // TODO: When virtual device limits are available, create a set of limits for this test that
3020 // will always have a granularity of > 1 for w, h, and d
3021 auto index = m_device->graphics_queue_node_index_;
3022 auto queue_family_properties = m_device->phy().queue_properties();
3023
3024 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3025 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3026 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3027 return;
3028 }
3029
3030 // Create two images of different types and try to copy between them
3031 VkImage srcImage;
3032 VkImage dstImage;
3033 VkDeviceMemory srcMem;
3034 VkDeviceMemory destMem;
3035 VkMemoryRequirements memReqs;
3036
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003037 VkImageCreateInfo image_create_info = {};
3038 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3039 image_create_info.pNext = NULL;
3040 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3041 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3042 image_create_info.extent.width = 32;
3043 image_create_info.extent.height = 32;
3044 image_create_info.extent.depth = 1;
3045 image_create_info.mipLevels = 1;
3046 image_create_info.arrayLayers = 4;
3047 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3048 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3049 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3050 image_create_info.flags = 0;
3051
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003052 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003053 ASSERT_VK_SUCCESS(err);
3054
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003055 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003056 ASSERT_VK_SUCCESS(err);
3057
3058 // Allocate memory
3059 VkMemoryAllocateInfo memAlloc = {};
3060 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3061 memAlloc.pNext = NULL;
3062 memAlloc.allocationSize = 0;
3063 memAlloc.memoryTypeIndex = 0;
3064
3065 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3066 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003067 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003068 ASSERT_TRUE(pass);
3069 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3070 ASSERT_VK_SUCCESS(err);
3071
3072 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3073 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003074 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003075 ASSERT_VK_SUCCESS(err);
3076 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3077 ASSERT_VK_SUCCESS(err);
3078
3079 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3080 ASSERT_VK_SUCCESS(err);
3081 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3082 ASSERT_VK_SUCCESS(err);
3083
Tony Barbour552f6c02016-12-21 14:34:07 -07003084 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003085 VkImageCopy copyRegion;
3086 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3087 copyRegion.srcSubresource.mipLevel = 0;
3088 copyRegion.srcSubresource.baseArrayLayer = 0;
3089 copyRegion.srcSubresource.layerCount = 1;
3090 copyRegion.srcOffset.x = 0;
3091 copyRegion.srcOffset.y = 0;
3092 copyRegion.srcOffset.z = 0;
3093 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3094 copyRegion.dstSubresource.mipLevel = 0;
3095 copyRegion.dstSubresource.baseArrayLayer = 0;
3096 copyRegion.dstSubresource.layerCount = 1;
3097 copyRegion.dstOffset.x = 0;
3098 copyRegion.dstOffset.y = 0;
3099 copyRegion.dstOffset.z = 0;
3100 copyRegion.extent.width = 1;
3101 copyRegion.extent.height = 1;
3102 copyRegion.extent.depth = 1;
3103
3104 // Introduce failure by setting srcOffset to a bad granularity value
3105 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003106 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3107 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003108 m_errorMonitor->VerifyFound();
3109
3110 // Introduce failure by setting extent to a bad granularity value
3111 copyRegion.srcOffset.y = 0;
3112 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3114 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003115 m_errorMonitor->VerifyFound();
3116
3117 // Now do some buffer/image copies
3118 vk_testing::Buffer buffer;
3119 VkMemoryPropertyFlags reqs = 0;
3120 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3121 VkBufferImageCopy region = {};
3122 region.bufferOffset = 0;
3123 region.bufferRowLength = 3;
3124 region.bufferImageHeight = 128;
3125 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3126 region.imageSubresource.layerCount = 1;
3127 region.imageExtent.height = 16;
3128 region.imageExtent.width = 16;
3129 region.imageExtent.depth = 1;
3130 region.imageOffset.x = 0;
3131 region.imageOffset.y = 0;
3132 region.imageOffset.z = 0;
3133
3134 // Introduce failure by setting bufferRowLength to a bad granularity value
3135 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3137 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3138 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003139 m_errorMonitor->VerifyFound();
3140 region.bufferRowLength = 128;
3141
3142 // Introduce failure by setting bufferOffset to a bad granularity value
3143 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3145 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3146 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003147 m_errorMonitor->VerifyFound();
3148 region.bufferOffset = 0;
3149
3150 // Introduce failure by setting bufferImageHeight to a bad granularity value
3151 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3153 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3154 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003155 m_errorMonitor->VerifyFound();
3156 region.bufferImageHeight = 128;
3157
3158 // Introduce failure by setting imageExtent to a bad granularity value
3159 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3161 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3162 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003163 m_errorMonitor->VerifyFound();
3164 region.imageExtent.width = 16;
3165
3166 // Introduce failure by setting imageOffset to a bad granularity value
3167 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3169 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3170 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003171 m_errorMonitor->VerifyFound();
3172
Tony Barbour552f6c02016-12-21 14:34:07 -07003173 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003174
3175 vkDestroyImage(m_device->device(), srcImage, NULL);
3176 vkDestroyImage(m_device->device(), dstImage, NULL);
3177 vkFreeMemory(m_device->device(), srcMem, NULL);
3178 vkFreeMemory(m_device->device(), destMem, NULL);
3179}
3180
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003181TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003182 TEST_DESCRIPTION(
3183 "Submit command buffer created using one queue family and "
3184 "attempt to submit them on a queue created in a different "
3185 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003186
Cody Northropc31a84f2016-08-22 10:41:47 -06003187 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003188 // This test is meaningless unless we have multiple queue families
3189 auto queue_family_properties = m_device->phy().queue_properties();
3190 if (queue_family_properties.size() < 2) {
3191 return;
3192 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003194 // Get safe index of another queue family
3195 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
3196 ASSERT_NO_FATAL_FAILURE(InitState());
3197 // Create a second queue using a different queue family
3198 VkQueue other_queue;
3199 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3200
3201 // Record an empty cmd buffer
3202 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3203 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3204 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3205 vkEndCommandBuffer(m_commandBuffer->handle());
3206
3207 // And submit on the wrong queue
3208 VkSubmitInfo submit_info = {};
3209 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3210 submit_info.commandBufferCount = 1;
3211 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003212 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003213
3214 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003215}
3216
Chris Forbes4c24a922016-11-16 08:59:10 +13003217TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
3218 ASSERT_NO_FATAL_FAILURE(InitState());
3219
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003220 // There are no attachments, but refer to attachment 0.
3221 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003222 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003223 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003224 };
3225
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003226 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003227 VkRenderPass rp;
3228
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003229 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003231 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3232 m_errorMonitor->VerifyFound();
3233}
3234
Chris Forbesa58c4522016-09-28 15:19:39 +13003235TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3236 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
3237 ASSERT_NO_FATAL_FAILURE(InitState());
3238
3239 // A renderpass with two subpasses, both writing the same attachment.
3240 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003241 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3242 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3243 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003244 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003245 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003246 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003247 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3248 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003249 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003250 VkSubpassDependency dep = {0,
3251 1,
3252 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3253 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3254 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3255 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3256 VK_DEPENDENCY_BY_REGION_BIT};
3257 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003258 VkRenderPass rp;
3259 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3260 ASSERT_VK_SUCCESS(err);
3261
3262 VkImageObj image(m_device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003263 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 +13003264 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3265
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003266 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003267 VkFramebuffer fb;
3268 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3269 ASSERT_VK_SUCCESS(err);
3270
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003271 char const *vsSource =
3272 "#version 450\n"
3273 "void main() { gl_Position = vec4(1); }\n";
3274 char const *fsSource =
3275 "#version 450\n"
3276 "layout(location=0) out vec4 color;\n"
3277 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003278
3279 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3280 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3281 VkPipelineObj pipe(m_device);
3282 pipe.AddColorAttachment();
3283 pipe.AddShader(&vs);
3284 pipe.AddShader(&fs);
3285 VkViewport view_port = {};
3286 m_viewports.push_back(view_port);
3287 pipe.SetViewport(m_viewports);
3288 VkRect2D rect = {};
3289 m_scissors.push_back(rect);
3290 pipe.SetScissor(m_scissors);
3291
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003292 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003293 VkPipelineLayout pl;
3294 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3295 ASSERT_VK_SUCCESS(err);
3296 pipe.CreateVKPipeline(pl, rp);
3297
Tony Barbour552f6c02016-12-21 14:34:07 -07003298 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003299
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003300 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3301 nullptr,
3302 rp,
3303 fb,
3304 {{
3305 0, 0,
3306 },
3307 {32, 32}},
3308 0,
3309 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003310
3311 // subtest 1: bind in the wrong subpass
3312 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3313 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003314 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 +13003315 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3316 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3317 m_errorMonitor->VerifyFound();
3318
3319 vkCmdEndRenderPass(m_commandBuffer->handle());
3320
3321 // subtest 2: bind in correct subpass, then transition to next subpass
3322 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3323 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3324 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003325 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 +13003326 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3327 m_errorMonitor->VerifyFound();
3328
3329 vkCmdEndRenderPass(m_commandBuffer->handle());
3330
Tony Barbour552f6c02016-12-21 14:34:07 -07003331 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003332
3333 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3334 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3335 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3336}
3337
Tony Barbour4e919972016-08-09 13:27:40 -06003338TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003339 TEST_DESCRIPTION(
3340 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3341 "with extent outside of framebuffer");
Tony Barbour4e919972016-08-09 13:27:40 -06003342 ASSERT_NO_FATAL_FAILURE(InitState());
3343 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3344
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3346 "Cannot execute a render pass with renderArea "
3347 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003348
3349 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3350 m_renderPassBeginInfo.renderArea.extent.width = 257;
3351 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003352 m_commandBuffer->BeginCommandBuffer();
3353 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003354 m_errorMonitor->VerifyFound();
3355}
3356
3357TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003358 TEST_DESCRIPTION(
3359 "Generate INDEPENDENT_BLEND by disabling independent "
3360 "blend and then specifying different blend states for two "
3361 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003362 VkPhysicalDeviceFeatures features = {};
3363 features.independentBlend = VK_FALSE;
Cody Northropc31a84f2016-08-22 10:41:47 -06003364 ASSERT_NO_FATAL_FAILURE(InitState(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003365
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3367 "Invalid Pipeline CreateInfo: If independent blend feature not "
3368 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003369
Cody Northropc31a84f2016-08-22 10:41:47 -06003370 VkDescriptorSetObj descriptorSet(m_device);
3371 descriptorSet.AppendDummy();
3372 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003373
Cody Northropc31a84f2016-08-22 10:41:47 -06003374 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003375 // Create a renderPass with two color attachments
3376 VkAttachmentReference attachments[2] = {};
3377 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3378 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3379
3380 VkSubpassDescription subpass = {};
3381 subpass.pColorAttachments = attachments;
3382 subpass.colorAttachmentCount = 2;
3383
3384 VkRenderPassCreateInfo rpci = {};
3385 rpci.subpassCount = 1;
3386 rpci.pSubpasses = &subpass;
3387 rpci.attachmentCount = 1;
3388
3389 VkAttachmentDescription attach_desc = {};
3390 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3391 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3392 attach_desc.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3393 attach_desc.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3394
3395 rpci.pAttachments = &attach_desc;
3396 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3397
3398 VkRenderPass renderpass;
3399 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003400 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003401 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003402
Cody Northropc31a84f2016-08-22 10:41:47 -06003403 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3404 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3405 att_state1.blendEnable = VK_TRUE;
3406 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3407 att_state2.blendEnable = VK_FALSE;
3408 pipeline.AddColorAttachment(0, &att_state1);
3409 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003410 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003411 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003412 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003413}
3414
Mike Weiblen40b160e2017-02-06 19:21:52 -07003415// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3416TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3417 TEST_DESCRIPTION(
3418 "Create a graphics pipeline that is incompatible with the requirements "
3419 "of its contained Renderpass/subpasses.");
3420 ASSERT_NO_FATAL_FAILURE(InitState());
3421
3422 VkDescriptorSetObj ds_obj(m_device);
3423 ds_obj.AppendDummy();
3424 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3425
3426 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3427
3428 VkPipelineColorBlendAttachmentState att_state1 = {};
3429 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3430 att_state1.blendEnable = VK_TRUE;
3431
3432 VkRenderpassObj rp_obj(m_device);
3433
3434 {
3435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3436 VkPipelineObj pipeline(m_device);
3437 pipeline.AddShader(&vs_obj);
3438 pipeline.AddColorAttachment(0, &att_state1);
3439
3440 VkGraphicsPipelineCreateInfo info = {};
3441 pipeline.InitGraphicsPipelineCreateInfo(&info);
3442 info.pColorBlendState = nullptr;
3443
3444 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3445 m_errorMonitor->VerifyFound();
3446 }
3447}
3448
Chris Forbes26ec2122016-11-29 08:58:33 +13003449#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003450TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3451 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3452 "depth attachments in subpass");
Cody Northropc31a84f2016-08-22 10:41:47 -06003453 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour4e919972016-08-09 13:27:40 -06003454
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3456 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003457
3458 // Create a renderPass with a single color attachment
3459 VkAttachmentReference attach = {};
3460 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3461 VkSubpassDescription subpass = {};
3462 VkRenderPassCreateInfo rpci = {};
3463 rpci.subpassCount = 1;
3464 rpci.pSubpasses = &subpass;
3465 rpci.attachmentCount = 1;
3466 VkAttachmentDescription attach_desc = {};
3467 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3468 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3469 rpci.pAttachments = &attach_desc;
3470 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3471 VkRenderPass rp;
3472 subpass.pDepthStencilAttachment = &attach;
3473 subpass.pColorAttachments = NULL;
3474 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3475 m_errorMonitor->VerifyFound();
3476}
Chris Forbes26ec2122016-11-29 08:58:33 +13003477#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003478
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003479TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003480 TEST_DESCRIPTION(
3481 "Create a framebuffer where a subpass has a preserve "
3482 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003483
3484 ASSERT_NO_FATAL_FAILURE(InitState());
3485 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3486
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003488
3489 VkAttachmentReference color_attach = {};
3490 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3491 color_attach.attachment = 0;
3492 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3493 VkSubpassDescription subpass = {};
3494 subpass.colorAttachmentCount = 1;
3495 subpass.pColorAttachments = &color_attach;
3496 subpass.preserveAttachmentCount = 1;
3497 subpass.pPreserveAttachments = &preserve_attachment;
3498
3499 VkRenderPassCreateInfo rpci = {};
3500 rpci.subpassCount = 1;
3501 rpci.pSubpasses = &subpass;
3502 rpci.attachmentCount = 1;
3503 VkAttachmentDescription attach_desc = {};
3504 attach_desc.format = VK_FORMAT_UNDEFINED;
3505 rpci.pAttachments = &attach_desc;
3506 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3507 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003508 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003509
3510 m_errorMonitor->VerifyFound();
3511
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003512 if (result == VK_SUCCESS) {
3513 vkDestroyRenderPass(m_device->device(), rp, NULL);
3514 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003515}
3516
Chris Forbesc5389742016-06-29 11:49:23 +12003517TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003518 TEST_DESCRIPTION(
3519 "Ensure that CreateRenderPass produces a validation error "
3520 "when the source of a subpass multisample resolve "
3521 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003522
Chris Forbesc5389742016-06-29 11:49:23 +12003523 ASSERT_NO_FATAL_FAILURE(InitState());
3524
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3526 "Subpass 0 requests multisample resolve from attachment 0 which has "
3527 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003528
3529 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003530 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3531 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3532 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3533 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3534 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3535 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003536 };
3537
3538 VkAttachmentReference color = {
3539 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3540 };
3541
3542 VkAttachmentReference resolve = {
3543 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3544 };
3545
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003546 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003547
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003548 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003549
3550 VkRenderPass rp;
3551 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3552
3553 m_errorMonitor->VerifyFound();
3554
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003555 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003556}
3557
3558TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003559 TEST_DESCRIPTION(
3560 "Ensure CreateRenderPass produces a validation error "
3561 "when a subpass multisample resolve operation is "
3562 "requested, and the destination of that resolve has "
3563 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003564
Chris Forbesc5389742016-06-29 11:49:23 +12003565 ASSERT_NO_FATAL_FAILURE(InitState());
3566
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3568 "Subpass 0 requests multisample resolve into attachment 1, which "
3569 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003570
3571 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003572 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3573 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3574 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3575 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3576 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3577 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003578 };
3579
3580 VkAttachmentReference color = {
3581 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3582 };
3583
3584 VkAttachmentReference resolve = {
3585 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3586 };
3587
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003588 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003589
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003590 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003591
3592 VkRenderPass rp;
3593 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3594
3595 m_errorMonitor->VerifyFound();
3596
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003597 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003598}
3599
Chris Forbes3f128ef2016-06-29 14:58:53 +12003600TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003601 TEST_DESCRIPTION(
3602 "Ensure CreateRenderPass produces a validation error "
3603 "when the color and depth attachments used by a subpass "
3604 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003605
Chris Forbes3f128ef2016-06-29 14:58:53 +12003606 ASSERT_NO_FATAL_FAILURE(InitState());
3607
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3609 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003610
3611 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003612 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3613 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3614 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3615 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3616 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3617 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003618 };
3619
3620 VkAttachmentReference color[] = {
3621 {
3622 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3623 },
3624 {
3625 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3626 },
3627 };
3628
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003629 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003630
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003631 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003632
3633 VkRenderPass rp;
3634 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3635
3636 m_errorMonitor->VerifyFound();
3637
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003638 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003639}
3640
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003641TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003642 TEST_DESCRIPTION(
3643 "Hit errors when attempting to create a framebuffer :\n"
3644 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3645 " 2. Use a color image as depthStencil attachment\n"
3646 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3647 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3648 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3649 " 6. Framebuffer attachment where dimensions don't match\n"
3650 " 7. Framebuffer attachment w/o identity swizzle\n"
3651 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003652
3653 ASSERT_NO_FATAL_FAILURE(InitState());
3654 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3655
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3657 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
3658 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003659
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003660 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003661 VkAttachmentReference attach = {};
3662 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3663 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003664 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003665 VkRenderPassCreateInfo rpci = {};
3666 rpci.subpassCount = 1;
3667 rpci.pSubpasses = &subpass;
3668 rpci.attachmentCount = 1;
3669 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003670 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003671 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003672 rpci.pAttachments = &attach_desc;
3673 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3674 VkRenderPass rp;
3675 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3676 ASSERT_VK_SUCCESS(err);
3677
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003678 VkImageView ivs[2];
3679 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3680 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003681 VkFramebufferCreateInfo fb_info = {};
3682 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3683 fb_info.pNext = NULL;
3684 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003685 // Set mis-matching attachmentCount
3686 fb_info.attachmentCount = 2;
3687 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003688 fb_info.width = 100;
3689 fb_info.height = 100;
3690 fb_info.layers = 1;
3691
3692 VkFramebuffer fb;
3693 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3694
3695 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003696 if (err == VK_SUCCESS) {
3697 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3698 }
3699 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003700
3701 // Create a renderPass with a depth-stencil attachment created with
3702 // IMAGE_USAGE_COLOR_ATTACHMENT
3703 // Add our color attachment to pDepthStencilAttachment
3704 subpass.pDepthStencilAttachment = &attach;
3705 subpass.pColorAttachments = NULL;
3706 VkRenderPass rp_ds;
3707 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3708 ASSERT_VK_SUCCESS(err);
3709 // Set correct attachment count, but attachment has COLOR usage bit set
3710 fb_info.attachmentCount = 1;
3711 fb_info.renderPass = rp_ds;
3712
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003714 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3715
3716 m_errorMonitor->VerifyFound();
3717 if (err == VK_SUCCESS) {
3718 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3719 }
3720 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003721
3722 // Create new renderpass with alternate attachment format from fb
3723 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3724 subpass.pDepthStencilAttachment = NULL;
3725 subpass.pColorAttachments = &attach;
3726 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3727 ASSERT_VK_SUCCESS(err);
3728
3729 // Cause error due to mis-matched formats between rp & fb
3730 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3731 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3733 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003734 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3735
3736 m_errorMonitor->VerifyFound();
3737 if (err == VK_SUCCESS) {
3738 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3739 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003740 vkDestroyRenderPass(m_device->device(), rp, NULL);
3741
3742 // Create new renderpass with alternate sample count from fb
3743 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3744 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3745 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3746 ASSERT_VK_SUCCESS(err);
3747
3748 // Cause error due to mis-matched sample count between rp & fb
3749 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003750 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3751 " has VK_SAMPLE_COUNT_1_BIT samples "
3752 "that do not match the "
3753 "VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003754 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3755
3756 m_errorMonitor->VerifyFound();
3757 if (err == VK_SUCCESS) {
3758 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3759 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003760
3761 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003762
3763 // Create a custom imageView with non-1 mip levels
3764 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003765 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 -06003766 ASSERT_TRUE(image.initialized());
3767
3768 VkImageView view;
3769 VkImageViewCreateInfo ivci = {};
3770 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3771 ivci.image = image.handle();
3772 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3773 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3774 ivci.subresourceRange.layerCount = 1;
3775 ivci.subresourceRange.baseMipLevel = 0;
3776 // Set level count 2 (only 1 is allowed for FB attachment)
3777 ivci.subresourceRange.levelCount = 2;
3778 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3779 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3780 ASSERT_VK_SUCCESS(err);
3781 // Re-create renderpass to have matching sample count
3782 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3783 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3784 ASSERT_VK_SUCCESS(err);
3785
3786 fb_info.renderPass = rp;
3787 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003789 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3790
3791 m_errorMonitor->VerifyFound();
3792 if (err == VK_SUCCESS) {
3793 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3794 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003795 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003796 // Update view to original color buffer and grow FB dimensions too big
3797 fb_info.pAttachments = ivs;
3798 fb_info.height = 1024;
3799 fb_info.width = 1024;
3800 fb_info.layers = 2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003801 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3802 " Attachment dimensions must be at "
3803 "least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003804 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3805
3806 m_errorMonitor->VerifyFound();
3807 if (err == VK_SUCCESS) {
3808 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3809 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003810 // Create view attachment with non-identity swizzle
3811 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3812 ivci.image = image.handle();
3813 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3814 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3815 ivci.subresourceRange.layerCount = 1;
3816 ivci.subresourceRange.baseMipLevel = 0;
3817 ivci.subresourceRange.levelCount = 1;
3818 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3819 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
3820 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
3821 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
3822 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
3823 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3824 ASSERT_VK_SUCCESS(err);
3825
3826 fb_info.pAttachments = &view;
3827 fb_info.height = 100;
3828 fb_info.width = 100;
3829 fb_info.layers = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3831 " has non-identy swizzle. All "
3832 "framebuffer attachments must have "
3833 "been created with the identity "
3834 "swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003835 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3836
3837 m_errorMonitor->VerifyFound();
3838 if (err == VK_SUCCESS) {
3839 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3840 }
3841 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003842 // reset attachment to color attachment
3843 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003844
3845 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003846 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003847 fb_info.height = 100;
3848 fb_info.layers = 1;
3849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
3850 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3851
3852 m_errorMonitor->VerifyFound();
3853 if (err == VK_SUCCESS) {
3854 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3855 }
3856
3857 // Request fb that exceeds max height
3858 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003859 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003860 fb_info.layers = 1;
3861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
3862 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3863
3864 m_errorMonitor->VerifyFound();
3865 if (err == VK_SUCCESS) {
3866 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3867 }
3868
3869 // Request fb that exceeds max layers
3870 fb_info.width = 100;
3871 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003872 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003874 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3875
3876 m_errorMonitor->VerifyFound();
3877 if (err == VK_SUCCESS) {
3878 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3879 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003880
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003881 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003882}
3883
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003884TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003885 TEST_DESCRIPTION(
3886 "Run a simple draw calls to validate failure when Depth Bias dynamic "
3887 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003888
Cody Northropc31a84f2016-08-22 10:41:47 -06003889 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003890 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
3892 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003893 m_errorMonitor->VerifyFound();
3894}
3895
3896TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003897 TEST_DESCRIPTION(
3898 "Run a simple draw calls to validate failure when Line Width dynamic "
3899 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003900
Cody Northropc31a84f2016-08-22 10:41:47 -06003901 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003902 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
3904 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003905 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003906}
3907
3908TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003909 TEST_DESCRIPTION(
3910 "Run a simple draw calls to validate failure when Viewport dynamic "
3911 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003912
Cody Northropc31a84f2016-08-22 10:41:47 -06003913 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003914 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003915 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3916 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003917 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003918 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003919}
3920
3921TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003922 TEST_DESCRIPTION(
3923 "Run a simple draw calls to validate failure when Scissor dynamic "
3924 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003925
Cody Northropc31a84f2016-08-22 10:41:47 -06003926 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003927 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3929 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003930 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003931 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003932}
3933
Cortd713fe82016-07-27 09:51:27 -07003934TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003935 TEST_DESCRIPTION(
3936 "Run a simple draw calls to validate failure when Blend Constants "
3937 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003938
3939 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003940 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3942 "Dynamic blend constants state not set for this command buffer");
3943 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06003944 m_errorMonitor->VerifyFound();
3945}
3946
3947TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003948 TEST_DESCRIPTION(
3949 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
3950 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003951
3952 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003953 if (!m_device->phy().features().depthBounds) {
3954 printf("Device does not support depthBounds test; skipped.\n");
3955 return;
3956 }
3957 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3959 "Dynamic depth bounds state not set for this command buffer");
3960 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003961 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003962}
3963
3964TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003965 TEST_DESCRIPTION(
3966 "Run a simple draw calls to validate failure when Stencil Read dynamic "
3967 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003968
3969 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003970 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3972 "Dynamic stencil read mask state not set for this command buffer");
3973 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003974 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003975}
3976
3977TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003978 TEST_DESCRIPTION(
3979 "Run a simple draw calls to validate failure when Stencil Write dynamic"
3980 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003981
3982 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003983 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3985 "Dynamic stencil write mask state not set for this command buffer");
3986 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003987 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003988}
3989
3990TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003991 TEST_DESCRIPTION(
3992 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
3993 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003994
3995 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003996 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3998 "Dynamic stencil reference state not set for this command buffer");
3999 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004000 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004001}
4002
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004003TEST_F(VkLayerTest, IndexBufferNotBound) {
4004 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004005
4006 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4008 "Index buffer object not bound to this command buffer when Indexed ");
4009 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004010 m_errorMonitor->VerifyFound();
4011}
4012
Karl Schultz6addd812016-02-02 17:17:23 -07004013TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4015 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4016 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004017
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004018 ASSERT_NO_FATAL_FAILURE(InitState());
4019 ASSERT_NO_FATAL_FAILURE(InitViewport());
4020 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4021
Karl Schultz6addd812016-02-02 17:17:23 -07004022 // We luck out b/c by default the framework creates CB w/ the
4023 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004024 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004025 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004026 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004027
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004028 // Bypass framework since it does the waits automatically
4029 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004030 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004031 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4032 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004033 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004034 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004035 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004036 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004037 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004038 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004039 submit_info.pSignalSemaphores = NULL;
4040
Chris Forbes40028e22016-06-13 09:59:34 +12004041 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004042 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004043 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004044
Karl Schultz6addd812016-02-02 17:17:23 -07004045 // Cause validation error by re-submitting cmd buffer that should only be
4046 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004047 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004048 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004049
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004050 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004051}
4052
Karl Schultz6addd812016-02-02 17:17:23 -07004053TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004054 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004055 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004056
4057 ASSERT_NO_FATAL_FAILURE(InitState());
4058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004059
Karl Schultz6addd812016-02-02 17:17:23 -07004060 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4061 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004062 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004063 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004064 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004065
4066 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004067 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4068 ds_pool_ci.pNext = NULL;
4069 ds_pool_ci.flags = 0;
4070 ds_pool_ci.maxSets = 1;
4071 ds_pool_ci.poolSizeCount = 1;
4072 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004073
4074 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004075 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004076 ASSERT_VK_SUCCESS(err);
4077
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004078 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4079 dsl_binding_samp.binding = 0;
4080 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4081 dsl_binding_samp.descriptorCount = 1;
4082 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4083 dsl_binding_samp.pImmutableSamplers = NULL;
4084
4085 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4086 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4087 ds_layout_ci.pNext = NULL;
4088 ds_layout_ci.bindingCount = 1;
4089 ds_layout_ci.pBindings = &dsl_binding_samp;
4090
4091 VkDescriptorSetLayout ds_layout_samp;
4092 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4093 ASSERT_VK_SUCCESS(err);
4094
4095 // Try to allocate 2 sets when pool only has 1 set
4096 VkDescriptorSet descriptor_sets[2];
4097 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4098 VkDescriptorSetAllocateInfo alloc_info = {};
4099 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4100 alloc_info.descriptorSetCount = 2;
4101 alloc_info.descriptorPool = ds_pool;
4102 alloc_info.pSetLayouts = set_layouts;
4103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4104 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4105 m_errorMonitor->VerifyFound();
4106
4107 alloc_info.descriptorSetCount = 1;
4108 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004109 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004110 dsl_binding.binding = 0;
4111 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4112 dsl_binding.descriptorCount = 1;
4113 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4114 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004115
Karl Schultz6addd812016-02-02 17:17:23 -07004116 ds_layout_ci.bindingCount = 1;
4117 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004118
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004119 VkDescriptorSetLayout ds_layout_ub;
4120 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004121 ASSERT_VK_SUCCESS(err);
4122
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004123 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004124 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004125 alloc_info.pSetLayouts = &ds_layout_ub;
4126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4127 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004128
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004129 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004130
Karl Schultz2825ab92016-12-02 08:23:14 -07004131 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004132 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004133 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004134}
4135
Karl Schultz6addd812016-02-02 17:17:23 -07004136TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4137 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004138
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004140
Tobin Ehlise735c692015-10-08 13:13:50 -06004141 ASSERT_NO_FATAL_FAILURE(InitState());
4142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004143
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004144 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004145 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4146 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004147
4148 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004149 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4150 ds_pool_ci.pNext = NULL;
4151 ds_pool_ci.maxSets = 1;
4152 ds_pool_ci.poolSizeCount = 1;
4153 ds_pool_ci.flags = 0;
4154 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4155 // app can only call vkResetDescriptorPool on this pool.;
4156 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004157
4158 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004159 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004160 ASSERT_VK_SUCCESS(err);
4161
4162 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004163 dsl_binding.binding = 0;
4164 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4165 dsl_binding.descriptorCount = 1;
4166 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4167 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004168
4169 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004170 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4171 ds_layout_ci.pNext = NULL;
4172 ds_layout_ci.bindingCount = 1;
4173 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004174
4175 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004176 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004177 ASSERT_VK_SUCCESS(err);
4178
4179 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004180 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004181 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004182 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004183 alloc_info.descriptorPool = ds_pool;
4184 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004185 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004186 ASSERT_VK_SUCCESS(err);
4187
4188 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004189 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004190
Chia-I Wuf7458c52015-10-26 21:10:41 +08004191 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4192 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004193}
4194
Karl Schultz6addd812016-02-02 17:17:23 -07004195TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004196 // Attempt to clear Descriptor Pool with bad object.
4197 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004198
4199 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004201 uint64_t fake_pool_handle = 0xbaad6001;
4202 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4203 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004204 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004205}
4206
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004207TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004208 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4209 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004210 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004211 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004212
4213 uint64_t fake_set_handle = 0xbaad6001;
4214 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004215 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004217
4218 ASSERT_NO_FATAL_FAILURE(InitState());
4219
4220 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4221 layout_bindings[0].binding = 0;
4222 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4223 layout_bindings[0].descriptorCount = 1;
4224 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4225 layout_bindings[0].pImmutableSamplers = NULL;
4226
4227 VkDescriptorSetLayout descriptor_set_layout;
4228 VkDescriptorSetLayoutCreateInfo dslci = {};
4229 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4230 dslci.pNext = NULL;
4231 dslci.bindingCount = 1;
4232 dslci.pBindings = layout_bindings;
4233 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004234 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004235
4236 VkPipelineLayout pipeline_layout;
4237 VkPipelineLayoutCreateInfo plci = {};
4238 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4239 plci.pNext = NULL;
4240 plci.setLayoutCount = 1;
4241 plci.pSetLayouts = &descriptor_set_layout;
4242 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004243 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004244
Tony Barbour552f6c02016-12-21 14:34:07 -07004245 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004246 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4247 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004248 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004249 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004250 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4251 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004252}
4253
Karl Schultz6addd812016-02-02 17:17:23 -07004254TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004255 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4256 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004257 uint64_t fake_layout_handle = 0xbaad6001;
4258 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Cody Northropc31a84f2016-08-22 10:41:47 -06004260 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06004261 VkPipelineLayout pipeline_layout;
4262 VkPipelineLayoutCreateInfo plci = {};
4263 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4264 plci.pNext = NULL;
4265 plci.setLayoutCount = 1;
4266 plci.pSetLayouts = &bad_layout;
4267 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4268
4269 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004270}
4271
Mark Muellerd4914412016-06-13 17:52:06 -06004272TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004273 TEST_DESCRIPTION(
4274 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4275 "1) A uniform buffer update must have a valid buffer index."
4276 "2) When using an array of descriptors in a single WriteDescriptor,"
4277 " the descriptor types and stageflags must all be the same."
4278 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004279
Mike Weiblena6666382017-01-05 15:16:11 -07004280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004281
4282 ASSERT_NO_FATAL_FAILURE(InitState());
4283 VkDescriptorPoolSize ds_type_count[4] = {};
4284 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4285 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004286 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004287 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004288 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004289 ds_type_count[2].descriptorCount = 1;
4290 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4291 ds_type_count[3].descriptorCount = 1;
4292
4293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4295 ds_pool_ci.maxSets = 1;
4296 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4297 ds_pool_ci.pPoolSizes = ds_type_count;
4298
4299 VkDescriptorPool ds_pool;
4300 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4301 ASSERT_VK_SUCCESS(err);
4302
Mark Muellerb9896722016-06-16 09:54:29 -06004303 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004304 layout_binding[0].binding = 0;
4305 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4306 layout_binding[0].descriptorCount = 1;
4307 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4308 layout_binding[0].pImmutableSamplers = NULL;
4309
4310 layout_binding[1].binding = 1;
4311 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4312 layout_binding[1].descriptorCount = 1;
4313 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4314 layout_binding[1].pImmutableSamplers = NULL;
4315
4316 VkSamplerCreateInfo sampler_ci = {};
4317 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4318 sampler_ci.pNext = NULL;
4319 sampler_ci.magFilter = VK_FILTER_NEAREST;
4320 sampler_ci.minFilter = VK_FILTER_NEAREST;
4321 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4322 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4323 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4324 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4325 sampler_ci.mipLodBias = 1.0;
4326 sampler_ci.anisotropyEnable = VK_FALSE;
4327 sampler_ci.maxAnisotropy = 1;
4328 sampler_ci.compareEnable = VK_FALSE;
4329 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4330 sampler_ci.minLod = 1.0;
4331 sampler_ci.maxLod = 1.0;
4332 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4333 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4334 VkSampler sampler;
4335
4336 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4337 ASSERT_VK_SUCCESS(err);
4338
4339 layout_binding[2].binding = 2;
4340 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4341 layout_binding[2].descriptorCount = 1;
4342 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4343 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4344
Mark Muellerd4914412016-06-13 17:52:06 -06004345 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4346 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4347 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4348 ds_layout_ci.pBindings = layout_binding;
4349 VkDescriptorSetLayout ds_layout;
4350 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4351 ASSERT_VK_SUCCESS(err);
4352
4353 VkDescriptorSetAllocateInfo alloc_info = {};
4354 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4355 alloc_info.descriptorSetCount = 1;
4356 alloc_info.descriptorPool = ds_pool;
4357 alloc_info.pSetLayouts = &ds_layout;
4358 VkDescriptorSet descriptorSet;
4359 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4360 ASSERT_VK_SUCCESS(err);
4361
4362 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4363 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4364 pipeline_layout_ci.pNext = NULL;
4365 pipeline_layout_ci.setLayoutCount = 1;
4366 pipeline_layout_ci.pSetLayouts = &ds_layout;
4367
4368 VkPipelineLayout pipeline_layout;
4369 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4370 ASSERT_VK_SUCCESS(err);
4371
Mark Mueller5c838ce2016-06-16 09:54:29 -06004372 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004373 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4374 descriptor_write.dstSet = descriptorSet;
4375 descriptor_write.dstBinding = 0;
4376 descriptor_write.descriptorCount = 1;
4377 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4378
Mark Mueller5c838ce2016-06-16 09:54:29 -06004379 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004380 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4381 m_errorMonitor->VerifyFound();
4382
4383 // Create a buffer to update the descriptor with
4384 uint32_t qfi = 0;
4385 VkBufferCreateInfo buffCI = {};
4386 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4387 buffCI.size = 1024;
4388 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4389 buffCI.queueFamilyIndexCount = 1;
4390 buffCI.pQueueFamilyIndices = &qfi;
4391
4392 VkBuffer dyub;
4393 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4394 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004395
Tony Barboure132c5f2016-12-12 11:50:20 -07004396 VkDeviceMemory mem;
4397 VkMemoryRequirements mem_reqs;
4398 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4399
4400 VkMemoryAllocateInfo mem_alloc_info = {};
4401 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4402 mem_alloc_info.allocationSize = mem_reqs.size;
4403 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4404 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4405 ASSERT_VK_SUCCESS(err);
4406
4407 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4408 ASSERT_VK_SUCCESS(err);
4409
4410 VkDescriptorBufferInfo buffInfo[2] = {};
4411 buffInfo[0].buffer = dyub;
4412 buffInfo[0].offset = 0;
4413 buffInfo[0].range = 1024;
4414 buffInfo[1].buffer = dyub;
4415 buffInfo[1].offset = 0;
4416 buffInfo[1].range = 1024;
4417 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004418 descriptor_write.descriptorCount = 2;
4419
Mark Mueller5c838ce2016-06-16 09:54:29 -06004420 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004422 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4423 m_errorMonitor->VerifyFound();
4424
Mark Mueller5c838ce2016-06-16 09:54:29 -06004425 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4426 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004427 descriptor_write.dstBinding = 1;
4428 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004429
Mark Mueller5c838ce2016-06-16 09:54:29 -06004430 // Make pImageInfo index non-null to avoid complaints of it missing
4431 VkDescriptorImageInfo imageInfo = {};
4432 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4433 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004435 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4436 m_errorMonitor->VerifyFound();
4437
Mark Muellerd4914412016-06-13 17:52:06 -06004438 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004439 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004440 vkDestroySampler(m_device->device(), sampler, NULL);
4441 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4442 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4443 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4444}
4445
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004446TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004447 TEST_DESCRIPTION(
4448 "Attempt to draw with a command buffer that is invalid "
4449 "due to a buffer dependency being destroyed.");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004450 ASSERT_NO_FATAL_FAILURE(InitState());
4451
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004452 VkBuffer buffer;
4453 VkDeviceMemory mem;
4454 VkMemoryRequirements mem_reqs;
4455
4456 VkBufferCreateInfo buf_info = {};
4457 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004458 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004459 buf_info.size = 256;
4460 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4461 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4462 ASSERT_VK_SUCCESS(err);
4463
4464 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4465
4466 VkMemoryAllocateInfo alloc_info = {};
4467 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4468 alloc_info.allocationSize = 256;
4469 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004470 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 -06004471 if (!pass) {
4472 vkDestroyBuffer(m_device->device(), buffer, NULL);
4473 return;
4474 }
4475 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4476 ASSERT_VK_SUCCESS(err);
4477
4478 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4479 ASSERT_VK_SUCCESS(err);
4480
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004481 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004482 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004483 m_commandBuffer->EndCommandBuffer();
4484
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004485 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004486 // Destroy buffer dependency prior to submit to cause ERROR
4487 vkDestroyBuffer(m_device->device(), buffer, NULL);
4488
4489 VkSubmitInfo submit_info = {};
4490 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4491 submit_info.commandBufferCount = 1;
4492 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4493 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4494
4495 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004496 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004497 vkFreeMemory(m_device->handle(), mem, NULL);
4498}
4499
Tobin Ehlisea413442016-09-28 10:23:59 -06004500TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4501 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4502
4503 ASSERT_NO_FATAL_FAILURE(InitState());
4504 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4505
4506 VkDescriptorPoolSize ds_type_count;
4507 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4508 ds_type_count.descriptorCount = 1;
4509
4510 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4511 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4512 ds_pool_ci.maxSets = 1;
4513 ds_pool_ci.poolSizeCount = 1;
4514 ds_pool_ci.pPoolSizes = &ds_type_count;
4515
4516 VkDescriptorPool ds_pool;
4517 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4518 ASSERT_VK_SUCCESS(err);
4519
4520 VkDescriptorSetLayoutBinding layout_binding;
4521 layout_binding.binding = 0;
4522 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4523 layout_binding.descriptorCount = 1;
4524 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4525 layout_binding.pImmutableSamplers = NULL;
4526
4527 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4528 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4529 ds_layout_ci.bindingCount = 1;
4530 ds_layout_ci.pBindings = &layout_binding;
4531 VkDescriptorSetLayout ds_layout;
4532 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4533 ASSERT_VK_SUCCESS(err);
4534
4535 VkDescriptorSetAllocateInfo alloc_info = {};
4536 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4537 alloc_info.descriptorSetCount = 1;
4538 alloc_info.descriptorPool = ds_pool;
4539 alloc_info.pSetLayouts = &ds_layout;
4540 VkDescriptorSet descriptor_set;
4541 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4542 ASSERT_VK_SUCCESS(err);
4543
4544 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4545 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4546 pipeline_layout_ci.pNext = NULL;
4547 pipeline_layout_ci.setLayoutCount = 1;
4548 pipeline_layout_ci.pSetLayouts = &ds_layout;
4549
4550 VkPipelineLayout pipeline_layout;
4551 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4552 ASSERT_VK_SUCCESS(err);
4553
4554 VkBuffer buffer;
4555 uint32_t queue_family_index = 0;
4556 VkBufferCreateInfo buffer_create_info = {};
4557 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4558 buffer_create_info.size = 1024;
4559 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4560 buffer_create_info.queueFamilyIndexCount = 1;
4561 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4562
4563 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4564 ASSERT_VK_SUCCESS(err);
4565
4566 VkMemoryRequirements memory_reqs;
4567 VkDeviceMemory buffer_memory;
4568
4569 VkMemoryAllocateInfo memory_info = {};
4570 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4571 memory_info.allocationSize = 0;
4572 memory_info.memoryTypeIndex = 0;
4573
4574 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4575 memory_info.allocationSize = memory_reqs.size;
4576 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4577 ASSERT_TRUE(pass);
4578
4579 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4580 ASSERT_VK_SUCCESS(err);
4581 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4582 ASSERT_VK_SUCCESS(err);
4583
4584 VkBufferView view;
4585 VkBufferViewCreateInfo bvci = {};
4586 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4587 bvci.buffer = buffer;
4588 bvci.format = VK_FORMAT_R8_UNORM;
4589 bvci.range = VK_WHOLE_SIZE;
4590
4591 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4592 ASSERT_VK_SUCCESS(err);
4593
4594 VkWriteDescriptorSet descriptor_write = {};
4595 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4596 descriptor_write.dstSet = descriptor_set;
4597 descriptor_write.dstBinding = 0;
4598 descriptor_write.descriptorCount = 1;
4599 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4600 descriptor_write.pTexelBufferView = &view;
4601
4602 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4603
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004604 char const *vsSource =
4605 "#version 450\n"
4606 "\n"
4607 "out gl_PerVertex { \n"
4608 " vec4 gl_Position;\n"
4609 "};\n"
4610 "void main(){\n"
4611 " gl_Position = vec4(1);\n"
4612 "}\n";
4613 char const *fsSource =
4614 "#version 450\n"
4615 "\n"
4616 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4617 "layout(location=0) out vec4 x;\n"
4618 "void main(){\n"
4619 " x = imageLoad(s, 0);\n"
4620 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004621 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4622 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4623 VkPipelineObj pipe(m_device);
4624 pipe.AddShader(&vs);
4625 pipe.AddShader(&fs);
4626 pipe.AddColorAttachment();
4627 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4628
4629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted buffer view ");
4630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4631
Tony Barbour552f6c02016-12-21 14:34:07 -07004632 m_commandBuffer->BeginCommandBuffer();
4633 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4634
Tobin Ehlisea413442016-09-28 10:23:59 -06004635 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4636 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4637 VkRect2D scissor = {{0, 0}, {16, 16}};
4638 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4639 // Bind pipeline to cmd buffer
4640 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4641 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4642 &descriptor_set, 0, nullptr);
4643 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004644 m_commandBuffer->EndRenderPass();
4645 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004646
4647 // Delete BufferView in order to invalidate cmd buffer
4648 vkDestroyBufferView(m_device->device(), view, NULL);
4649 // Now attempt submit of cmd buffer
4650 VkSubmitInfo submit_info = {};
4651 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4652 submit_info.commandBufferCount = 1;
4653 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4654 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4655 m_errorMonitor->VerifyFound();
4656
4657 // Clean-up
4658 vkDestroyBuffer(m_device->device(), buffer, NULL);
4659 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4660 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4661 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4662 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4663}
4664
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004665TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004666 TEST_DESCRIPTION(
4667 "Attempt to draw with a command buffer that is invalid "
4668 "due to an image dependency being destroyed.");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004669 ASSERT_NO_FATAL_FAILURE(InitState());
4670
4671 VkImage image;
4672 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4673 VkImageCreateInfo image_create_info = {};
4674 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4675 image_create_info.pNext = NULL;
4676 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4677 image_create_info.format = tex_format;
4678 image_create_info.extent.width = 32;
4679 image_create_info.extent.height = 32;
4680 image_create_info.extent.depth = 1;
4681 image_create_info.mipLevels = 1;
4682 image_create_info.arrayLayers = 1;
4683 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4684 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004685 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004686 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004687 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004688 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004689 // Have to bind memory to image before recording cmd in cmd buffer using it
4690 VkMemoryRequirements mem_reqs;
4691 VkDeviceMemory image_mem;
4692 bool pass;
4693 VkMemoryAllocateInfo mem_alloc = {};
4694 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4695 mem_alloc.pNext = NULL;
4696 mem_alloc.memoryTypeIndex = 0;
4697 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4698 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004699 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004700 ASSERT_TRUE(pass);
4701 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4702 ASSERT_VK_SUCCESS(err);
4703 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4704 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004705
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004706 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004707 VkClearColorValue ccv;
4708 ccv.float32[0] = 1.0f;
4709 ccv.float32[1] = 1.0f;
4710 ccv.float32[2] = 1.0f;
4711 ccv.float32[3] = 1.0f;
4712 VkImageSubresourceRange isr = {};
4713 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004714 isr.baseArrayLayer = 0;
4715 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004716 isr.layerCount = 1;
4717 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004718 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004719 m_commandBuffer->EndCommandBuffer();
4720
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004722 // Destroy image dependency prior to submit to cause ERROR
4723 vkDestroyImage(m_device->device(), image, NULL);
4724
4725 VkSubmitInfo submit_info = {};
4726 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4727 submit_info.commandBufferCount = 1;
4728 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4729 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4730
4731 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004732 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004733}
4734
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004735TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004736 TEST_DESCRIPTION(
4737 "Attempt to draw with a command buffer that is invalid "
4738 "due to a framebuffer image dependency being destroyed.");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004739 VkFormatProperties format_properties;
4740 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004741 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4742 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004743 return;
4744 }
4745
4746 ASSERT_NO_FATAL_FAILURE(InitState());
4747 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4748
4749 VkImageCreateInfo image_ci = {};
4750 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4751 image_ci.pNext = NULL;
4752 image_ci.imageType = VK_IMAGE_TYPE_2D;
4753 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4754 image_ci.extent.width = 32;
4755 image_ci.extent.height = 32;
4756 image_ci.extent.depth = 1;
4757 image_ci.mipLevels = 1;
4758 image_ci.arrayLayers = 1;
4759 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4760 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004761 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004762 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4763 image_ci.flags = 0;
4764 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004765 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004766
4767 VkMemoryRequirements memory_reqs;
4768 VkDeviceMemory image_memory;
4769 bool pass;
4770 VkMemoryAllocateInfo memory_info = {};
4771 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4772 memory_info.pNext = NULL;
4773 memory_info.allocationSize = 0;
4774 memory_info.memoryTypeIndex = 0;
4775 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4776 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004777 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004778 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004779 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004780 ASSERT_VK_SUCCESS(err);
4781 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4782 ASSERT_VK_SUCCESS(err);
4783
4784 VkImageViewCreateInfo ivci = {
4785 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4786 nullptr,
4787 0,
4788 image,
4789 VK_IMAGE_VIEW_TYPE_2D,
4790 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004791 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004792 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4793 };
4794 VkImageView view;
4795 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4796 ASSERT_VK_SUCCESS(err);
4797
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004798 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004799 VkFramebuffer fb;
4800 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4801 ASSERT_VK_SUCCESS(err);
4802
4803 // Just use default renderpass with our framebuffer
4804 m_renderPassBeginInfo.framebuffer = fb;
4805 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004806 m_commandBuffer->BeginCommandBuffer();
4807 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4808 m_commandBuffer->EndRenderPass();
4809 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004810 // Destroy image attached to framebuffer to invalidate cmd buffer
4811 vkDestroyImage(m_device->device(), image, NULL);
4812 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004814 QueueCommandBuffer(false);
4815 m_errorMonitor->VerifyFound();
4816
4817 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4818 vkDestroyImageView(m_device->device(), view, nullptr);
4819 vkFreeMemory(m_device->device(), image_memory, nullptr);
4820}
4821
Tobin Ehlisb329f992016-10-12 13:20:29 -06004822TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
4823 TEST_DESCRIPTION("Delete in-use framebuffer.");
4824 VkFormatProperties format_properties;
4825 VkResult err = VK_SUCCESS;
4826 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4827
4828 ASSERT_NO_FATAL_FAILURE(InitState());
4829 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4830
4831 VkImageObj image(m_device);
4832 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4833 ASSERT_TRUE(image.initialized());
4834 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
4835
4836 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4837 VkFramebuffer fb;
4838 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4839 ASSERT_VK_SUCCESS(err);
4840
4841 // Just use default renderpass with our framebuffer
4842 m_renderPassBeginInfo.framebuffer = fb;
4843 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004844 m_commandBuffer->BeginCommandBuffer();
4845 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4846 m_commandBuffer->EndRenderPass();
4847 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06004848 // Submit cmd buffer to put it in-flight
4849 VkSubmitInfo submit_info = {};
4850 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4851 submit_info.commandBufferCount = 1;
4852 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4853 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4854 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06004856 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4857 m_errorMonitor->VerifyFound();
4858 // Wait for queue to complete so we can safely destroy everything
4859 vkQueueWaitIdle(m_device->m_queue);
4860 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4861}
4862
Tobin Ehlis88becd72016-09-21 14:33:41 -06004863TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
4864 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
4865 VkFormatProperties format_properties;
4866 VkResult err = VK_SUCCESS;
4867 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06004868
4869 ASSERT_NO_FATAL_FAILURE(InitState());
4870 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4871
4872 VkImageCreateInfo image_ci = {};
4873 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4874 image_ci.pNext = NULL;
4875 image_ci.imageType = VK_IMAGE_TYPE_2D;
4876 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4877 image_ci.extent.width = 256;
4878 image_ci.extent.height = 256;
4879 image_ci.extent.depth = 1;
4880 image_ci.mipLevels = 1;
4881 image_ci.arrayLayers = 1;
4882 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4883 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06004884 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06004885 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4886 image_ci.flags = 0;
4887 VkImage image;
4888 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
4889
4890 VkMemoryRequirements memory_reqs;
4891 VkDeviceMemory image_memory;
4892 bool pass;
4893 VkMemoryAllocateInfo memory_info = {};
4894 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4895 memory_info.pNext = NULL;
4896 memory_info.allocationSize = 0;
4897 memory_info.memoryTypeIndex = 0;
4898 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4899 memory_info.allocationSize = memory_reqs.size;
4900 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4901 ASSERT_TRUE(pass);
4902 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
4903 ASSERT_VK_SUCCESS(err);
4904 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4905 ASSERT_VK_SUCCESS(err);
4906
4907 VkImageViewCreateInfo ivci = {
4908 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4909 nullptr,
4910 0,
4911 image,
4912 VK_IMAGE_VIEW_TYPE_2D,
4913 VK_FORMAT_B8G8R8A8_UNORM,
4914 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
4915 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4916 };
4917 VkImageView view;
4918 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4919 ASSERT_VK_SUCCESS(err);
4920
4921 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4922 VkFramebuffer fb;
4923 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4924 ASSERT_VK_SUCCESS(err);
4925
4926 // Just use default renderpass with our framebuffer
4927 m_renderPassBeginInfo.framebuffer = fb;
4928 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004929 m_commandBuffer->BeginCommandBuffer();
4930 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4931 m_commandBuffer->EndRenderPass();
4932 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06004933 // Submit cmd buffer to put it (and attached imageView) in-flight
4934 VkSubmitInfo submit_info = {};
4935 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4936 submit_info.commandBufferCount = 1;
4937 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4938 // Submit cmd buffer to put framebuffer and children in-flight
4939 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4940 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06004942 vkDestroyImage(m_device->device(), image, NULL);
4943 m_errorMonitor->VerifyFound();
4944 // Wait for queue to complete so we can safely destroy image and other objects
4945 vkQueueWaitIdle(m_device->m_queue);
4946 vkDestroyImage(m_device->device(), image, NULL);
4947 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4948 vkDestroyImageView(m_device->device(), view, nullptr);
4949 vkFreeMemory(m_device->device(), image_memory, nullptr);
4950}
4951
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06004952TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
4953 TEST_DESCRIPTION("Delete in-use renderPass.");
4954
4955 ASSERT_NO_FATAL_FAILURE(InitState());
4956 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4957
4958 // Create simple renderpass
4959 VkAttachmentReference attach = {};
4960 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4961 VkSubpassDescription subpass = {};
4962 subpass.pColorAttachments = &attach;
4963 VkRenderPassCreateInfo rpci = {};
4964 rpci.subpassCount = 1;
4965 rpci.pSubpasses = &subpass;
4966 rpci.attachmentCount = 1;
4967 VkAttachmentDescription attach_desc = {};
4968 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4969 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4970 rpci.pAttachments = &attach_desc;
4971 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4972 VkRenderPass rp;
4973 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4974 ASSERT_VK_SUCCESS(err);
4975
4976 // Create a pipeline that uses the given renderpass
4977 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4978 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4979
4980 VkPipelineLayout pipeline_layout;
4981 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4982 ASSERT_VK_SUCCESS(err);
4983
4984 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4985 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4986 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004987 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06004988 vp_state_ci.pViewports = &vp;
4989 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004990 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06004991 vp_state_ci.pScissors = &scissors;
4992
4993 VkPipelineShaderStageCreateInfo shaderStages[2];
4994 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4995
4996 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004997 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 -06004998 // but add it to be able to run on more devices
4999 shaderStages[0] = vs.GetStageCreateInfo();
5000 shaderStages[1] = fs.GetStageCreateInfo();
5001
5002 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5003 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5004
5005 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5006 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5007 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5008
5009 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5010 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5011 rs_ci.rasterizerDiscardEnable = true;
5012 rs_ci.lineWidth = 1.0f;
5013
5014 VkPipelineColorBlendAttachmentState att = {};
5015 att.blendEnable = VK_FALSE;
5016 att.colorWriteMask = 0xf;
5017
5018 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5019 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5020 cb_ci.attachmentCount = 1;
5021 cb_ci.pAttachments = &att;
5022
5023 VkGraphicsPipelineCreateInfo gp_ci = {};
5024 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5025 gp_ci.stageCount = 2;
5026 gp_ci.pStages = shaderStages;
5027 gp_ci.pVertexInputState = &vi_ci;
5028 gp_ci.pInputAssemblyState = &ia_ci;
5029 gp_ci.pViewportState = &vp_state_ci;
5030 gp_ci.pRasterizationState = &rs_ci;
5031 gp_ci.pColorBlendState = &cb_ci;
5032 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5033 gp_ci.layout = pipeline_layout;
5034 gp_ci.renderPass = rp;
5035
5036 VkPipelineCacheCreateInfo pc_ci = {};
5037 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5038
5039 VkPipeline pipeline;
5040 VkPipelineCache pipe_cache;
5041 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5042 ASSERT_VK_SUCCESS(err);
5043
5044 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5045 ASSERT_VK_SUCCESS(err);
5046 // Bind pipeline to cmd buffer, will also bind renderpass
5047 m_commandBuffer->BeginCommandBuffer();
5048 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5049 m_commandBuffer->EndCommandBuffer();
5050
5051 VkSubmitInfo submit_info = {};
5052 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5053 submit_info.commandBufferCount = 1;
5054 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5055 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5056
5057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5058 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5059 m_errorMonitor->VerifyFound();
5060
5061 // Wait for queue to complete so we can safely destroy everything
5062 vkQueueWaitIdle(m_device->m_queue);
5063 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5064 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5065 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5066 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5067}
5068
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005069TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005070 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005071 ASSERT_NO_FATAL_FAILURE(InitState());
5072
5073 VkImage image;
5074 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5075 VkImageCreateInfo image_create_info = {};
5076 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5077 image_create_info.pNext = NULL;
5078 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5079 image_create_info.format = tex_format;
5080 image_create_info.extent.width = 32;
5081 image_create_info.extent.height = 32;
5082 image_create_info.extent.depth = 1;
5083 image_create_info.mipLevels = 1;
5084 image_create_info.arrayLayers = 1;
5085 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5086 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005087 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005088 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005089 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005090 ASSERT_VK_SUCCESS(err);
5091 // Have to bind memory to image before recording cmd in cmd buffer using it
5092 VkMemoryRequirements mem_reqs;
5093 VkDeviceMemory image_mem;
5094 bool pass;
5095 VkMemoryAllocateInfo mem_alloc = {};
5096 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5097 mem_alloc.pNext = NULL;
5098 mem_alloc.memoryTypeIndex = 0;
5099 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5100 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005101 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005102 ASSERT_TRUE(pass);
5103 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5104 ASSERT_VK_SUCCESS(err);
5105
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005106 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005108 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005109
5110 m_commandBuffer->BeginCommandBuffer();
5111 VkClearColorValue ccv;
5112 ccv.float32[0] = 1.0f;
5113 ccv.float32[1] = 1.0f;
5114 ccv.float32[2] = 1.0f;
5115 ccv.float32[3] = 1.0f;
5116 VkImageSubresourceRange isr = {};
5117 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5118 isr.baseArrayLayer = 0;
5119 isr.baseMipLevel = 0;
5120 isr.layerCount = 1;
5121 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005122 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005123 m_commandBuffer->EndCommandBuffer();
5124
5125 m_errorMonitor->VerifyFound();
5126 vkDestroyImage(m_device->device(), image, NULL);
5127 vkFreeMemory(m_device->device(), image_mem, nullptr);
5128}
5129
5130TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005131 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005132 ASSERT_NO_FATAL_FAILURE(InitState());
5133
5134 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005135 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 -06005136 VK_IMAGE_TILING_OPTIMAL, 0);
5137 ASSERT_TRUE(image.initialized());
5138
5139 VkBuffer buffer;
5140 VkDeviceMemory mem;
5141 VkMemoryRequirements mem_reqs;
5142
5143 VkBufferCreateInfo buf_info = {};
5144 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005145 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005146 buf_info.size = 256;
5147 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5148 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5149 ASSERT_VK_SUCCESS(err);
5150
5151 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5152
5153 VkMemoryAllocateInfo alloc_info = {};
5154 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5155 alloc_info.allocationSize = 256;
5156 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005157 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 -06005158 if (!pass) {
5159 vkDestroyBuffer(m_device->device(), buffer, NULL);
5160 return;
5161 }
5162 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5163 ASSERT_VK_SUCCESS(err);
5164
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005165 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005167 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005168 VkBufferImageCopy region = {};
5169 region.bufferRowLength = 128;
5170 region.bufferImageHeight = 128;
5171 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5172
5173 region.imageSubresource.layerCount = 1;
5174 region.imageExtent.height = 4;
5175 region.imageExtent.width = 4;
5176 region.imageExtent.depth = 1;
5177 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005178 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5179 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005180 m_commandBuffer->EndCommandBuffer();
5181
5182 m_errorMonitor->VerifyFound();
5183
5184 vkDestroyBuffer(m_device->device(), buffer, NULL);
5185 vkFreeMemory(m_device->handle(), mem, NULL);
5186}
5187
Tobin Ehlis85940f52016-07-07 16:57:21 -06005188TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005189 TEST_DESCRIPTION(
5190 "Attempt to draw with a command buffer that is invalid "
5191 "due to an event dependency being destroyed.");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005192 ASSERT_NO_FATAL_FAILURE(InitState());
5193
5194 VkEvent event;
5195 VkEventCreateInfo evci = {};
5196 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5197 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5198 ASSERT_VK_SUCCESS(result);
5199
5200 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005201 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005202 m_commandBuffer->EndCommandBuffer();
5203
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005205 // Destroy event dependency prior to submit to cause ERROR
5206 vkDestroyEvent(m_device->device(), event, NULL);
5207
5208 VkSubmitInfo submit_info = {};
5209 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5210 submit_info.commandBufferCount = 1;
5211 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5212 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5213
5214 m_errorMonitor->VerifyFound();
5215}
5216
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005217TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005218 TEST_DESCRIPTION(
5219 "Attempt to draw with a command buffer that is invalid "
5220 "due to a query pool dependency being destroyed.");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005221 ASSERT_NO_FATAL_FAILURE(InitState());
5222
5223 VkQueryPool query_pool;
5224 VkQueryPoolCreateInfo qpci{};
5225 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5226 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5227 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005228 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005229 ASSERT_VK_SUCCESS(result);
5230
5231 m_commandBuffer->BeginCommandBuffer();
5232 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5233 m_commandBuffer->EndCommandBuffer();
5234
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005236 // Destroy query pool dependency prior to submit to cause ERROR
5237 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5238
5239 VkSubmitInfo submit_info = {};
5240 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5241 submit_info.commandBufferCount = 1;
5242 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5243 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5244
5245 m_errorMonitor->VerifyFound();
5246}
5247
Tobin Ehlis24130d92016-07-08 15:50:53 -06005248TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005249 TEST_DESCRIPTION(
5250 "Attempt to draw with a command buffer that is invalid "
5251 "due to a pipeline dependency being destroyed.");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005252 ASSERT_NO_FATAL_FAILURE(InitState());
5253 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5254
5255 VkResult err;
5256
5257 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5258 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5259
5260 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005261 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005262 ASSERT_VK_SUCCESS(err);
5263
5264 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5265 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5266 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005267 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005268 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005269 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005270 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005271 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005272
5273 VkPipelineShaderStageCreateInfo shaderStages[2];
5274 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5275
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005276 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005277 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 -06005278 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005279 shaderStages[0] = vs.GetStageCreateInfo();
5280 shaderStages[1] = fs.GetStageCreateInfo();
5281
5282 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5283 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5284
5285 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5286 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5287 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5288
5289 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5290 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005291 rs_ci.rasterizerDiscardEnable = true;
5292 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005293
5294 VkPipelineColorBlendAttachmentState att = {};
5295 att.blendEnable = VK_FALSE;
5296 att.colorWriteMask = 0xf;
5297
5298 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5299 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5300 cb_ci.attachmentCount = 1;
5301 cb_ci.pAttachments = &att;
5302
5303 VkGraphicsPipelineCreateInfo gp_ci = {};
5304 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5305 gp_ci.stageCount = 2;
5306 gp_ci.pStages = shaderStages;
5307 gp_ci.pVertexInputState = &vi_ci;
5308 gp_ci.pInputAssemblyState = &ia_ci;
5309 gp_ci.pViewportState = &vp_state_ci;
5310 gp_ci.pRasterizationState = &rs_ci;
5311 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005312 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5313 gp_ci.layout = pipeline_layout;
5314 gp_ci.renderPass = renderPass();
5315
5316 VkPipelineCacheCreateInfo pc_ci = {};
5317 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5318
5319 VkPipeline pipeline;
5320 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005321 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005322 ASSERT_VK_SUCCESS(err);
5323
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005324 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005325 ASSERT_VK_SUCCESS(err);
5326
5327 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005328 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005329 m_commandBuffer->EndCommandBuffer();
5330 // Now destroy pipeline in order to cause error when submitting
5331 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5332
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005334
5335 VkSubmitInfo submit_info = {};
5336 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5337 submit_info.commandBufferCount = 1;
5338 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5339 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5340
5341 m_errorMonitor->VerifyFound();
5342 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5343 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5344}
5345
Tobin Ehlis31289162016-08-17 14:57:58 -06005346TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005347 TEST_DESCRIPTION(
5348 "Attempt to draw with a command buffer that is invalid "
5349 "due to a bound descriptor set with a buffer dependency "
5350 "being destroyed.");
Tobin Ehlis31289162016-08-17 14:57:58 -06005351 ASSERT_NO_FATAL_FAILURE(InitState());
5352 ASSERT_NO_FATAL_FAILURE(InitViewport());
5353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5354
5355 VkDescriptorPoolSize ds_type_count = {};
5356 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5357 ds_type_count.descriptorCount = 1;
5358
5359 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5360 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5361 ds_pool_ci.pNext = NULL;
5362 ds_pool_ci.maxSets = 1;
5363 ds_pool_ci.poolSizeCount = 1;
5364 ds_pool_ci.pPoolSizes = &ds_type_count;
5365
5366 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005367 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005368 ASSERT_VK_SUCCESS(err);
5369
5370 VkDescriptorSetLayoutBinding dsl_binding = {};
5371 dsl_binding.binding = 0;
5372 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5373 dsl_binding.descriptorCount = 1;
5374 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5375 dsl_binding.pImmutableSamplers = NULL;
5376
5377 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5378 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5379 ds_layout_ci.pNext = NULL;
5380 ds_layout_ci.bindingCount = 1;
5381 ds_layout_ci.pBindings = &dsl_binding;
5382 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005383 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005384 ASSERT_VK_SUCCESS(err);
5385
5386 VkDescriptorSet descriptorSet;
5387 VkDescriptorSetAllocateInfo alloc_info = {};
5388 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5389 alloc_info.descriptorSetCount = 1;
5390 alloc_info.descriptorPool = ds_pool;
5391 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005392 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005393 ASSERT_VK_SUCCESS(err);
5394
5395 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5396 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5397 pipeline_layout_ci.pNext = NULL;
5398 pipeline_layout_ci.setLayoutCount = 1;
5399 pipeline_layout_ci.pSetLayouts = &ds_layout;
5400
5401 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005402 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005403 ASSERT_VK_SUCCESS(err);
5404
5405 // Create a buffer to update the descriptor with
5406 uint32_t qfi = 0;
5407 VkBufferCreateInfo buffCI = {};
5408 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5409 buffCI.size = 1024;
5410 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5411 buffCI.queueFamilyIndexCount = 1;
5412 buffCI.pQueueFamilyIndices = &qfi;
5413
5414 VkBuffer buffer;
5415 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5416 ASSERT_VK_SUCCESS(err);
5417 // Allocate memory and bind to buffer so we can make it to the appropriate
5418 // error
5419 VkMemoryAllocateInfo mem_alloc = {};
5420 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5421 mem_alloc.pNext = NULL;
5422 mem_alloc.allocationSize = 1024;
5423 mem_alloc.memoryTypeIndex = 0;
5424
5425 VkMemoryRequirements memReqs;
5426 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005427 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005428 if (!pass) {
5429 vkDestroyBuffer(m_device->device(), buffer, NULL);
5430 return;
5431 }
5432
5433 VkDeviceMemory mem;
5434 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5435 ASSERT_VK_SUCCESS(err);
5436 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5437 ASSERT_VK_SUCCESS(err);
5438 // Correctly update descriptor to avoid "NOT_UPDATED" error
5439 VkDescriptorBufferInfo buffInfo = {};
5440 buffInfo.buffer = buffer;
5441 buffInfo.offset = 0;
5442 buffInfo.range = 1024;
5443
5444 VkWriteDescriptorSet descriptor_write;
5445 memset(&descriptor_write, 0, sizeof(descriptor_write));
5446 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5447 descriptor_write.dstSet = descriptorSet;
5448 descriptor_write.dstBinding = 0;
5449 descriptor_write.descriptorCount = 1;
5450 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5451 descriptor_write.pBufferInfo = &buffInfo;
5452
5453 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5454
5455 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005456 char const *vsSource =
5457 "#version 450\n"
5458 "\n"
5459 "out gl_PerVertex { \n"
5460 " vec4 gl_Position;\n"
5461 "};\n"
5462 "void main(){\n"
5463 " gl_Position = vec4(1);\n"
5464 "}\n";
5465 char const *fsSource =
5466 "#version 450\n"
5467 "\n"
5468 "layout(location=0) out vec4 x;\n"
5469 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5470 "void main(){\n"
5471 " x = vec4(bar.y);\n"
5472 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005473 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5474 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5475 VkPipelineObj pipe(m_device);
5476 pipe.AddShader(&vs);
5477 pipe.AddShader(&fs);
5478 pipe.AddColorAttachment();
5479 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5480
Tony Barbour552f6c02016-12-21 14:34:07 -07005481 m_commandBuffer->BeginCommandBuffer();
5482 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005483 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5484 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5485 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005486
5487 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5488 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5489
Tobin Ehlis31289162016-08-17 14:57:58 -06005490 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005491 m_commandBuffer->EndRenderPass();
5492 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005494 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5495 vkDestroyBuffer(m_device->device(), buffer, NULL);
5496 // Attempt to submit cmd buffer
5497 VkSubmitInfo submit_info = {};
5498 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5499 submit_info.commandBufferCount = 1;
5500 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5501 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5502 m_errorMonitor->VerifyFound();
5503 // Cleanup
5504 vkFreeMemory(m_device->device(), mem, NULL);
5505
5506 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5507 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5508 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5509}
5510
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005511TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005512 TEST_DESCRIPTION(
5513 "Attempt to draw with a command buffer that is invalid "
5514 "due to a bound descriptor sets with a combined image "
5515 "sampler having their image, sampler, and descriptor set "
5516 "each respectively destroyed and then attempting to "
5517 "submit associated cmd buffers. Attempt to destroy a "
5518 "DescriptorSet that is in use.");
Rene Lindsayed88b732017-01-27 15:55:29 -07005519 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005520 ASSERT_NO_FATAL_FAILURE(InitViewport());
5521 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5522
5523 VkDescriptorPoolSize ds_type_count = {};
5524 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5525 ds_type_count.descriptorCount = 1;
5526
5527 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5528 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5529 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005530 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005531 ds_pool_ci.maxSets = 1;
5532 ds_pool_ci.poolSizeCount = 1;
5533 ds_pool_ci.pPoolSizes = &ds_type_count;
5534
5535 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005536 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005537 ASSERT_VK_SUCCESS(err);
5538
5539 VkDescriptorSetLayoutBinding dsl_binding = {};
5540 dsl_binding.binding = 0;
5541 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5542 dsl_binding.descriptorCount = 1;
5543 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5544 dsl_binding.pImmutableSamplers = NULL;
5545
5546 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5547 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5548 ds_layout_ci.pNext = NULL;
5549 ds_layout_ci.bindingCount = 1;
5550 ds_layout_ci.pBindings = &dsl_binding;
5551 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005552 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005553 ASSERT_VK_SUCCESS(err);
5554
5555 VkDescriptorSet descriptorSet;
5556 VkDescriptorSetAllocateInfo alloc_info = {};
5557 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5558 alloc_info.descriptorSetCount = 1;
5559 alloc_info.descriptorPool = ds_pool;
5560 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005561 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005562 ASSERT_VK_SUCCESS(err);
5563
5564 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5565 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5566 pipeline_layout_ci.pNext = NULL;
5567 pipeline_layout_ci.setLayoutCount = 1;
5568 pipeline_layout_ci.pSetLayouts = &ds_layout;
5569
5570 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005571 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005572 ASSERT_VK_SUCCESS(err);
5573
5574 // Create images to update the descriptor with
5575 VkImage image;
5576 VkImage image2;
5577 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5578 const int32_t tex_width = 32;
5579 const int32_t tex_height = 32;
5580 VkImageCreateInfo image_create_info = {};
5581 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5582 image_create_info.pNext = NULL;
5583 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5584 image_create_info.format = tex_format;
5585 image_create_info.extent.width = tex_width;
5586 image_create_info.extent.height = tex_height;
5587 image_create_info.extent.depth = 1;
5588 image_create_info.mipLevels = 1;
5589 image_create_info.arrayLayers = 1;
5590 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5591 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5592 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5593 image_create_info.flags = 0;
5594 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5595 ASSERT_VK_SUCCESS(err);
5596 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5597 ASSERT_VK_SUCCESS(err);
5598
5599 VkMemoryRequirements memory_reqs;
5600 VkDeviceMemory image_memory;
5601 bool pass;
5602 VkMemoryAllocateInfo memory_info = {};
5603 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5604 memory_info.pNext = NULL;
5605 memory_info.allocationSize = 0;
5606 memory_info.memoryTypeIndex = 0;
5607 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5608 // Allocate enough memory for both images
5609 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005610 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005611 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005612 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005613 ASSERT_VK_SUCCESS(err);
5614 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5615 ASSERT_VK_SUCCESS(err);
5616 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005617 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005618 ASSERT_VK_SUCCESS(err);
5619
5620 VkImageViewCreateInfo image_view_create_info = {};
5621 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5622 image_view_create_info.image = image;
5623 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5624 image_view_create_info.format = tex_format;
5625 image_view_create_info.subresourceRange.layerCount = 1;
5626 image_view_create_info.subresourceRange.baseMipLevel = 0;
5627 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005628 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005629
5630 VkImageView view;
5631 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005632 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005633 ASSERT_VK_SUCCESS(err);
5634 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005635 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005636 ASSERT_VK_SUCCESS(err);
5637 // Create Samplers
5638 VkSamplerCreateInfo sampler_ci = {};
5639 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5640 sampler_ci.pNext = NULL;
5641 sampler_ci.magFilter = VK_FILTER_NEAREST;
5642 sampler_ci.minFilter = VK_FILTER_NEAREST;
5643 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5644 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5645 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5646 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5647 sampler_ci.mipLodBias = 1.0;
5648 sampler_ci.anisotropyEnable = VK_FALSE;
5649 sampler_ci.maxAnisotropy = 1;
5650 sampler_ci.compareEnable = VK_FALSE;
5651 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5652 sampler_ci.minLod = 1.0;
5653 sampler_ci.maxLod = 1.0;
5654 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5655 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5656 VkSampler sampler;
5657 VkSampler sampler2;
5658 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5659 ASSERT_VK_SUCCESS(err);
5660 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5661 ASSERT_VK_SUCCESS(err);
5662 // Update descriptor with image and sampler
5663 VkDescriptorImageInfo img_info = {};
5664 img_info.sampler = sampler;
5665 img_info.imageView = view;
5666 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5667
5668 VkWriteDescriptorSet descriptor_write;
5669 memset(&descriptor_write, 0, sizeof(descriptor_write));
5670 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5671 descriptor_write.dstSet = descriptorSet;
5672 descriptor_write.dstBinding = 0;
5673 descriptor_write.descriptorCount = 1;
5674 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5675 descriptor_write.pImageInfo = &img_info;
5676
5677 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5678
5679 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005680 char const *vsSource =
5681 "#version 450\n"
5682 "\n"
5683 "out gl_PerVertex { \n"
5684 " vec4 gl_Position;\n"
5685 "};\n"
5686 "void main(){\n"
5687 " gl_Position = vec4(1);\n"
5688 "}\n";
5689 char const *fsSource =
5690 "#version 450\n"
5691 "\n"
5692 "layout(set=0, binding=0) uniform sampler2D s;\n"
5693 "layout(location=0) out vec4 x;\n"
5694 "void main(){\n"
5695 " x = texture(s, vec2(1));\n"
5696 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005697 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5698 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5699 VkPipelineObj pipe(m_device);
5700 pipe.AddShader(&vs);
5701 pipe.AddShader(&fs);
5702 pipe.AddColorAttachment();
5703 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5704
5705 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted sampler ");
Tony Barbour552f6c02016-12-21 14:34:07 -07005707 m_commandBuffer->BeginCommandBuffer();
5708 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005709 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5710 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5711 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005712 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5713 VkRect2D scissor = {{0, 0}, {16, 16}};
5714 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5715 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005716 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005717 m_commandBuffer->EndRenderPass();
5718 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005719 // Destroy sampler invalidates the cmd buffer, causing error on submit
5720 vkDestroySampler(m_device->device(), sampler, NULL);
5721 // Attempt to submit cmd buffer
5722 VkSubmitInfo submit_info = {};
5723 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5724 submit_info.commandBufferCount = 1;
5725 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5726 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5727 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005728
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005729 // Now re-update descriptor with valid sampler and delete image
5730 img_info.sampler = sampler2;
5731 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005732
5733 VkCommandBufferBeginInfo info = {};
5734 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5735 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5736
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005738 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005739 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005740 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5741 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5742 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005743 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5744 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005745 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005746 m_commandBuffer->EndRenderPass();
5747 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005748 // Destroy image invalidates the cmd buffer, causing error on submit
5749 vkDestroyImage(m_device->device(), image, NULL);
5750 // Attempt to submit cmd buffer
5751 submit_info = {};
5752 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5753 submit_info.commandBufferCount = 1;
5754 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5755 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5756 m_errorMonitor->VerifyFound();
5757 // Now update descriptor to be valid, but then free descriptor
5758 img_info.imageView = view2;
5759 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005760 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005761 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005762 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5763 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5764 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005765 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5766 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005767 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005768 m_commandBuffer->EndRenderPass();
5769 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07005770 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07005771
5772 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005774 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06005775 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07005776
5777 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07005778 // 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 -07005779 vkQueueWaitIdle(m_device->m_queue);
5780 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
5781
5782 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005783 submit_info = {};
5784 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5785 submit_info.commandBufferCount = 1;
5786 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07005787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005788 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5789 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07005790
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005791 // Cleanup
5792 vkFreeMemory(m_device->device(), image_memory, NULL);
5793 vkDestroySampler(m_device->device(), sampler2, NULL);
5794 vkDestroyImage(m_device->device(), image2, NULL);
5795 vkDestroyImageView(m_device->device(), view, NULL);
5796 vkDestroyImageView(m_device->device(), view2, NULL);
5797 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5798 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5799 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5800}
5801
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005802TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
5803 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
5804 ASSERT_NO_FATAL_FAILURE(InitState());
5805 ASSERT_NO_FATAL_FAILURE(InitViewport());
5806 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5807
5808 VkDescriptorPoolSize ds_type_count = {};
5809 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5810 ds_type_count.descriptorCount = 1;
5811
5812 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5813 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5814 ds_pool_ci.pNext = NULL;
5815 ds_pool_ci.maxSets = 1;
5816 ds_pool_ci.poolSizeCount = 1;
5817 ds_pool_ci.pPoolSizes = &ds_type_count;
5818
5819 VkDescriptorPool ds_pool;
5820 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5821 ASSERT_VK_SUCCESS(err);
5822
5823 VkDescriptorSetLayoutBinding dsl_binding = {};
5824 dsl_binding.binding = 0;
5825 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5826 dsl_binding.descriptorCount = 1;
5827 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5828 dsl_binding.pImmutableSamplers = NULL;
5829
5830 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5831 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5832 ds_layout_ci.pNext = NULL;
5833 ds_layout_ci.bindingCount = 1;
5834 ds_layout_ci.pBindings = &dsl_binding;
5835 VkDescriptorSetLayout ds_layout;
5836 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5837 ASSERT_VK_SUCCESS(err);
5838
5839 VkDescriptorSet descriptor_set;
5840 VkDescriptorSetAllocateInfo alloc_info = {};
5841 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5842 alloc_info.descriptorSetCount = 1;
5843 alloc_info.descriptorPool = ds_pool;
5844 alloc_info.pSetLayouts = &ds_layout;
5845 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
5846 ASSERT_VK_SUCCESS(err);
5847
5848 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5849 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5850 pipeline_layout_ci.pNext = NULL;
5851 pipeline_layout_ci.setLayoutCount = 1;
5852 pipeline_layout_ci.pSetLayouts = &ds_layout;
5853
5854 VkPipelineLayout pipeline_layout;
5855 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5856 ASSERT_VK_SUCCESS(err);
5857
5858 // Create image to update the descriptor with
5859 VkImageObj image(m_device);
5860 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5861 ASSERT_TRUE(image.initialized());
5862
5863 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5864 // Create Sampler
5865 VkSamplerCreateInfo sampler_ci = {};
5866 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5867 sampler_ci.pNext = NULL;
5868 sampler_ci.magFilter = VK_FILTER_NEAREST;
5869 sampler_ci.minFilter = VK_FILTER_NEAREST;
5870 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5871 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5872 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5873 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5874 sampler_ci.mipLodBias = 1.0;
5875 sampler_ci.anisotropyEnable = VK_FALSE;
5876 sampler_ci.maxAnisotropy = 1;
5877 sampler_ci.compareEnable = VK_FALSE;
5878 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5879 sampler_ci.minLod = 1.0;
5880 sampler_ci.maxLod = 1.0;
5881 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5882 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5883 VkSampler sampler;
5884 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5885 ASSERT_VK_SUCCESS(err);
5886 // Update descriptor with image and sampler
5887 VkDescriptorImageInfo img_info = {};
5888 img_info.sampler = sampler;
5889 img_info.imageView = view;
5890 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5891
5892 VkWriteDescriptorSet descriptor_write;
5893 memset(&descriptor_write, 0, sizeof(descriptor_write));
5894 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5895 descriptor_write.dstSet = descriptor_set;
5896 descriptor_write.dstBinding = 0;
5897 descriptor_write.descriptorCount = 1;
5898 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5899 descriptor_write.pImageInfo = &img_info;
5900
5901 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5902
5903 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005904 char const *vsSource =
5905 "#version 450\n"
5906 "\n"
5907 "out gl_PerVertex { \n"
5908 " vec4 gl_Position;\n"
5909 "};\n"
5910 "void main(){\n"
5911 " gl_Position = vec4(1);\n"
5912 "}\n";
5913 char const *fsSource =
5914 "#version 450\n"
5915 "\n"
5916 "layout(set=0, binding=0) uniform sampler2D s;\n"
5917 "layout(location=0) out vec4 x;\n"
5918 "void main(){\n"
5919 " x = texture(s, vec2(1));\n"
5920 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005921 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5922 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5923 VkPipelineObj pipe(m_device);
5924 pipe.AddShader(&vs);
5925 pipe.AddShader(&fs);
5926 pipe.AddColorAttachment();
5927 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5928
Tony Barbour552f6c02016-12-21 14:34:07 -07005929 m_commandBuffer->BeginCommandBuffer();
5930 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005931 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5932 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5933 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07005934
5935 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5936 VkRect2D scissor = {{0, 0}, {16, 16}};
5937 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5938 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
5939
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005940 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005941 m_commandBuffer->EndRenderPass();
5942 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005943 // Submit cmd buffer to put pool in-flight
5944 VkSubmitInfo submit_info = {};
5945 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5946 submit_info.commandBufferCount = 1;
5947 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5948 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5949 // Destroy pool while in-flight, causing error
5950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
5951 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5952 m_errorMonitor->VerifyFound();
5953 vkQueueWaitIdle(m_device->m_queue);
5954 // Cleanup
5955 vkDestroySampler(m_device->device(), sampler, NULL);
5956 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5957 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5958 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07005959 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005960}
5961
Tobin Ehlis50a095d2016-09-21 17:32:49 -06005962TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
5963 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
5964 ASSERT_NO_FATAL_FAILURE(InitState());
5965 ASSERT_NO_FATAL_FAILURE(InitViewport());
5966 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5967
5968 VkDescriptorPoolSize ds_type_count = {};
5969 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5970 ds_type_count.descriptorCount = 1;
5971
5972 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5973 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5974 ds_pool_ci.pNext = NULL;
5975 ds_pool_ci.maxSets = 1;
5976 ds_pool_ci.poolSizeCount = 1;
5977 ds_pool_ci.pPoolSizes = &ds_type_count;
5978
5979 VkDescriptorPool ds_pool;
5980 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5981 ASSERT_VK_SUCCESS(err);
5982
5983 VkDescriptorSetLayoutBinding dsl_binding = {};
5984 dsl_binding.binding = 0;
5985 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5986 dsl_binding.descriptorCount = 1;
5987 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5988 dsl_binding.pImmutableSamplers = NULL;
5989
5990 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5991 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5992 ds_layout_ci.pNext = NULL;
5993 ds_layout_ci.bindingCount = 1;
5994 ds_layout_ci.pBindings = &dsl_binding;
5995 VkDescriptorSetLayout ds_layout;
5996 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5997 ASSERT_VK_SUCCESS(err);
5998
5999 VkDescriptorSet descriptorSet;
6000 VkDescriptorSetAllocateInfo alloc_info = {};
6001 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6002 alloc_info.descriptorSetCount = 1;
6003 alloc_info.descriptorPool = ds_pool;
6004 alloc_info.pSetLayouts = &ds_layout;
6005 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6006 ASSERT_VK_SUCCESS(err);
6007
6008 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6009 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6010 pipeline_layout_ci.pNext = NULL;
6011 pipeline_layout_ci.setLayoutCount = 1;
6012 pipeline_layout_ci.pSetLayouts = &ds_layout;
6013
6014 VkPipelineLayout pipeline_layout;
6015 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6016 ASSERT_VK_SUCCESS(err);
6017
6018 // Create images to update the descriptor with
6019 VkImage image;
6020 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6021 const int32_t tex_width = 32;
6022 const int32_t tex_height = 32;
6023 VkImageCreateInfo image_create_info = {};
6024 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6025 image_create_info.pNext = NULL;
6026 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6027 image_create_info.format = tex_format;
6028 image_create_info.extent.width = tex_width;
6029 image_create_info.extent.height = tex_height;
6030 image_create_info.extent.depth = 1;
6031 image_create_info.mipLevels = 1;
6032 image_create_info.arrayLayers = 1;
6033 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6034 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6035 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6036 image_create_info.flags = 0;
6037 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6038 ASSERT_VK_SUCCESS(err);
6039 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6040 VkMemoryRequirements memory_reqs;
6041 VkDeviceMemory image_memory;
6042 bool pass;
6043 VkMemoryAllocateInfo memory_info = {};
6044 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6045 memory_info.pNext = NULL;
6046 memory_info.allocationSize = 0;
6047 memory_info.memoryTypeIndex = 0;
6048 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6049 // Allocate enough memory for image
6050 memory_info.allocationSize = memory_reqs.size;
6051 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6052 ASSERT_TRUE(pass);
6053 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6054 ASSERT_VK_SUCCESS(err);
6055 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6056 ASSERT_VK_SUCCESS(err);
6057
6058 VkImageViewCreateInfo image_view_create_info = {};
6059 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6060 image_view_create_info.image = image;
6061 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6062 image_view_create_info.format = tex_format;
6063 image_view_create_info.subresourceRange.layerCount = 1;
6064 image_view_create_info.subresourceRange.baseMipLevel = 0;
6065 image_view_create_info.subresourceRange.levelCount = 1;
6066 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6067
6068 VkImageView view;
6069 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6070 ASSERT_VK_SUCCESS(err);
6071 // Create Samplers
6072 VkSamplerCreateInfo sampler_ci = {};
6073 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6074 sampler_ci.pNext = NULL;
6075 sampler_ci.magFilter = VK_FILTER_NEAREST;
6076 sampler_ci.minFilter = VK_FILTER_NEAREST;
6077 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6078 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6079 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6080 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6081 sampler_ci.mipLodBias = 1.0;
6082 sampler_ci.anisotropyEnable = VK_FALSE;
6083 sampler_ci.maxAnisotropy = 1;
6084 sampler_ci.compareEnable = VK_FALSE;
6085 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6086 sampler_ci.minLod = 1.0;
6087 sampler_ci.maxLod = 1.0;
6088 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6089 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6090 VkSampler sampler;
6091 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6092 ASSERT_VK_SUCCESS(err);
6093 // Update descriptor with image and sampler
6094 VkDescriptorImageInfo img_info = {};
6095 img_info.sampler = sampler;
6096 img_info.imageView = view;
6097 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6098
6099 VkWriteDescriptorSet descriptor_write;
6100 memset(&descriptor_write, 0, sizeof(descriptor_write));
6101 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6102 descriptor_write.dstSet = descriptorSet;
6103 descriptor_write.dstBinding = 0;
6104 descriptor_write.descriptorCount = 1;
6105 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6106 descriptor_write.pImageInfo = &img_info;
6107 // Break memory binding and attempt update
6108 vkFreeMemory(m_device->device(), image_memory, nullptr);
6109 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006110 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6112 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6113 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6114 m_errorMonitor->VerifyFound();
6115 // Cleanup
6116 vkDestroyImage(m_device->device(), image, NULL);
6117 vkDestroySampler(m_device->device(), sampler, NULL);
6118 vkDestroyImageView(m_device->device(), view, NULL);
6119 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6120 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6121 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6122}
6123
Karl Schultz6addd812016-02-02 17:17:23 -07006124TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006125 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6126 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006127 // Create a valid cmd buffer
6128 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006129 uint64_t fake_pipeline_handle = 0xbaad6001;
6130 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006131 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006132 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6133
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006135 m_commandBuffer->BeginCommandBuffer();
6136 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006137 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006138 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006139
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006140 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006141 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 -06006142 Draw(1, 0, 0, 0);
6143 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006144
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006145 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006146 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 -07006147 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006148 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6149 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006150}
6151
Karl Schultz6addd812016-02-02 17:17:23 -07006152TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006153 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006154 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006155
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006157
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006158 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006159 ASSERT_NO_FATAL_FAILURE(InitViewport());
6160 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006161 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006162 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6163 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006164
6165 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006166 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6167 ds_pool_ci.pNext = NULL;
6168 ds_pool_ci.maxSets = 1;
6169 ds_pool_ci.poolSizeCount = 1;
6170 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006171
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006172 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006173 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006174 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006175
Tony Barboureb254902015-07-15 12:50:33 -06006176 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006177 dsl_binding.binding = 0;
6178 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6179 dsl_binding.descriptorCount = 1;
6180 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6181 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006182
Tony Barboureb254902015-07-15 12:50:33 -06006183 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006184 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6185 ds_layout_ci.pNext = NULL;
6186 ds_layout_ci.bindingCount = 1;
6187 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006188 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006189 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006190 ASSERT_VK_SUCCESS(err);
6191
6192 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006193 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006194 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006195 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006196 alloc_info.descriptorPool = ds_pool;
6197 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006198 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006199 ASSERT_VK_SUCCESS(err);
6200
Tony Barboureb254902015-07-15 12:50:33 -06006201 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006202 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6203 pipeline_layout_ci.pNext = NULL;
6204 pipeline_layout_ci.setLayoutCount = 1;
6205 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006206
6207 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006208 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006209 ASSERT_VK_SUCCESS(err);
6210
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006211 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006212 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006213 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006214 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006215
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006216 VkPipelineObj pipe(m_device);
6217 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006218 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006219 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006220 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006221
Tony Barbour552f6c02016-12-21 14:34:07 -07006222 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006223 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6224 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6225 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006226
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006227 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006228
Chia-I Wuf7458c52015-10-26 21:10:41 +08006229 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6230 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6231 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006232}
6233
Karl Schultz6addd812016-02-02 17:17:23 -07006234TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006235 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006236 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006237
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006239
6240 ASSERT_NO_FATAL_FAILURE(InitState());
6241 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006242 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6243 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006244
6245 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006246 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6247 ds_pool_ci.pNext = NULL;
6248 ds_pool_ci.maxSets = 1;
6249 ds_pool_ci.poolSizeCount = 1;
6250 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006251
6252 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006253 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006254 ASSERT_VK_SUCCESS(err);
6255
6256 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006257 dsl_binding.binding = 0;
6258 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6259 dsl_binding.descriptorCount = 1;
6260 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6261 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006262
6263 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006264 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6265 ds_layout_ci.pNext = NULL;
6266 ds_layout_ci.bindingCount = 1;
6267 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006268 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006269 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006270 ASSERT_VK_SUCCESS(err);
6271
6272 VkDescriptorSet descriptorSet;
6273 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006274 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006275 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006276 alloc_info.descriptorPool = ds_pool;
6277 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006278 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006279 ASSERT_VK_SUCCESS(err);
6280
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006281 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006282 VkWriteDescriptorSet descriptor_write;
6283 memset(&descriptor_write, 0, sizeof(descriptor_write));
6284 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6285 descriptor_write.dstSet = descriptorSet;
6286 descriptor_write.dstBinding = 0;
6287 descriptor_write.descriptorCount = 1;
6288 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6289 descriptor_write.pTexelBufferView = &view;
6290
6291 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6292
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006293 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006294
6295 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6296 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6297}
6298
Mark Youngd339ba32016-05-30 13:28:35 -06006299TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006300 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 -06006301
6302 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006304 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006305
6306 ASSERT_NO_FATAL_FAILURE(InitState());
6307
6308 // Create a buffer with no bound memory and then attempt to create
6309 // a buffer view.
6310 VkBufferCreateInfo buff_ci = {};
6311 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006312 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006313 buff_ci.size = 256;
6314 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6315 VkBuffer buffer;
6316 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6317 ASSERT_VK_SUCCESS(err);
6318
6319 VkBufferViewCreateInfo buff_view_ci = {};
6320 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6321 buff_view_ci.buffer = buffer;
6322 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6323 buff_view_ci.range = VK_WHOLE_SIZE;
6324 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006325 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006326
6327 m_errorMonitor->VerifyFound();
6328 vkDestroyBuffer(m_device->device(), buffer, NULL);
6329 // If last error is success, it still created the view, so delete it.
6330 if (err == VK_SUCCESS) {
6331 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6332 }
6333}
6334
Karl Schultz6addd812016-02-02 17:17:23 -07006335TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6336 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6337 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006338 // 1. No dynamicOffset supplied
6339 // 2. Too many dynamicOffsets supplied
6340 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006341 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6343 " requires 1 dynamicOffsets, but only "
6344 "0 dynamicOffsets are left in "
6345 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006346
6347 ASSERT_NO_FATAL_FAILURE(InitState());
6348 ASSERT_NO_FATAL_FAILURE(InitViewport());
6349 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6350
6351 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006352 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6353 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006354
6355 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006356 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6357 ds_pool_ci.pNext = NULL;
6358 ds_pool_ci.maxSets = 1;
6359 ds_pool_ci.poolSizeCount = 1;
6360 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006361
6362 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006363 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006364 ASSERT_VK_SUCCESS(err);
6365
6366 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006367 dsl_binding.binding = 0;
6368 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6369 dsl_binding.descriptorCount = 1;
6370 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6371 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006372
6373 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006374 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6375 ds_layout_ci.pNext = NULL;
6376 ds_layout_ci.bindingCount = 1;
6377 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006378 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006379 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006380 ASSERT_VK_SUCCESS(err);
6381
6382 VkDescriptorSet descriptorSet;
6383 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006384 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006385 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006386 alloc_info.descriptorPool = ds_pool;
6387 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006388 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006389 ASSERT_VK_SUCCESS(err);
6390
6391 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006392 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6393 pipeline_layout_ci.pNext = NULL;
6394 pipeline_layout_ci.setLayoutCount = 1;
6395 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006396
6397 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006398 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006399 ASSERT_VK_SUCCESS(err);
6400
6401 // Create a buffer to update the descriptor with
6402 uint32_t qfi = 0;
6403 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006404 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6405 buffCI.size = 1024;
6406 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6407 buffCI.queueFamilyIndexCount = 1;
6408 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006409
6410 VkBuffer dyub;
6411 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6412 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006413 // Allocate memory and bind to buffer so we can make it to the appropriate
6414 // error
6415 VkMemoryAllocateInfo mem_alloc = {};
6416 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6417 mem_alloc.pNext = NULL;
6418 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006419 mem_alloc.memoryTypeIndex = 0;
6420
6421 VkMemoryRequirements memReqs;
6422 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006423 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006424 if (!pass) {
6425 vkDestroyBuffer(m_device->device(), dyub, NULL);
6426 return;
6427 }
6428
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006429 VkDeviceMemory mem;
6430 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6431 ASSERT_VK_SUCCESS(err);
6432 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6433 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006434 // Correctly update descriptor to avoid "NOT_UPDATED" error
6435 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006436 buffInfo.buffer = dyub;
6437 buffInfo.offset = 0;
6438 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006439
6440 VkWriteDescriptorSet descriptor_write;
6441 memset(&descriptor_write, 0, sizeof(descriptor_write));
6442 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6443 descriptor_write.dstSet = descriptorSet;
6444 descriptor_write.dstBinding = 0;
6445 descriptor_write.descriptorCount = 1;
6446 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6447 descriptor_write.pBufferInfo = &buffInfo;
6448
6449 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6450
Tony Barbour552f6c02016-12-21 14:34:07 -07006451 m_commandBuffer->BeginCommandBuffer();
6452 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006453 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6454 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006455 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006456 uint32_t pDynOff[2] = {512, 756};
6457 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6459 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6460 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6461 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006462 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006463 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6465 " dynamic offset 512 combined with "
6466 "offset 0 and range 1024 that "
6467 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006468 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006469 char const *vsSource =
6470 "#version 450\n"
6471 "\n"
6472 "out gl_PerVertex { \n"
6473 " vec4 gl_Position;\n"
6474 "};\n"
6475 "void main(){\n"
6476 " gl_Position = vec4(1);\n"
6477 "}\n";
6478 char const *fsSource =
6479 "#version 450\n"
6480 "\n"
6481 "layout(location=0) out vec4 x;\n"
6482 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6483 "void main(){\n"
6484 " x = vec4(bar.y);\n"
6485 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006486 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6487 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6488 VkPipelineObj pipe(m_device);
6489 pipe.AddShader(&vs);
6490 pipe.AddShader(&fs);
6491 pipe.AddColorAttachment();
6492 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6493
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006494 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6495 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6496 VkRect2D scissor = {{0, 0}, {16, 16}};
6497 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6498
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006499 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006500 // This update should succeed, but offset size of 512 will overstep buffer
6501 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006502 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6503 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006504 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006505 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006506
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006507 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006508 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006509
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006510 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006511 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006512 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6513}
6514
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006515TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006516 TEST_DESCRIPTION(
6517 "Attempt to update a descriptor with a non-sparse buffer "
6518 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006519 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006521 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6523 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006524
6525 ASSERT_NO_FATAL_FAILURE(InitState());
6526 ASSERT_NO_FATAL_FAILURE(InitViewport());
6527 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6528
6529 VkDescriptorPoolSize ds_type_count = {};
6530 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6531 ds_type_count.descriptorCount = 1;
6532
6533 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6534 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6535 ds_pool_ci.pNext = NULL;
6536 ds_pool_ci.maxSets = 1;
6537 ds_pool_ci.poolSizeCount = 1;
6538 ds_pool_ci.pPoolSizes = &ds_type_count;
6539
6540 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006541 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006542 ASSERT_VK_SUCCESS(err);
6543
6544 VkDescriptorSetLayoutBinding dsl_binding = {};
6545 dsl_binding.binding = 0;
6546 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6547 dsl_binding.descriptorCount = 1;
6548 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6549 dsl_binding.pImmutableSamplers = NULL;
6550
6551 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6552 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6553 ds_layout_ci.pNext = NULL;
6554 ds_layout_ci.bindingCount = 1;
6555 ds_layout_ci.pBindings = &dsl_binding;
6556 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006557 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006558 ASSERT_VK_SUCCESS(err);
6559
6560 VkDescriptorSet descriptorSet;
6561 VkDescriptorSetAllocateInfo alloc_info = {};
6562 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6563 alloc_info.descriptorSetCount = 1;
6564 alloc_info.descriptorPool = ds_pool;
6565 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006566 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006567 ASSERT_VK_SUCCESS(err);
6568
6569 // Create a buffer to update the descriptor with
6570 uint32_t qfi = 0;
6571 VkBufferCreateInfo buffCI = {};
6572 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6573 buffCI.size = 1024;
6574 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6575 buffCI.queueFamilyIndexCount = 1;
6576 buffCI.pQueueFamilyIndices = &qfi;
6577
6578 VkBuffer dyub;
6579 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6580 ASSERT_VK_SUCCESS(err);
6581
6582 // Attempt to update descriptor without binding memory to it
6583 VkDescriptorBufferInfo buffInfo = {};
6584 buffInfo.buffer = dyub;
6585 buffInfo.offset = 0;
6586 buffInfo.range = 1024;
6587
6588 VkWriteDescriptorSet descriptor_write;
6589 memset(&descriptor_write, 0, sizeof(descriptor_write));
6590 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6591 descriptor_write.dstSet = descriptorSet;
6592 descriptor_write.dstBinding = 0;
6593 descriptor_write.descriptorCount = 1;
6594 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6595 descriptor_write.pBufferInfo = &buffInfo;
6596
6597 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6598 m_errorMonitor->VerifyFound();
6599
6600 vkDestroyBuffer(m_device->device(), dyub, NULL);
6601 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6602 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6603}
6604
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006605TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006606 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006607 ASSERT_NO_FATAL_FAILURE(InitState());
6608 ASSERT_NO_FATAL_FAILURE(InitViewport());
6609 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6610
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006611 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006612 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006613 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6614 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6615 pipeline_layout_ci.pushConstantRangeCount = 1;
6616 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6617
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006618 //
6619 // Check for invalid push constant ranges in pipeline layouts.
6620 //
6621 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006622 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006623 char const *msg;
6624 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006625
Karl Schultzc81037d2016-05-12 08:11:23 -06006626 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6627 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6628 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6629 "vkCreatePipelineLayout() call has push constants index 0 with "
6630 "size 0."},
6631 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6632 "vkCreatePipelineLayout() call has push constants index 0 with "
6633 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006634 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006635 "vkCreatePipelineLayout() call has push constants index 0 with "
6636 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006637 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006638 "vkCreatePipelineLayout() call has push constants index 0 with "
6639 "size 0."},
6640 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6641 "vkCreatePipelineLayout() call has push constants index 0 with "
6642 "offset 1. Offset must"},
6643 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6644 "vkCreatePipelineLayout() call has push constants index 0 "
6645 "with offset "},
6646 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6647 "vkCreatePipelineLayout() call has push constants "
6648 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006649 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006650 "vkCreatePipelineLayout() call has push constants index 0 "
6651 "with offset "},
6652 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6653 "vkCreatePipelineLayout() call has push "
6654 "constants index 0 with offset "},
6655 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6656 "vkCreatePipelineLayout() call has push "
6657 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006658 }};
6659
6660 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006661 for (const auto &iter : range_tests) {
6662 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6664 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006665 m_errorMonitor->VerifyFound();
6666 if (VK_SUCCESS == err) {
6667 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6668 }
6669 }
6670
6671 // Check for invalid stage flag
6672 pc_range.offset = 0;
6673 pc_range.size = 16;
6674 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006675 m_errorMonitor->SetDesiredFailureMsg(
6676 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6677 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006678 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006679 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006680 if (VK_SUCCESS == err) {
6681 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6682 }
6683
6684 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06006685 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006686 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006687 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006688 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006689 };
6690
Karl Schultzc81037d2016-05-12 08:11:23 -06006691 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006692 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6693 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6694 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6695 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6696 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006697 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 1:[0, 4)",
6698 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 2:[0, 4)",
6699 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 3:[0, 4)",
6700 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[0, 4), 4:[0, 4)",
6701 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[0, 4), 2:[0, 4)",
6702 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[0, 4), 3:[0, 4)",
6703 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[0, 4), 4:[0, 4)",
6704 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[0, 4), 3:[0, 4)",
6705 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[0, 4), 4:[0, 4)",
6706 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 3:[0, 4), 4:[0, 4)"}},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006707 {
6708 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6709 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6710 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6711 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6712 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006713 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 3:[12, 20), 4:[16, 20)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006714 },
6715 {
6716 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6717 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6718 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6719 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6720 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006721 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 1:[12, 20)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006722 },
6723 {
6724 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6725 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6726 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6727 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6728 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006729 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 3:[12, 20)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006730 },
6731 {
6732 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6733 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
6734 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
6735 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
6736 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006737 {"vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 2:[4, 100)",
6738 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 1:[32, 36), 2:[4, 100)",
6739 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[4, 100), 3:[40, 48)",
6740 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 2:[4, 100), 4:[52, 56)"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006741 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006742
Karl Schultzc81037d2016-05-12 08:11:23 -06006743 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006744 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006745 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006747 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006748 m_errorMonitor->VerifyFound();
6749 if (VK_SUCCESS == err) {
6750 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6751 }
6752 }
6753
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006754 //
6755 // CmdPushConstants tests
6756 //
Karl Schultzc81037d2016-05-12 08:11:23 -06006757 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006758
6759 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006760 const std::array<PipelineLayoutTestCase, 11> cmd_range_tests = {{
6761 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "vkCmdPushConstants: parameter size must be greater than 0"},
Karl Schultzc81037d2016-05-12 08:11:23 -06006762 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
Dave Houlton197211a2016-12-23 15:26:29 -07006763 "vkCmdPushConstants() call has push constants index 0 with size 1. "
6764 "Size must be a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006765 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Dave Houlton197211a2016-12-23 15:26:29 -07006766 "vkCmdPushConstants() call has push constants index 0 with size 1. "
6767 "Size must be a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006768 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006769 "vkCmdPushConstants() call has push constants with offset 1. "
6770 "Offset must be a multiple of 4."},
6771 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6772 "vkCmdPushConstants() call has push constants with offset 1. "
6773 "Offset must be a multiple of 4."},
6774 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6775 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6776 "0x1 not within flag-matching ranges in pipeline layout"},
6777 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
6778 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
6779 "0x1 not within flag-matching ranges in pipeline layout"},
6780 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
6781 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
6782 "0x1 not within flag-matching ranges in pipeline layout"},
6783 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
6784 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
6785 "0x1 not within flag-matching ranges in pipeline layout"},
6786 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6787 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
6788 "any of the ranges in pipeline layout"},
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006789 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06006790 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
6791 "any of the ranges in pipeline layout"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006792 }};
6793
Tony Barbour552f6c02016-12-21 14:34:07 -07006794 m_commandBuffer->BeginCommandBuffer();
6795 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006796
6797 // Setup ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006798 const VkPushConstantRange pc_range2[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006799 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006800 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006801 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006802 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006803 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006804 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006805 for (const auto &iter : cmd_range_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6807 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006808 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006809 m_errorMonitor->VerifyFound();
6810 }
6811
6812 // Check for invalid stage flag
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006814 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006815 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06006816 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006817
Karl Schultzc81037d2016-05-12 08:11:23 -06006818 // overlapping range tests with cmd
6819 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
6820 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6821 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6822 "0x1 not within flag-matching ranges in pipeline layout"},
6823 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6824 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
6825 "0x1 not within flag-matching ranges in pipeline layout"},
6826 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
6827 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
6828 "0x1 not within flag-matching ranges in pipeline layout"},
6829 }};
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006830 // Setup ranges: [0,16), [20,36), [36,44), [44,52), [80,92)
Karl Schultzc81037d2016-05-12 08:11:23 -06006831 const VkPushConstantRange pc_range3[] = {
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006832 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
6833 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12}, {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
Karl Schultzc81037d2016-05-12 08:11:23 -06006834 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006835 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range3) / sizeof(VkPushConstantRange);
Karl Schultzc81037d2016-05-12 08:11:23 -06006836 pipeline_layout_ci.pPushConstantRanges = pc_range3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006837 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzc81037d2016-05-12 08:11:23 -06006838 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006839 for (const auto &iter : cmd_overlap_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6841 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006842 iter.range.size, dummy_values);
6843 m_errorMonitor->VerifyFound();
6844 }
Karl Schultzc81037d2016-05-12 08:11:23 -06006845 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6846
Tony Barbour552f6c02016-12-21 14:34:07 -07006847 m_commandBuffer->EndRenderPass();
6848 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006849}
6850
Karl Schultz6addd812016-02-02 17:17:23 -07006851TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07006852 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07006853 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006854
6855 ASSERT_NO_FATAL_FAILURE(InitState());
6856 ASSERT_NO_FATAL_FAILURE(InitViewport());
6857 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6858
6859 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
6860 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006861 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6862 ds_type_count[0].descriptorCount = 10;
6863 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6864 ds_type_count[1].descriptorCount = 2;
6865 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6866 ds_type_count[2].descriptorCount = 2;
6867 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6868 ds_type_count[3].descriptorCount = 5;
6869 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
6870 // type
6871 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6872 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
6873 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006874
6875 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006876 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6877 ds_pool_ci.pNext = NULL;
6878 ds_pool_ci.maxSets = 5;
6879 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
6880 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006881
6882 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006883 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006884 ASSERT_VK_SUCCESS(err);
6885
6886 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
6887 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006888 dsl_binding[0].binding = 0;
6889 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6890 dsl_binding[0].descriptorCount = 5;
6891 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6892 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006893
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006894 // Create layout identical to set0 layout but w/ different stageFlags
6895 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006896 dsl_fs_stage_only.binding = 0;
6897 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6898 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006899 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
6900 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07006901 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006902 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006903 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6904 ds_layout_ci.pNext = NULL;
6905 ds_layout_ci.bindingCount = 1;
6906 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006907 static const uint32_t NUM_LAYOUTS = 4;
6908 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006909 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006910 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
6911 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006912 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006913 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006914 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006915 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006916 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006917 dsl_binding[0].binding = 0;
6918 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006919 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006920 dsl_binding[1].binding = 1;
6921 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6922 dsl_binding[1].descriptorCount = 2;
6923 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6924 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006925 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006926 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006927 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006928 ASSERT_VK_SUCCESS(err);
6929 dsl_binding[0].binding = 0;
6930 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006931 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006932 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006933 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006934 ASSERT_VK_SUCCESS(err);
6935 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006936 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006937 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006938 ASSERT_VK_SUCCESS(err);
6939
6940 static const uint32_t NUM_SETS = 4;
6941 VkDescriptorSet descriptorSet[NUM_SETS] = {};
6942 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006943 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006944 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006945 alloc_info.descriptorPool = ds_pool;
6946 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006947 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006948 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006949 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006950 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006951 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006952 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006953 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006954
6955 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006956 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6957 pipeline_layout_ci.pNext = NULL;
6958 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
6959 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006960
6961 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006962 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006963 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006964 // Create pipelineLayout with only one setLayout
6965 pipeline_layout_ci.setLayoutCount = 1;
6966 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006967 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006968 ASSERT_VK_SUCCESS(err);
6969 // Create pipelineLayout with 2 descriptor setLayout at index 0
6970 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
6971 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006972 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006973 ASSERT_VK_SUCCESS(err);
6974 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
6975 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
6976 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006977 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006978 ASSERT_VK_SUCCESS(err);
6979 // Create pipelineLayout with UB type, but stageFlags for FS only
6980 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
6981 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006982 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006983 ASSERT_VK_SUCCESS(err);
6984 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
6985 VkDescriptorSetLayout pl_bad_s0[2] = {};
6986 pl_bad_s0[0] = ds_layout_fs_only;
6987 pl_bad_s0[1] = ds_layout[1];
6988 pipeline_layout_ci.setLayoutCount = 2;
6989 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
6990 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006991 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006992 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006993
Tobin Ehlis88452832015-12-03 09:40:56 -07006994 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006995 char const *vsSource =
6996 "#version 450\n"
6997 "\n"
6998 "out gl_PerVertex {\n"
6999 " vec4 gl_Position;\n"
7000 "};\n"
7001 "void main(){\n"
7002 " gl_Position = vec4(1);\n"
7003 "}\n";
7004 char const *fsSource =
7005 "#version 450\n"
7006 "\n"
7007 "layout(location=0) out vec4 x;\n"
7008 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7009 "void main(){\n"
7010 " x = vec4(bar.y);\n"
7011 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007012 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7013 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007014 VkPipelineObj pipe(m_device);
7015 pipe.AddShader(&vs);
7016 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007017 pipe.AddColorAttachment();
7018 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007019
Tony Barbour552f6c02016-12-21 14:34:07 -07007020 m_commandBuffer->BeginCommandBuffer();
7021 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007022
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007023 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007024 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7025 // of PSO
7026 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7027 // cmd_pipeline.c
7028 // due to the fact that cmd_alloc_dset_data() has not been called in
7029 // cmd_bind_graphics_pipeline()
7030 // TODO : Want to cause various binding incompatibility issues here to test
7031 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007032 // First cause various verify_layout_compatibility() fails
7033 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007034 // verify_set_layout_compatibility fail cases:
7035 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007037 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7038 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007039 m_errorMonitor->VerifyFound();
7040
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007041 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7043 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7044 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007045 m_errorMonitor->VerifyFound();
7046
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007047 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007048 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7049 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7051 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7052 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007053 m_errorMonitor->VerifyFound();
7054
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007055 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7056 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7058 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7059 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007060 m_errorMonitor->VerifyFound();
7061
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007062 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7063 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7065 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7066 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7067 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007068 m_errorMonitor->VerifyFound();
7069
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007070 // Cause INFO messages due to disturbing previously bound Sets
7071 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007072 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7073 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007074 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7076 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7077 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007078 m_errorMonitor->VerifyFound();
7079
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007080 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7081 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007082 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7084 " newly bound as set #0 so set #1 and "
7085 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007086 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7087 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007088 m_errorMonitor->VerifyFound();
7089
Tobin Ehlis10fad692016-07-07 12:00:36 -06007090 // Now that we're done actively using the pipelineLayout that gfx pipeline
7091 // was created with, we should be able to delete it. Do that now to verify
7092 // that validation obeys pipelineLayout lifetime
7093 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7094
Tobin Ehlis88452832015-12-03 09:40:56 -07007095 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007096 // 1. Error due to not binding required set (we actually use same code as
7097 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007098 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7099 &descriptorSet[0], 0, NULL);
7100 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7101 &descriptorSet[1], 0, NULL);
7102 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 -07007103
7104 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7105 VkRect2D scissor = {{0, 0}, {16, 16}};
7106 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7107 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7108
Tobin Ehlis88452832015-12-03 09:40:56 -07007109 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007110 m_errorMonitor->VerifyFound();
7111
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007112 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007113 // 2. Error due to bound set not being compatible with PSO's
7114 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007115 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7116 &descriptorSet[0], 0, NULL);
7117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007118 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007119 m_errorMonitor->VerifyFound();
7120
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007121 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007122 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007123 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7124 }
7125 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007126 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7127 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7128}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007129
Karl Schultz6addd812016-02-02 17:17:23 -07007130TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7132 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007133
7134 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007135 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007136 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007137 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007138
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007139 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007140}
7141
Karl Schultz6addd812016-02-02 17:17:23 -07007142TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7143 VkResult err;
7144 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007145
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007147
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007148 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007149
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007150 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007151 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007152 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007153 cmd.commandPool = m_commandPool;
7154 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007155 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007156
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007157 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007158 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007159
7160 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007161 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007162 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7163
7164 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007165 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007166 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007167 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 -07007168 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007169
7170 // The error should be caught by validation of the BeginCommandBuffer call
7171 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7172
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007173 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007174 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007175}
7176
Karl Schultz6addd812016-02-02 17:17:23 -07007177TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007178 // Cause error due to Begin while recording CB
7179 // Then cause 2 errors for attempting to reset CB w/o having
7180 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7181 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007182 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007183
7184 ASSERT_NO_FATAL_FAILURE(InitState());
7185
7186 // Calls AllocateCommandBuffers
7187 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7188
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007189 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007190 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007191 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7192 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007193 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7194 cmd_buf_info.pNext = NULL;
7195 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007196 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007197
7198 // Begin CB to transition to recording state
7199 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7200 // Can't re-begin. This should trigger error
7201 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007202 m_errorMonitor->VerifyFound();
7203
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007205 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007206 // Reset attempt will trigger error due to incorrect CommandPool state
7207 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007208 m_errorMonitor->VerifyFound();
7209
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007211 // Transition CB to RECORDED state
7212 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7213 // Now attempting to Begin will implicitly reset, which triggers error
7214 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007215 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007216}
7217
Karl Schultz6addd812016-02-02 17:17:23 -07007218TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007219 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007220 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007221
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7223 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007224
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007225 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007226 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007227
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007228 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007229 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7230 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007231
7232 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007233 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7234 ds_pool_ci.pNext = NULL;
7235 ds_pool_ci.maxSets = 1;
7236 ds_pool_ci.poolSizeCount = 1;
7237 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007238
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007239 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007240 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007241 ASSERT_VK_SUCCESS(err);
7242
Tony Barboureb254902015-07-15 12:50:33 -06007243 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007244 dsl_binding.binding = 0;
7245 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7246 dsl_binding.descriptorCount = 1;
7247 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7248 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007249
Tony Barboureb254902015-07-15 12:50:33 -06007250 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007251 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7252 ds_layout_ci.pNext = NULL;
7253 ds_layout_ci.bindingCount = 1;
7254 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007255
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007256 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007257 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007258 ASSERT_VK_SUCCESS(err);
7259
7260 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007261 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007262 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007263 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007264 alloc_info.descriptorPool = ds_pool;
7265 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007266 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007267 ASSERT_VK_SUCCESS(err);
7268
Tony Barboureb254902015-07-15 12:50:33 -06007269 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007270 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7271 pipeline_layout_ci.setLayoutCount = 1;
7272 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007273
7274 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007275 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007276 ASSERT_VK_SUCCESS(err);
7277
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007278 VkViewport vp = {}; // Just need dummy vp to point to
7279 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007280
7281 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007282 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7283 vp_state_ci.scissorCount = 1;
7284 vp_state_ci.pScissors = &sc;
7285 vp_state_ci.viewportCount = 1;
7286 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007287
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007288 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7289 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7290 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7291 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7292 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7293 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007294 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007295 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007296 rs_state_ci.lineWidth = 1.0f;
7297
7298 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7299 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7300 vi_ci.pNext = nullptr;
7301 vi_ci.vertexBindingDescriptionCount = 0;
7302 vi_ci.pVertexBindingDescriptions = nullptr;
7303 vi_ci.vertexAttributeDescriptionCount = 0;
7304 vi_ci.pVertexAttributeDescriptions = nullptr;
7305
7306 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7307 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7308 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7309
7310 VkPipelineShaderStageCreateInfo shaderStages[2];
7311 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7312
7313 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7314 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7315 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
7316 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007317
Tony Barboureb254902015-07-15 12:50:33 -06007318 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007319 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7320 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007321 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007322 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7323 gp_ci.layout = pipeline_layout;
7324 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007325 gp_ci.pVertexInputState = &vi_ci;
7326 gp_ci.pInputAssemblyState = &ia_ci;
7327
7328 gp_ci.stageCount = 1;
7329 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007330
7331 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007332 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7333 pc_ci.initialDataSize = 0;
7334 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007335
7336 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007337 VkPipelineCache pipelineCache;
7338
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007339 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007340 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007341 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007342 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007343
Chia-I Wuf7458c52015-10-26 21:10:41 +08007344 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7345 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7346 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7347 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007348}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007349
Tobin Ehlis912df022015-09-17 08:46:18 -06007350/*// TODO : This test should be good, but needs Tess support in compiler to run
7351TEST_F(VkLayerTest, InvalidPatchControlPoints)
7352{
7353 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007354 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007355
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007357 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7358primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007359
Tobin Ehlis912df022015-09-17 08:46:18 -06007360 ASSERT_NO_FATAL_FAILURE(InitState());
7361 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007362
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007363 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007364 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007365 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007366
7367 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7368 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7369 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007370 ds_pool_ci.poolSizeCount = 1;
7371 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007372
7373 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007374 err = vkCreateDescriptorPool(m_device->device(),
7375VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007376 ASSERT_VK_SUCCESS(err);
7377
7378 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007379 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007380 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007381 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007382 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7383 dsl_binding.pImmutableSamplers = NULL;
7384
7385 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007386 ds_layout_ci.sType =
7387VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007388 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007389 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007390 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007391
7392 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007393 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7394&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007395 ASSERT_VK_SUCCESS(err);
7396
7397 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007398 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7399VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007400 ASSERT_VK_SUCCESS(err);
7401
7402 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007403 pipeline_layout_ci.sType =
7404VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007405 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007406 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007407 pipeline_layout_ci.pSetLayouts = &ds_layout;
7408
7409 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007410 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7411&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007412 ASSERT_VK_SUCCESS(err);
7413
7414 VkPipelineShaderStageCreateInfo shaderStages[3];
7415 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7416
Karl Schultz6addd812016-02-02 17:17:23 -07007417 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7418this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007419 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007420 VkShaderObj
7421tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7422this);
7423 VkShaderObj
7424te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7425this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007426
Karl Schultz6addd812016-02-02 17:17:23 -07007427 shaderStages[0].sType =
7428VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007429 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007430 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007431 shaderStages[1].sType =
7432VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007433 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007434 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007435 shaderStages[2].sType =
7436VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007437 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007438 shaderStages[2].shader = te.handle();
7439
7440 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007441 iaCI.sType =
7442VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007443 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007444
7445 VkPipelineTessellationStateCreateInfo tsCI = {};
7446 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7447 tsCI.patchControlPoints = 0; // This will cause an error
7448
7449 VkGraphicsPipelineCreateInfo gp_ci = {};
7450 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7451 gp_ci.pNext = NULL;
7452 gp_ci.stageCount = 3;
7453 gp_ci.pStages = shaderStages;
7454 gp_ci.pVertexInputState = NULL;
7455 gp_ci.pInputAssemblyState = &iaCI;
7456 gp_ci.pTessellationState = &tsCI;
7457 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007458 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007459 gp_ci.pMultisampleState = NULL;
7460 gp_ci.pDepthStencilState = NULL;
7461 gp_ci.pColorBlendState = NULL;
7462 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7463 gp_ci.layout = pipeline_layout;
7464 gp_ci.renderPass = renderPass();
7465
7466 VkPipelineCacheCreateInfo pc_ci = {};
7467 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7468 pc_ci.pNext = NULL;
7469 pc_ci.initialSize = 0;
7470 pc_ci.initialData = 0;
7471 pc_ci.maxSize = 0;
7472
7473 VkPipeline pipeline;
7474 VkPipelineCache pipelineCache;
7475
Karl Schultz6addd812016-02-02 17:17:23 -07007476 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7477&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007478 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007479 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7480&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007481
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007482 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007483
Chia-I Wuf7458c52015-10-26 21:10:41 +08007484 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7485 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7486 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7487 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007488}
7489*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007490
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007491TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007492 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007493
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007494 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007495
Tobin Ehlise68360f2015-10-01 11:15:13 -06007496 ASSERT_NO_FATAL_FAILURE(InitState());
7497 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007498
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007499 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007500 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7501 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007502
7503 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007504 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7505 ds_pool_ci.maxSets = 1;
7506 ds_pool_ci.poolSizeCount = 1;
7507 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007508
7509 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007510 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007511 ASSERT_VK_SUCCESS(err);
7512
7513 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007514 dsl_binding.binding = 0;
7515 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7516 dsl_binding.descriptorCount = 1;
7517 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007518
7519 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007520 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7521 ds_layout_ci.bindingCount = 1;
7522 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007523
7524 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007525 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007526 ASSERT_VK_SUCCESS(err);
7527
7528 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007529 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007530 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007531 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007532 alloc_info.descriptorPool = ds_pool;
7533 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007534 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007535 ASSERT_VK_SUCCESS(err);
7536
7537 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007538 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7539 pipeline_layout_ci.setLayoutCount = 1;
7540 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007541
7542 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007543 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007544 ASSERT_VK_SUCCESS(err);
7545
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007546 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007547 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007548 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007549 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007550 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007551 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007552
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007553 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7554 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7555 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7556 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7557 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7558 rs_state_ci.depthClampEnable = VK_FALSE;
7559 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7560 rs_state_ci.depthBiasEnable = VK_FALSE;
7561
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007562 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7563 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7564 vi_ci.pNext = nullptr;
7565 vi_ci.vertexBindingDescriptionCount = 0;
7566 vi_ci.pVertexBindingDescriptions = nullptr;
7567 vi_ci.vertexAttributeDescriptionCount = 0;
7568 vi_ci.pVertexAttributeDescriptions = nullptr;
7569
7570 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7571 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7572 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7573
7574 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7575 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7576 pipe_ms_state_ci.pNext = NULL;
7577 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7578 pipe_ms_state_ci.sampleShadingEnable = 0;
7579 pipe_ms_state_ci.minSampleShading = 1.0;
7580 pipe_ms_state_ci.pSampleMask = NULL;
7581
Cody Northropeb3a6c12015-10-05 14:44:45 -06007582 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007583 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007584
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007585 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007586 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007587 shaderStages[0] = vs.GetStageCreateInfo();
7588 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007589
7590 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007591 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7592 gp_ci.stageCount = 2;
7593 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007594 gp_ci.pVertexInputState = &vi_ci;
7595 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007596 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007597 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007598 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007599 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7600 gp_ci.layout = pipeline_layout;
7601 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007602
7603 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007604 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007605
7606 VkPipeline pipeline;
7607 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007608 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007609 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007610
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007611 if (!m_device->phy().features().multiViewport) {
7612 printf("MultiViewport feature is disabled -- skipping enabled-state checks.\n");
7613
7614 // Check case where multiViewport is disabled and viewport count is not 1
7615 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7618 vp_state_ci.scissorCount = 0;
7619 vp_state_ci.viewportCount = 0;
7620 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7621 m_errorMonitor->VerifyFound();
7622 } else {
7623 if (m_device->props.limits.maxViewports == 1) {
7624 printf("Device limit maxViewports is 1, skipping tests that require higher limits.\n");
7625 } else {
7626 printf("MultiViewport feature is enabled -- skipping disabled-state checks.\n");
7627
7628 // Check is that viewportcount and scissorcount match
7629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7630 vp_state_ci.scissorCount = 1;
7631 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7632 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7633 m_errorMonitor->VerifyFound();
7634
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007635 // Check case where multiViewport is enabled and viewport count is greater than max
7636 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7639 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7640 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7641 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7642 m_errorMonitor->VerifyFound();
7643 }
7644 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007645
Chia-I Wuf7458c52015-10-26 21:10:41 +08007646 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7647 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7648 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7649 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007650}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007651
7652// 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
7653// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007654TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007655 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007656
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007657 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7658
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007660
Tobin Ehlise68360f2015-10-01 11:15:13 -06007661 ASSERT_NO_FATAL_FAILURE(InitState());
7662 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007663
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007664 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007665 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7666 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007667
7668 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007669 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7670 ds_pool_ci.maxSets = 1;
7671 ds_pool_ci.poolSizeCount = 1;
7672 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007673
7674 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007675 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007676 ASSERT_VK_SUCCESS(err);
7677
7678 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007679 dsl_binding.binding = 0;
7680 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7681 dsl_binding.descriptorCount = 1;
7682 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007683
7684 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007685 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7686 ds_layout_ci.bindingCount = 1;
7687 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007688
7689 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007690 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007691 ASSERT_VK_SUCCESS(err);
7692
7693 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007694 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007695 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007696 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007697 alloc_info.descriptorPool = ds_pool;
7698 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007699 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007700 ASSERT_VK_SUCCESS(err);
7701
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007702 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7703 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7704 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7705
7706 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7707 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7708 vi_ci.pNext = nullptr;
7709 vi_ci.vertexBindingDescriptionCount = 0;
7710 vi_ci.pVertexBindingDescriptions = nullptr;
7711 vi_ci.vertexAttributeDescriptionCount = 0;
7712 vi_ci.pVertexAttributeDescriptions = nullptr;
7713
7714 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7715 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7716 pipe_ms_state_ci.pNext = NULL;
7717 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7718 pipe_ms_state_ci.sampleShadingEnable = 0;
7719 pipe_ms_state_ci.minSampleShading = 1.0;
7720 pipe_ms_state_ci.pSampleMask = NULL;
7721
Tobin Ehlise68360f2015-10-01 11:15:13 -06007722 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007723 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7724 pipeline_layout_ci.setLayoutCount = 1;
7725 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007726
7727 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007728 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007729 ASSERT_VK_SUCCESS(err);
7730
7731 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7732 // Set scissor as dynamic to avoid second error
7733 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007734 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7735 dyn_state_ci.dynamicStateCount = 1;
7736 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007737
Cody Northropeb3a6c12015-10-05 14:44:45 -06007738 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007739 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007740
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007741 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007742 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7743 // 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 +08007744 shaderStages[0] = vs.GetStageCreateInfo();
7745 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007746
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007747 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7748 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7749 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7750 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7751 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7752 rs_state_ci.depthClampEnable = VK_FALSE;
7753 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7754 rs_state_ci.depthBiasEnable = VK_FALSE;
7755
Tobin Ehlise68360f2015-10-01 11:15:13 -06007756 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007757 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7758 gp_ci.stageCount = 2;
7759 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007760 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007761 // Not setting VP state w/o dynamic vp state should cause validation error
7762 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007763 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007764 gp_ci.pVertexInputState = &vi_ci;
7765 gp_ci.pInputAssemblyState = &ia_ci;
7766 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007767 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7768 gp_ci.layout = pipeline_layout;
7769 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007770
7771 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007772 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007773
7774 VkPipeline pipeline;
7775 VkPipelineCache pipelineCache;
7776
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007777 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007778 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007779 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007780
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007781 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007782
Chia-I Wuf7458c52015-10-26 21:10:41 +08007783 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7784 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7785 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7786 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007787}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007788
7789// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7790// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007791TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7792 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007793
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007795
Tobin Ehlise68360f2015-10-01 11:15:13 -06007796 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007797
7798 if (!m_device->phy().features().multiViewport) {
7799 printf("Device does not support multiple viewports/scissors; skipped.\n");
7800 return;
7801 }
7802
Tobin Ehlise68360f2015-10-01 11:15:13 -06007803 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007804
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007805 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007806 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7807 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007808
7809 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007810 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7811 ds_pool_ci.maxSets = 1;
7812 ds_pool_ci.poolSizeCount = 1;
7813 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007814
7815 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007816 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007817 ASSERT_VK_SUCCESS(err);
7818
7819 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007820 dsl_binding.binding = 0;
7821 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7822 dsl_binding.descriptorCount = 1;
7823 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007824
7825 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007826 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7827 ds_layout_ci.bindingCount = 1;
7828 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007829
7830 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007831 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007832 ASSERT_VK_SUCCESS(err);
7833
7834 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007835 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007836 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007837 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007838 alloc_info.descriptorPool = ds_pool;
7839 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007840 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007841 ASSERT_VK_SUCCESS(err);
7842
7843 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007844 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7845 pipeline_layout_ci.setLayoutCount = 1;
7846 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007847
7848 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007849 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007850 ASSERT_VK_SUCCESS(err);
7851
7852 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007853 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7854 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007855 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007856 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007857 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06007858
7859 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7860 // Set scissor as dynamic to avoid that error
7861 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007862 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7863 dyn_state_ci.dynamicStateCount = 1;
7864 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007865
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007866 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7867 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7868 pipe_ms_state_ci.pNext = NULL;
7869 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7870 pipe_ms_state_ci.sampleShadingEnable = 0;
7871 pipe_ms_state_ci.minSampleShading = 1.0;
7872 pipe_ms_state_ci.pSampleMask = NULL;
7873
Cody Northropeb3a6c12015-10-05 14:44:45 -06007874 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007875 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007876
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007877 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007878 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7879 // 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 +08007880 shaderStages[0] = vs.GetStageCreateInfo();
7881 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007882
Cody Northropf6622dc2015-10-06 10:33:21 -06007883 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7884 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7885 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007886 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007887 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007888 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007889 vi_ci.pVertexAttributeDescriptions = nullptr;
7890
7891 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7892 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7893 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7894
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007895 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007896 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007897 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06007898 rs_ci.pNext = nullptr;
7899
Mark Youngc89c6312016-03-31 16:03:20 -06007900 VkPipelineColorBlendAttachmentState att = {};
7901 att.blendEnable = VK_FALSE;
7902 att.colorWriteMask = 0xf;
7903
Cody Northropf6622dc2015-10-06 10:33:21 -06007904 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7905 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7906 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007907 cb_ci.attachmentCount = 1;
7908 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06007909
Tobin Ehlise68360f2015-10-01 11:15:13 -06007910 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007911 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7912 gp_ci.stageCount = 2;
7913 gp_ci.pStages = shaderStages;
7914 gp_ci.pVertexInputState = &vi_ci;
7915 gp_ci.pInputAssemblyState = &ia_ci;
7916 gp_ci.pViewportState = &vp_state_ci;
7917 gp_ci.pRasterizationState = &rs_ci;
7918 gp_ci.pColorBlendState = &cb_ci;
7919 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007920 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007921 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7922 gp_ci.layout = pipeline_layout;
7923 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007924
7925 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007926 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007927
7928 VkPipeline pipeline;
7929 VkPipelineCache pipelineCache;
7930
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007931 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007932 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007933 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007934
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007935 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007936
Tobin Ehlisd332f282015-10-02 11:00:56 -06007937 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07007938 // First need to successfully create the PSO from above by setting
7939 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06007940 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 -07007941
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007942 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07007943 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007944 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007945 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07007946 m_commandBuffer->BeginCommandBuffer();
7947 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007948 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007949 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07007950 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007951 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07007952 Draw(1, 0, 0, 0);
7953
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007954 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007955
7956 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7957 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7958 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7959 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007960 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007961}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007962
7963// 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 -07007964// viewportCount
7965TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
7966 VkResult err;
7967
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07007969
7970 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007971
7972 if (!m_device->phy().features().multiViewport) {
7973 printf("Device does not support multiple viewports/scissors; skipped.\n");
7974 return;
7975 }
7976
Karl Schultz6addd812016-02-02 17:17:23 -07007977 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7978
7979 VkDescriptorPoolSize ds_type_count = {};
7980 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7981 ds_type_count.descriptorCount = 1;
7982
7983 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7984 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7985 ds_pool_ci.maxSets = 1;
7986 ds_pool_ci.poolSizeCount = 1;
7987 ds_pool_ci.pPoolSizes = &ds_type_count;
7988
7989 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007990 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07007991 ASSERT_VK_SUCCESS(err);
7992
7993 VkDescriptorSetLayoutBinding dsl_binding = {};
7994 dsl_binding.binding = 0;
7995 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7996 dsl_binding.descriptorCount = 1;
7997 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7998
7999 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8000 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8001 ds_layout_ci.bindingCount = 1;
8002 ds_layout_ci.pBindings = &dsl_binding;
8003
8004 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008005 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008006 ASSERT_VK_SUCCESS(err);
8007
8008 VkDescriptorSet descriptorSet;
8009 VkDescriptorSetAllocateInfo alloc_info = {};
8010 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8011 alloc_info.descriptorSetCount = 1;
8012 alloc_info.descriptorPool = ds_pool;
8013 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008014 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008015 ASSERT_VK_SUCCESS(err);
8016
8017 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8018 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8019 pipeline_layout_ci.setLayoutCount = 1;
8020 pipeline_layout_ci.pSetLayouts = &ds_layout;
8021
8022 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008023 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008024 ASSERT_VK_SUCCESS(err);
8025
8026 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8027 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8028 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008029 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008030 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008031 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008032
8033 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8034 // Set scissor as dynamic to avoid that error
8035 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8036 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8037 dyn_state_ci.dynamicStateCount = 1;
8038 dyn_state_ci.pDynamicStates = &vp_state;
8039
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008040 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8041 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8042 pipe_ms_state_ci.pNext = NULL;
8043 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8044 pipe_ms_state_ci.sampleShadingEnable = 0;
8045 pipe_ms_state_ci.minSampleShading = 1.0;
8046 pipe_ms_state_ci.pSampleMask = NULL;
8047
Karl Schultz6addd812016-02-02 17:17:23 -07008048 VkPipelineShaderStageCreateInfo shaderStages[2];
8049 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8050
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008051 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008052 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8053 // 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 -07008054 shaderStages[0] = vs.GetStageCreateInfo();
8055 shaderStages[1] = fs.GetStageCreateInfo();
8056
8057 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8058 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8059 vi_ci.pNext = nullptr;
8060 vi_ci.vertexBindingDescriptionCount = 0;
8061 vi_ci.pVertexBindingDescriptions = nullptr;
8062 vi_ci.vertexAttributeDescriptionCount = 0;
8063 vi_ci.pVertexAttributeDescriptions = nullptr;
8064
8065 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8066 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8067 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8068
8069 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8070 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008071 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008072 rs_ci.pNext = nullptr;
8073
Mark Youngc89c6312016-03-31 16:03:20 -06008074 VkPipelineColorBlendAttachmentState att = {};
8075 att.blendEnable = VK_FALSE;
8076 att.colorWriteMask = 0xf;
8077
Karl Schultz6addd812016-02-02 17:17:23 -07008078 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8079 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8080 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008081 cb_ci.attachmentCount = 1;
8082 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008083
8084 VkGraphicsPipelineCreateInfo gp_ci = {};
8085 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8086 gp_ci.stageCount = 2;
8087 gp_ci.pStages = shaderStages;
8088 gp_ci.pVertexInputState = &vi_ci;
8089 gp_ci.pInputAssemblyState = &ia_ci;
8090 gp_ci.pViewportState = &vp_state_ci;
8091 gp_ci.pRasterizationState = &rs_ci;
8092 gp_ci.pColorBlendState = &cb_ci;
8093 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008094 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008095 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8096 gp_ci.layout = pipeline_layout;
8097 gp_ci.renderPass = renderPass();
8098
8099 VkPipelineCacheCreateInfo pc_ci = {};
8100 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8101
8102 VkPipeline pipeline;
8103 VkPipelineCache pipelineCache;
8104
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008105 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008106 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008107 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008108
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008109 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008110
8111 // Now hit second fail case where we set scissor w/ different count than PSO
8112 // First need to successfully create the PSO from above by setting
8113 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8115 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008116
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008117 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008118 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008119 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008120 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008121 m_commandBuffer->BeginCommandBuffer();
8122 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008123 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008124 VkViewport viewports[1] = {};
8125 viewports[0].width = 8;
8126 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008127 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008128 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008129 Draw(1, 0, 0, 0);
8130
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008131 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008132
Chia-I Wuf7458c52015-10-26 21:10:41 +08008133 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8134 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8135 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8136 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008137 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008138}
8139
Mark Young7394fdd2016-03-31 14:56:43 -06008140TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8141 VkResult err;
8142
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008144
8145 ASSERT_NO_FATAL_FAILURE(InitState());
8146 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8147
8148 VkDescriptorPoolSize ds_type_count = {};
8149 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8150 ds_type_count.descriptorCount = 1;
8151
8152 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8153 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8154 ds_pool_ci.maxSets = 1;
8155 ds_pool_ci.poolSizeCount = 1;
8156 ds_pool_ci.pPoolSizes = &ds_type_count;
8157
8158 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008159 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008160 ASSERT_VK_SUCCESS(err);
8161
8162 VkDescriptorSetLayoutBinding dsl_binding = {};
8163 dsl_binding.binding = 0;
8164 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8165 dsl_binding.descriptorCount = 1;
8166 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8167
8168 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8169 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8170 ds_layout_ci.bindingCount = 1;
8171 ds_layout_ci.pBindings = &dsl_binding;
8172
8173 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008174 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008175 ASSERT_VK_SUCCESS(err);
8176
8177 VkDescriptorSet descriptorSet;
8178 VkDescriptorSetAllocateInfo alloc_info = {};
8179 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8180 alloc_info.descriptorSetCount = 1;
8181 alloc_info.descriptorPool = ds_pool;
8182 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008183 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008184 ASSERT_VK_SUCCESS(err);
8185
8186 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8187 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8188 pipeline_layout_ci.setLayoutCount = 1;
8189 pipeline_layout_ci.pSetLayouts = &ds_layout;
8190
8191 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008192 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008193 ASSERT_VK_SUCCESS(err);
8194
8195 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8196 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8197 vp_state_ci.scissorCount = 1;
8198 vp_state_ci.pScissors = NULL;
8199 vp_state_ci.viewportCount = 1;
8200 vp_state_ci.pViewports = NULL;
8201
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008202 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008203 // Set scissor as dynamic to avoid that error
8204 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8205 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8206 dyn_state_ci.dynamicStateCount = 2;
8207 dyn_state_ci.pDynamicStates = dynamic_states;
8208
8209 VkPipelineShaderStageCreateInfo shaderStages[2];
8210 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8211
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008212 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8213 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008214 this); // TODO - We shouldn't need a fragment shader
8215 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008216 shaderStages[0] = vs.GetStageCreateInfo();
8217 shaderStages[1] = fs.GetStageCreateInfo();
8218
8219 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8220 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8221 vi_ci.pNext = nullptr;
8222 vi_ci.vertexBindingDescriptionCount = 0;
8223 vi_ci.pVertexBindingDescriptions = nullptr;
8224 vi_ci.vertexAttributeDescriptionCount = 0;
8225 vi_ci.pVertexAttributeDescriptions = nullptr;
8226
8227 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8228 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8229 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8230
8231 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8232 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8233 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008234 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008235
Mark Young47107952016-05-02 15:59:55 -06008236 // Check too low (line width of -1.0f).
8237 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008238
8239 VkPipelineColorBlendAttachmentState att = {};
8240 att.blendEnable = VK_FALSE;
8241 att.colorWriteMask = 0xf;
8242
8243 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8244 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8245 cb_ci.pNext = nullptr;
8246 cb_ci.attachmentCount = 1;
8247 cb_ci.pAttachments = &att;
8248
8249 VkGraphicsPipelineCreateInfo gp_ci = {};
8250 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8251 gp_ci.stageCount = 2;
8252 gp_ci.pStages = shaderStages;
8253 gp_ci.pVertexInputState = &vi_ci;
8254 gp_ci.pInputAssemblyState = &ia_ci;
8255 gp_ci.pViewportState = &vp_state_ci;
8256 gp_ci.pRasterizationState = &rs_ci;
8257 gp_ci.pColorBlendState = &cb_ci;
8258 gp_ci.pDynamicState = &dyn_state_ci;
8259 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8260 gp_ci.layout = pipeline_layout;
8261 gp_ci.renderPass = renderPass();
8262
8263 VkPipelineCacheCreateInfo pc_ci = {};
8264 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8265
8266 VkPipeline pipeline;
8267 VkPipelineCache pipelineCache;
8268
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008269 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008270 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008271 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008272
8273 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008274 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008275
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008277
8278 // Check too high (line width of 65536.0f).
8279 rs_ci.lineWidth = 65536.0f;
8280
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008281 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008282 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008283 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008284
8285 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008286 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008287
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008289
8290 dyn_state_ci.dynamicStateCount = 3;
8291
8292 rs_ci.lineWidth = 1.0f;
8293
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008294 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008295 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008296 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008297 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008298 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008299
8300 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008301 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008302 m_errorMonitor->VerifyFound();
8303
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008305
8306 // Check too high with dynamic setting.
8307 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8308 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008309 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008310
8311 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8312 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8313 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8314 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008315 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008316}
8317
Karl Schultz6addd812016-02-02 17:17:23 -07008318TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008319 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008321 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008322
8323 ASSERT_NO_FATAL_FAILURE(InitState());
8324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008325
Tony Barbour552f6c02016-12-21 14:34:07 -07008326 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008327 // Don't care about RenderPass handle b/c error should be flagged before
8328 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008329 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008330
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008331 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008332}
8333
Karl Schultz6addd812016-02-02 17:17:23 -07008334TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008335 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8337 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008338
8339 ASSERT_NO_FATAL_FAILURE(InitState());
8340 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008341
Tony Barbour552f6c02016-12-21 14:34:07 -07008342 m_commandBuffer->BeginCommandBuffer();
8343 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008344 // Just create a dummy Renderpass that's non-NULL so we can get to the
8345 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008346 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008347
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008348 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008349}
8350
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008351TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008352 TEST_DESCRIPTION(
8353 "Begin a renderPass where clearValueCount is less than"
8354 "the number of renderPass attachments that use loadOp"
8355 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008356
8357 ASSERT_NO_FATAL_FAILURE(InitState());
8358 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8359
8360 // Create a renderPass with a single attachment that uses loadOp CLEAR
8361 VkAttachmentReference attach = {};
8362 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8363 VkSubpassDescription subpass = {};
8364 subpass.inputAttachmentCount = 1;
8365 subpass.pInputAttachments = &attach;
8366 VkRenderPassCreateInfo rpci = {};
8367 rpci.subpassCount = 1;
8368 rpci.pSubpasses = &subpass;
8369 rpci.attachmentCount = 1;
8370 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008371 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008372 // Set loadOp to CLEAR
8373 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8374 rpci.pAttachments = &attach_desc;
8375 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8376 VkRenderPass rp;
8377 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8378
8379 VkCommandBufferInheritanceInfo hinfo = {};
8380 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8381 hinfo.renderPass = VK_NULL_HANDLE;
8382 hinfo.subpass = 0;
8383 hinfo.framebuffer = VK_NULL_HANDLE;
8384 hinfo.occlusionQueryEnable = VK_FALSE;
8385 hinfo.queryFlags = 0;
8386 hinfo.pipelineStatistics = 0;
8387 VkCommandBufferBeginInfo info = {};
8388 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8389 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8390 info.pInheritanceInfo = &hinfo;
8391
8392 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8393 VkRenderPassBeginInfo rp_begin = {};
8394 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8395 rp_begin.pNext = NULL;
8396 rp_begin.renderPass = renderPass();
8397 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008398 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008399
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008401
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008402 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008403
8404 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008405
8406 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008407}
8408
Slawomir Cygan0808f392016-11-28 17:53:23 +01008409TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008410 TEST_DESCRIPTION(
8411 "Begin a renderPass where clearValueCount is greater than"
8412 "the number of renderPass attachments that use loadOp"
8413 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008414
8415 ASSERT_NO_FATAL_FAILURE(InitState());
8416 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8417
8418 // Create a renderPass with a single attachment that uses loadOp CLEAR
8419 VkAttachmentReference attach = {};
8420 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8421 VkSubpassDescription subpass = {};
8422 subpass.inputAttachmentCount = 1;
8423 subpass.pInputAttachments = &attach;
8424 VkRenderPassCreateInfo rpci = {};
8425 rpci.subpassCount = 1;
8426 rpci.pSubpasses = &subpass;
8427 rpci.attachmentCount = 1;
8428 VkAttachmentDescription attach_desc = {};
8429 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8430 // Set loadOp to CLEAR
8431 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8432 rpci.pAttachments = &attach_desc;
8433 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8434 VkRenderPass rp;
8435 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8436
8437 VkCommandBufferBeginInfo info = {};
8438 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8439 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8440
8441 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8442 VkRenderPassBeginInfo rp_begin = {};
8443 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8444 rp_begin.pNext = NULL;
8445 rp_begin.renderPass = renderPass();
8446 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008447 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008448
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8450 " has a clearValueCount of"
8451 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008452
8453 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8454
8455 m_errorMonitor->VerifyFound();
8456
8457 vkDestroyRenderPass(m_device->device(), rp, NULL);
8458}
8459
Cody Northrop3bb4d962016-05-09 16:15:57 -06008460TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008461 TEST_DESCRIPTION("End a command buffer with an active render pass");
8462
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8464 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008465
8466 ASSERT_NO_FATAL_FAILURE(InitState());
8467 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8468
Tony Barbour552f6c02016-12-21 14:34:07 -07008469 m_commandBuffer->BeginCommandBuffer();
8470 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8471 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008472
8473 m_errorMonitor->VerifyFound();
8474
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008475 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8476 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008477}
8478
Karl Schultz6addd812016-02-02 17:17:23 -07008479TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008480 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8482 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008483
8484 ASSERT_NO_FATAL_FAILURE(InitState());
8485 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008486
Tony Barbour552f6c02016-12-21 14:34:07 -07008487 m_commandBuffer->BeginCommandBuffer();
8488 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008489
8490 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008491 vk_testing::Buffer dstBuffer;
8492 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008493
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008494 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008495
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008496 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008497}
8498
Karl Schultz6addd812016-02-02 17:17:23 -07008499TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008500 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8502 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008503
8504 ASSERT_NO_FATAL_FAILURE(InitState());
8505 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008506
Tony Barbour552f6c02016-12-21 14:34:07 -07008507 m_commandBuffer->BeginCommandBuffer();
8508 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008509
8510 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008511 vk_testing::Buffer dstBuffer;
8512 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008513
Karl Schultz6addd812016-02-02 17:17:23 -07008514 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008515 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8516 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8517 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008518
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008519 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008520}
8521
Karl Schultz6addd812016-02-02 17:17:23 -07008522TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008523 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008524 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8525 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008526
8527 ASSERT_NO_FATAL_FAILURE(InitState());
8528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008529
Tony Barbour552f6c02016-12-21 14:34:07 -07008530 m_commandBuffer->BeginCommandBuffer();
8531 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008532
Michael Lentine0a369f62016-02-03 16:51:46 -06008533 VkClearColorValue clear_color;
8534 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008535 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8536 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8537 const int32_t tex_width = 32;
8538 const int32_t tex_height = 32;
8539 VkImageCreateInfo image_create_info = {};
8540 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8541 image_create_info.pNext = NULL;
8542 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8543 image_create_info.format = tex_format;
8544 image_create_info.extent.width = tex_width;
8545 image_create_info.extent.height = tex_height;
8546 image_create_info.extent.depth = 1;
8547 image_create_info.mipLevels = 1;
8548 image_create_info.arrayLayers = 1;
8549 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8550 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8551 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008552
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008553 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008554 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008555
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008556 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008557
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008558 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008559
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008560 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008561}
8562
Karl Schultz6addd812016-02-02 17:17:23 -07008563TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008564 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8566 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008567
8568 ASSERT_NO_FATAL_FAILURE(InitState());
8569 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008570
Tony Barbour552f6c02016-12-21 14:34:07 -07008571 m_commandBuffer->BeginCommandBuffer();
8572 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008573
8574 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008575 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008576 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8577 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8578 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8579 image_create_info.extent.width = 64;
8580 image_create_info.extent.height = 64;
8581 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8582 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008583
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008584 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008585 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008586
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008587 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008588
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008589 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8590 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008591
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008592 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008593}
8594
Karl Schultz6addd812016-02-02 17:17:23 -07008595TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008596 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008597 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008598
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008599 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8600 "vkCmdClearAttachments(): This call "
8601 "must be issued inside an active "
8602 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008603
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008604 ASSERT_NO_FATAL_FAILURE(InitState());
8605 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008606
8607 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008608 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008609 ASSERT_VK_SUCCESS(err);
8610
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008611 VkClearAttachment color_attachment;
8612 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8613 color_attachment.clearValue.color.float32[0] = 0;
8614 color_attachment.clearValue.color.float32[1] = 0;
8615 color_attachment.clearValue.color.float32[2] = 0;
8616 color_attachment.clearValue.color.float32[3] = 0;
8617 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008618 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008619 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008620
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008621 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008622}
8623
Chris Forbes3b97e932016-09-07 11:29:24 +12008624TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008625 TEST_DESCRIPTION(
8626 "Test that an error is produced when CmdNextSubpass is "
8627 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008628
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8630 "vkCmdNextSubpass(): Attempted to advance "
8631 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008632
8633 ASSERT_NO_FATAL_FAILURE(InitState());
8634 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8635
Tony Barbour552f6c02016-12-21 14:34:07 -07008636 m_commandBuffer->BeginCommandBuffer();
8637 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008638
8639 // error here.
8640 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8641 m_errorMonitor->VerifyFound();
8642
Tony Barbour552f6c02016-12-21 14:34:07 -07008643 m_commandBuffer->EndRenderPass();
8644 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008645}
8646
Chris Forbes6d624702016-09-07 13:57:05 +12008647TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008648 TEST_DESCRIPTION(
8649 "Test that an error is produced when CmdEndRenderPass is "
8650 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008651
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8653 "vkCmdEndRenderPass(): Called before reaching "
8654 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008655
8656 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008657 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8658 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008659
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008660 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008661
8662 VkRenderPass rp;
8663 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8664 ASSERT_VK_SUCCESS(err);
8665
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008666 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008667
8668 VkFramebuffer fb;
8669 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8670 ASSERT_VK_SUCCESS(err);
8671
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008672 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008673
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008674 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 +12008675
8676 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8677
8678 // Error here.
8679 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8680 m_errorMonitor->VerifyFound();
8681
8682 // Clean up.
8683 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8684 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8685}
8686
Karl Schultz9e66a292016-04-21 15:57:51 -06008687TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8688 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8690 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008691
8692 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour552f6c02016-12-21 14:34:07 -07008693 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008694
8695 VkBufferMemoryBarrier buf_barrier = {};
8696 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8697 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8698 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8699 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8700 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8701 buf_barrier.buffer = VK_NULL_HANDLE;
8702 buf_barrier.offset = 0;
8703 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008704 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8705 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008706
8707 m_errorMonitor->VerifyFound();
8708}
8709
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008710TEST_F(VkLayerTest, InvalidBarriers) {
8711 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8712
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008714
8715 ASSERT_NO_FATAL_FAILURE(InitState());
8716 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8717
8718 VkMemoryBarrier mem_barrier = {};
8719 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8720 mem_barrier.pNext = NULL;
8721 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8722 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008723 m_commandBuffer->BeginCommandBuffer();
8724 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008725 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008726 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008727 &mem_barrier, 0, nullptr, 0, nullptr);
8728 m_errorMonitor->VerifyFound();
8729
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008731 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008732 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 -06008733 ASSERT_TRUE(image.initialized());
8734 VkImageMemoryBarrier img_barrier = {};
8735 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8736 img_barrier.pNext = NULL;
8737 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8738 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8739 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8740 // New layout can't be UNDEFINED
8741 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8742 img_barrier.image = image.handle();
8743 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8744 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8745 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8746 img_barrier.subresourceRange.baseArrayLayer = 0;
8747 img_barrier.subresourceRange.baseMipLevel = 0;
8748 img_barrier.subresourceRange.layerCount = 1;
8749 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008750 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8751 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008752 m_errorMonitor->VerifyFound();
8753 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8754
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8756 "Subresource must have the sum of the "
8757 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008758 // baseArrayLayer + layerCount must be <= image's arrayLayers
8759 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008760 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8761 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008762 m_errorMonitor->VerifyFound();
8763 img_barrier.subresourceRange.baseArrayLayer = 0;
8764
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008766 // baseMipLevel + levelCount must be <= image's mipLevels
8767 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008768 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8769 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008770 m_errorMonitor->VerifyFound();
8771 img_barrier.subresourceRange.baseMipLevel = 0;
8772
Mike Weiblen7053aa32017-01-25 15:21:10 -07008773 // levelCount must be non-zero.
8774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
8775 img_barrier.subresourceRange.levelCount = 0;
8776 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8777 nullptr, 0, nullptr, 1, &img_barrier);
8778 m_errorMonitor->VerifyFound();
8779 img_barrier.subresourceRange.levelCount = 1;
8780
8781 // layerCount must be non-zero.
8782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
8783 img_barrier.subresourceRange.layerCount = 0;
8784 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8785 nullptr, 0, nullptr, 1, &img_barrier);
8786 m_errorMonitor->VerifyFound();
8787 img_barrier.subresourceRange.layerCount = 1;
8788
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008789 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 -06008790 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008791 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8792 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008793 VkBufferMemoryBarrier buf_barrier = {};
8794 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8795 buf_barrier.pNext = NULL;
8796 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8797 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8798 buf_barrier.buffer = buffer.handle();
8799 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8800 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8801 buf_barrier.offset = 0;
8802 buf_barrier.size = VK_WHOLE_SIZE;
8803 // Can't send buffer barrier during a render pass
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, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008806 m_errorMonitor->VerifyFound();
8807 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8808
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008810 buf_barrier.offset = 257;
8811 // Offset greater than total size
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, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008814 m_errorMonitor->VerifyFound();
8815 buf_barrier.offset = 0;
8816
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008818 buf_barrier.size = 257;
8819 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008820 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8821 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008822 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008823
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008824 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008825 m_errorMonitor->SetDesiredFailureMsg(
8826 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008827 "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 -06008828 VkDepthStencilObj ds_image(m_device);
8829 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
8830 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06008831 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
8832 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008833 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008834
8835 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07008836 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008837 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8838 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008839 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07008840
8841 // Having anything other than DEPTH or STENCIL is an error
8842 m_errorMonitor->SetDesiredFailureMsg(
8843 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8844 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
8845 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
8846 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8847 nullptr, 0, nullptr, 1, &img_barrier);
8848 m_errorMonitor->VerifyFound();
8849
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008850 // Now test depth-only
8851 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008852 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
8853 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008854 VkDepthStencilObj d_image(m_device);
8855 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
8856 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008857 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008858 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008859 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008860
8861 // DEPTH bit must be set
8862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8863 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07008864 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07008865 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8866 0, nullptr, 0, nullptr, 1, &img_barrier);
8867 m_errorMonitor->VerifyFound();
8868
8869 // No bits other than DEPTH may be set
8870 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8871 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
8872 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008873 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8874 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008875 m_errorMonitor->VerifyFound();
8876 }
Dave Houltonfbf52152017-01-06 12:55:29 -07008877
8878 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008879 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
8880 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8882 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008883 VkDepthStencilObj s_image(m_device);
8884 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
8885 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008886 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008887 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008888 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008889 // Use of COLOR aspect on depth image is error
8890 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008891 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8892 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008893 m_errorMonitor->VerifyFound();
8894 }
Dave Houltonfbf52152017-01-06 12:55:29 -07008895
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008896 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008897 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008898 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 -06008899 ASSERT_TRUE(c_image.initialized());
8900 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8901 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
8902 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008903
8904 // COLOR bit must be set
8905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8906 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07008907 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07008908 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8909 nullptr, 0, nullptr, 1, &img_barrier);
8910 m_errorMonitor->VerifyFound();
8911
8912 // No bits other than COLOR may be set
8913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8914 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
8915 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008916 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8917 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008918 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008919
8920 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
8921
8922 // Create command pool with incompatible queueflags
8923 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
8924 uint32_t queue_family_index = UINT32_MAX;
8925 for (uint32_t i = 0; i < queue_props.size(); i++) {
8926 if ((queue_props[i].queueFlags & VK_QUEUE_COMPUTE_BIT) == 0) {
8927 queue_family_index = i;
8928 break;
8929 }
8930 }
8931 if (queue_family_index == UINT32_MAX) {
8932 printf("No non-compute queue found; skipped.\n");
8933 return;
8934 }
8935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
8936
8937 VkCommandPool command_pool;
8938 VkCommandPoolCreateInfo pool_create_info{};
8939 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
8940 pool_create_info.queueFamilyIndex = queue_family_index;
8941 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
8942 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
8943
8944 // Allocate a command buffer
8945 VkCommandBuffer bad_command_buffer;
8946 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
8947 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
8948 command_buffer_allocate_info.commandPool = command_pool;
8949 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
8950 command_buffer_allocate_info.commandBufferCount = 1;
8951 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
8952
8953 VkCommandBufferBeginInfo cbbi = {};
8954 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8955 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
8956 buf_barrier.offset = 0;
8957 buf_barrier.size = VK_WHOLE_SIZE;
8958 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
8959 &buf_barrier, 0, nullptr);
8960 m_errorMonitor->VerifyFound();
8961
8962 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
8963 vkEndCommandBuffer(bad_command_buffer);
8964 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
8965 printf("The non-compute queue does not support graphics; skipped.\n");
8966 return;
8967 }
8968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
8969 VkEvent event;
8970 VkEventCreateInfo event_create_info{};
8971 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
8972 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
8973 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
8974 nullptr, 0, nullptr);
8975 m_errorMonitor->VerifyFound();
8976
8977 vkEndCommandBuffer(bad_command_buffer);
8978 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008979}
8980
Tony Barbour18ba25c2016-09-29 13:42:40 -06008981TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
8982 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
8983
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour18ba25c2016-09-29 13:42:40 -06008985 ASSERT_NO_FATAL_FAILURE(InitState());
8986 VkImageObj image(m_device);
Tony Barbour256c80a2016-10-05 13:23:46 -06008987 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 -06008988 ASSERT_TRUE(image.initialized());
8989
8990 VkImageMemoryBarrier barrier = {};
8991 VkImageSubresourceRange range;
8992 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8993 barrier.srcAccessMask = 0;
8994 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
8995 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
8996 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8997 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8998 barrier.image = image.handle();
8999 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9000 range.baseMipLevel = 0;
9001 range.levelCount = 1;
9002 range.baseArrayLayer = 0;
9003 range.layerCount = 1;
9004 barrier.subresourceRange = range;
9005 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9006 cmdbuf.BeginCommandBuffer();
9007 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9008 &barrier);
9009 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9010 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9011 barrier.srcAccessMask = 0;
9012 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9013 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9014 &barrier);
9015
9016 m_errorMonitor->VerifyFound();
9017}
9018
Karl Schultz6addd812016-02-02 17:17:23 -07009019TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009020 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009021 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009022
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009024
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009025 ASSERT_NO_FATAL_FAILURE(InitState());
9026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009027 uint32_t qfi = 0;
9028 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009029 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9030 buffCI.size = 1024;
9031 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9032 buffCI.queueFamilyIndexCount = 1;
9033 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009034
9035 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009036 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009037 ASSERT_VK_SUCCESS(err);
9038
Tony Barbour552f6c02016-12-21 14:34:07 -07009039 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009040 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009041 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9042 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009043 // Should error before calling to driver so don't care about actual data
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009044 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7, VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009045
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009046 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009047
Chia-I Wuf7458c52015-10-26 21:10:41 +08009048 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009049}
9050
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009051TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9052 // Create an out-of-range queueFamilyIndex
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9054 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
9055 "of the indices specified when the device was created, via the "
9056 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009057
9058 ASSERT_NO_FATAL_FAILURE(InitState());
9059 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9060 VkBufferCreateInfo buffCI = {};
9061 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9062 buffCI.size = 1024;
9063 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9064 buffCI.queueFamilyIndexCount = 1;
9065 // Introduce failure by specifying invalid queue_family_index
9066 uint32_t qfi = 777;
9067 buffCI.pQueueFamilyIndices = &qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009068 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009069
9070 VkBuffer ib;
9071 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
9072
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009073 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009074 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009075}
9076
Karl Schultz6addd812016-02-02 17:17:23 -07009077TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009078 TEST_DESCRIPTION(
9079 "Attempt vkCmdExecuteCommands with a primary command buffer"
9080 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009081
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009082 ASSERT_NO_FATAL_FAILURE(InitState());
9083 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009084
Chris Forbesf29a84f2016-10-06 18:39:28 +13009085 // An empty primary command buffer
9086 VkCommandBufferObj cb(m_device, m_commandPool);
9087 cb.BeginCommandBuffer();
9088 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009089
Chris Forbesf29a84f2016-10-06 18:39:28 +13009090 m_commandBuffer->BeginCommandBuffer();
9091 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9092 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009093
Chris Forbesf29a84f2016-10-06 18:39:28 +13009094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9095 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009096 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009097}
9098
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009099TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009100 TEST_DESCRIPTION(
9101 "Attempt to update descriptor sets for images and buffers "
9102 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009103 VkResult err;
9104
9105 ASSERT_NO_FATAL_FAILURE(InitState());
9106 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9107 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9108 ds_type_count[i].type = VkDescriptorType(i);
9109 ds_type_count[i].descriptorCount = 1;
9110 }
9111 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9112 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9113 ds_pool_ci.pNext = NULL;
9114 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9115 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9116 ds_pool_ci.pPoolSizes = ds_type_count;
9117
9118 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009119 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009120 ASSERT_VK_SUCCESS(err);
9121
9122 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009123 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009124 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9125 dsl_binding[i].binding = 0;
9126 dsl_binding[i].descriptorType = VkDescriptorType(i);
9127 dsl_binding[i].descriptorCount = 1;
9128 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9129 dsl_binding[i].pImmutableSamplers = NULL;
9130 }
9131
9132 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9133 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9134 ds_layout_ci.pNext = NULL;
9135 ds_layout_ci.bindingCount = 1;
9136 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9137 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9138 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009139 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009140 ASSERT_VK_SUCCESS(err);
9141 }
9142 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9143 VkDescriptorSetAllocateInfo alloc_info = {};
9144 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9145 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9146 alloc_info.descriptorPool = ds_pool;
9147 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009148 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009149 ASSERT_VK_SUCCESS(err);
9150
9151 // Create a buffer & bufferView to be used for invalid updates
9152 VkBufferCreateInfo buff_ci = {};
9153 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009154 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009155 buff_ci.size = 256;
9156 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009157 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009158 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9159 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009160
9161 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9162 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9163 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9164 ASSERT_VK_SUCCESS(err);
9165
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009166 VkMemoryRequirements mem_reqs;
9167 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9168 VkMemoryAllocateInfo mem_alloc_info = {};
9169 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9170 mem_alloc_info.pNext = NULL;
9171 mem_alloc_info.memoryTypeIndex = 0;
9172 mem_alloc_info.allocationSize = mem_reqs.size;
9173 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9174 if (!pass) {
9175 vkDestroyBuffer(m_device->device(), buffer, NULL);
9176 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9177 return;
9178 }
9179 VkDeviceMemory mem;
9180 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9181 ASSERT_VK_SUCCESS(err);
9182 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9183 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009184
9185 VkBufferViewCreateInfo buff_view_ci = {};
9186 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9187 buff_view_ci.buffer = buffer;
9188 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9189 buff_view_ci.range = VK_WHOLE_SIZE;
9190 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009191 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009192 ASSERT_VK_SUCCESS(err);
9193
Tony Barbour415497c2017-01-24 10:06:09 -07009194 // Now get resources / view for storage_texel_buffer
9195 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9196 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9197 if (!pass) {
9198 vkDestroyBuffer(m_device->device(), buffer, NULL);
9199 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9200 vkFreeMemory(m_device->device(), mem, NULL);
9201 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9202 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9203 return;
9204 }
9205 VkDeviceMemory storage_texel_buffer_mem;
9206 VkBufferView storage_texel_buffer_view;
9207 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9208 ASSERT_VK_SUCCESS(err);
9209 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9210 ASSERT_VK_SUCCESS(err);
9211 buff_view_ci.buffer = storage_texel_buffer;
9212 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9213 ASSERT_VK_SUCCESS(err);
9214
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009215 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009216 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009217 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009218 image_ci.format = VK_FORMAT_UNDEFINED;
9219 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9220 VkFormat format = static_cast<VkFormat>(f);
9221 VkFormatProperties fProps = m_device->format_properties(format);
9222 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9223 image_ci.format = format;
9224 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9225 break;
9226 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9227 image_ci.format = format;
9228 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9229 break;
9230 }
9231 }
9232 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9233 return;
9234 }
9235
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009236 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9237 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009238 image_ci.extent.width = 64;
9239 image_ci.extent.height = 64;
9240 image_ci.extent.depth = 1;
9241 image_ci.mipLevels = 1;
9242 image_ci.arrayLayers = 1;
9243 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009244 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009245 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009246 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9247 VkImage image;
9248 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9249 ASSERT_VK_SUCCESS(err);
9250 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009251 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009252
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009253 VkMemoryAllocateInfo mem_alloc = {};
9254 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9255 mem_alloc.pNext = NULL;
9256 mem_alloc.allocationSize = 0;
9257 mem_alloc.memoryTypeIndex = 0;
9258 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9259 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009260 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009261 ASSERT_TRUE(pass);
9262 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9263 ASSERT_VK_SUCCESS(err);
9264 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9265 ASSERT_VK_SUCCESS(err);
9266 // Now create view for image
9267 VkImageViewCreateInfo image_view_ci = {};
9268 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9269 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009270 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009271 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9272 image_view_ci.subresourceRange.layerCount = 1;
9273 image_view_ci.subresourceRange.baseArrayLayer = 0;
9274 image_view_ci.subresourceRange.levelCount = 1;
9275 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9276 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009277 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009278 ASSERT_VK_SUCCESS(err);
9279
9280 VkDescriptorBufferInfo buff_info = {};
9281 buff_info.buffer = buffer;
9282 VkDescriptorImageInfo img_info = {};
9283 img_info.imageView = image_view;
9284 VkWriteDescriptorSet descriptor_write = {};
9285 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9286 descriptor_write.dstBinding = 0;
9287 descriptor_write.descriptorCount = 1;
9288 descriptor_write.pTexelBufferView = &buff_view;
9289 descriptor_write.pBufferInfo = &buff_info;
9290 descriptor_write.pImageInfo = &img_info;
9291
9292 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009293 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009294 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9295 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9296 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9297 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9298 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9299 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9300 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9301 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9302 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9303 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9304 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009305 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009306 // Start loop at 1 as SAMPLER desc type has no usage bit error
9307 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009308 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9309 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9310 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9311 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009312 descriptor_write.descriptorType = VkDescriptorType(i);
9313 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009315
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009316 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009317
9318 m_errorMonitor->VerifyFound();
9319 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009320 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9321 descriptor_write.pTexelBufferView = &buff_view;
9322 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009323 }
Tony Barbour415497c2017-01-24 10:06:09 -07009324
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009325 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9326 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009327 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009328 vkDestroyImageView(m_device->device(), image_view, NULL);
9329 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009330 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009331 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009332 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009333 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009334 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009335 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9336}
9337
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009338TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009339 TEST_DESCRIPTION(
9340 "Attempt to update buffer descriptor set that has incorrect "
9341 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
9342 "1. offset value greater than buffer size\n"
9343 "2. range value of 0\n"
9344 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009345 VkResult err;
9346
9347 ASSERT_NO_FATAL_FAILURE(InitState());
9348 VkDescriptorPoolSize ds_type_count = {};
9349 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9350 ds_type_count.descriptorCount = 1;
9351
9352 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9353 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9354 ds_pool_ci.pNext = NULL;
9355 ds_pool_ci.maxSets = 1;
9356 ds_pool_ci.poolSizeCount = 1;
9357 ds_pool_ci.pPoolSizes = &ds_type_count;
9358
9359 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009360 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009361 ASSERT_VK_SUCCESS(err);
9362
9363 // Create layout with single uniform buffer descriptor
9364 VkDescriptorSetLayoutBinding dsl_binding = {};
9365 dsl_binding.binding = 0;
9366 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9367 dsl_binding.descriptorCount = 1;
9368 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9369 dsl_binding.pImmutableSamplers = NULL;
9370
9371 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9372 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9373 ds_layout_ci.pNext = NULL;
9374 ds_layout_ci.bindingCount = 1;
9375 ds_layout_ci.pBindings = &dsl_binding;
9376 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009377 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009378 ASSERT_VK_SUCCESS(err);
9379
9380 VkDescriptorSet descriptor_set = {};
9381 VkDescriptorSetAllocateInfo alloc_info = {};
9382 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9383 alloc_info.descriptorSetCount = 1;
9384 alloc_info.descriptorPool = ds_pool;
9385 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009386 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009387 ASSERT_VK_SUCCESS(err);
9388
9389 // Create a buffer to be used for invalid updates
9390 VkBufferCreateInfo buff_ci = {};
9391 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9392 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9393 buff_ci.size = 256;
9394 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9395 VkBuffer buffer;
9396 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9397 ASSERT_VK_SUCCESS(err);
9398 // Have to bind memory to buffer before descriptor update
9399 VkMemoryAllocateInfo mem_alloc = {};
9400 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9401 mem_alloc.pNext = NULL;
9402 mem_alloc.allocationSize = 256;
9403 mem_alloc.memoryTypeIndex = 0;
9404
9405 VkMemoryRequirements mem_reqs;
9406 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009407 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009408 if (!pass) {
9409 vkDestroyBuffer(m_device->device(), buffer, NULL);
9410 return;
9411 }
9412
9413 VkDeviceMemory mem;
9414 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9415 ASSERT_VK_SUCCESS(err);
9416 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9417 ASSERT_VK_SUCCESS(err);
9418
9419 VkDescriptorBufferInfo buff_info = {};
9420 buff_info.buffer = buffer;
9421 // First make offset 1 larger than buffer size
9422 buff_info.offset = 257;
9423 buff_info.range = VK_WHOLE_SIZE;
9424 VkWriteDescriptorSet descriptor_write = {};
9425 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9426 descriptor_write.dstBinding = 0;
9427 descriptor_write.descriptorCount = 1;
9428 descriptor_write.pTexelBufferView = nullptr;
9429 descriptor_write.pBufferInfo = &buff_info;
9430 descriptor_write.pImageInfo = nullptr;
9431
9432 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9433 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009435
9436 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9437
9438 m_errorMonitor->VerifyFound();
9439 // Now cause error due to range of 0
9440 buff_info.offset = 0;
9441 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009443
9444 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9445
9446 m_errorMonitor->VerifyFound();
9447 // Now cause error due to range exceeding buffer size - offset
9448 buff_info.offset = 128;
9449 buff_info.range = 200;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009451
9452 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9453
9454 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009455 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009456 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9457 vkDestroyBuffer(m_device->device(), buffer, NULL);
9458 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9459 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9460}
9461
Tobin Ehlis845887e2017-02-02 19:01:44 -07009462TEST_F(VkLayerTest, DSBufferLimitErrors) {
9463 TEST_DESCRIPTION(
9464 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9465 "Test cases include:\n"
9466 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9467 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9468 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9469 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9470 VkResult err;
9471
9472 ASSERT_NO_FATAL_FAILURE(InitState());
9473 VkDescriptorPoolSize ds_type_count[2] = {};
9474 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9475 ds_type_count[0].descriptorCount = 1;
9476 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9477 ds_type_count[1].descriptorCount = 1;
9478
9479 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9480 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9481 ds_pool_ci.pNext = NULL;
9482 ds_pool_ci.maxSets = 1;
9483 ds_pool_ci.poolSizeCount = 2;
9484 ds_pool_ci.pPoolSizes = ds_type_count;
9485
9486 VkDescriptorPool ds_pool;
9487 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9488 ASSERT_VK_SUCCESS(err);
9489
9490 // Create layout with single uniform buffer & single storage buffer descriptor
9491 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9492 dsl_binding[0].binding = 0;
9493 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9494 dsl_binding[0].descriptorCount = 1;
9495 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9496 dsl_binding[0].pImmutableSamplers = NULL;
9497 dsl_binding[1].binding = 1;
9498 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9499 dsl_binding[1].descriptorCount = 1;
9500 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9501 dsl_binding[1].pImmutableSamplers = NULL;
9502
9503 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9504 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9505 ds_layout_ci.pNext = NULL;
9506 ds_layout_ci.bindingCount = 2;
9507 ds_layout_ci.pBindings = dsl_binding;
9508 VkDescriptorSetLayout ds_layout;
9509 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9510 ASSERT_VK_SUCCESS(err);
9511
9512 VkDescriptorSet descriptor_set = {};
9513 VkDescriptorSetAllocateInfo alloc_info = {};
9514 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9515 alloc_info.descriptorSetCount = 1;
9516 alloc_info.descriptorPool = ds_pool;
9517 alloc_info.pSetLayouts = &ds_layout;
9518 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9519 ASSERT_VK_SUCCESS(err);
9520
9521 // Create a buffer to be used for invalid updates
9522 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9523 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9524 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9525 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9526 VkBufferCreateInfo ub_ci = {};
9527 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9528 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9529 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9530 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9531 VkBuffer uniform_buffer;
9532 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9533 ASSERT_VK_SUCCESS(err);
9534 VkBufferCreateInfo sb_ci = {};
9535 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9536 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9537 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9538 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9539 VkBuffer storage_buffer;
9540 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9541 ASSERT_VK_SUCCESS(err);
9542 // Have to bind memory to buffer before descriptor update
9543 VkMemoryAllocateInfo mem_alloc = {};
9544 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9545 mem_alloc.pNext = NULL;
9546 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9547 mem_alloc.memoryTypeIndex = 0;
9548
9549 VkMemoryRequirements mem_reqs;
9550 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &mem_reqs);
9551 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9552 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &mem_reqs);
9553 pass &= m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9554 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009555 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009556 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009557 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9558 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009559 return;
9560 }
9561
9562 VkDeviceMemory mem;
9563 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009564 if (VK_SUCCESS != err) {
9565 printf("Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
9566 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9567 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9568 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9569 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9570 return;
9571 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009572 ASSERT_VK_SUCCESS(err);
9573 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9574 ASSERT_VK_SUCCESS(err);
9575 auto sb_offset = ub_ci.size + 1024;
9576 // Verify offset alignment, I know there's a bit trick to do this but it escapes me
9577 sb_offset = (sb_offset % mem_reqs.alignment) ? sb_offset - (sb_offset % mem_reqs.alignment) : sb_offset;
9578 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9579 ASSERT_VK_SUCCESS(err);
9580
9581 VkDescriptorBufferInfo buff_info = {};
9582 buff_info.buffer = uniform_buffer;
9583 buff_info.range = ub_ci.size; // This will exceed limit
9584 VkWriteDescriptorSet descriptor_write = {};
9585 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9586 descriptor_write.dstBinding = 0;
9587 descriptor_write.descriptorCount = 1;
9588 descriptor_write.pTexelBufferView = nullptr;
9589 descriptor_write.pBufferInfo = &buff_info;
9590 descriptor_write.pImageInfo = nullptr;
9591
9592 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9593 descriptor_write.dstSet = descriptor_set;
9594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9595 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9596 m_errorMonitor->VerifyFound();
9597
9598 // Reduce size of range to acceptable limit & cause offset error
9599 buff_info.range = max_ub_range;
9600 buff_info.offset = min_ub_align - 1;
9601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9602 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9603 m_errorMonitor->VerifyFound();
9604
9605 // Now break storage updates
9606 buff_info.buffer = storage_buffer;
9607 buff_info.range = sb_ci.size; // This will exceed limit
9608 buff_info.offset = 0; // Reset offset for this update
9609
9610 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9611 descriptor_write.dstBinding = 1;
9612 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9613 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9614 m_errorMonitor->VerifyFound();
9615
9616 // Reduce size of range to acceptable limit & cause offset error
9617 buff_info.range = max_sb_range;
9618 buff_info.offset = min_sb_align - 1;
9619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9620 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9621 m_errorMonitor->VerifyFound();
9622
9623 vkFreeMemory(m_device->device(), mem, NULL);
9624 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9625 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9626 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9627 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9628}
9629
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009630TEST_F(VkLayerTest, DSAspectBitsErrors) {
9631 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9632 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009633 TEST_DESCRIPTION(
9634 "Attempt to update descriptor sets for images "
9635 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009636 VkResult err;
9637
9638 ASSERT_NO_FATAL_FAILURE(InitState());
9639 VkDescriptorPoolSize ds_type_count = {};
9640 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9641 ds_type_count.descriptorCount = 1;
9642
9643 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9644 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9645 ds_pool_ci.pNext = NULL;
9646 ds_pool_ci.maxSets = 5;
9647 ds_pool_ci.poolSizeCount = 1;
9648 ds_pool_ci.pPoolSizes = &ds_type_count;
9649
9650 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009651 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009652 ASSERT_VK_SUCCESS(err);
9653
9654 VkDescriptorSetLayoutBinding dsl_binding = {};
9655 dsl_binding.binding = 0;
9656 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9657 dsl_binding.descriptorCount = 1;
9658 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9659 dsl_binding.pImmutableSamplers = NULL;
9660
9661 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9662 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9663 ds_layout_ci.pNext = NULL;
9664 ds_layout_ci.bindingCount = 1;
9665 ds_layout_ci.pBindings = &dsl_binding;
9666 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009667 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009668 ASSERT_VK_SUCCESS(err);
9669
9670 VkDescriptorSet descriptor_set = {};
9671 VkDescriptorSetAllocateInfo alloc_info = {};
9672 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9673 alloc_info.descriptorSetCount = 1;
9674 alloc_info.descriptorPool = ds_pool;
9675 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009676 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009677 ASSERT_VK_SUCCESS(err);
9678
9679 // Create an image to be used for invalid updates
9680 VkImageCreateInfo image_ci = {};
9681 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9682 image_ci.imageType = VK_IMAGE_TYPE_2D;
9683 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9684 image_ci.extent.width = 64;
9685 image_ci.extent.height = 64;
9686 image_ci.extent.depth = 1;
9687 image_ci.mipLevels = 1;
9688 image_ci.arrayLayers = 1;
9689 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9690 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9691 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9692 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9693 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9694 VkImage image;
9695 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9696 ASSERT_VK_SUCCESS(err);
9697 // Bind memory to image
9698 VkMemoryRequirements mem_reqs;
9699 VkDeviceMemory image_mem;
9700 bool pass;
9701 VkMemoryAllocateInfo mem_alloc = {};
9702 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9703 mem_alloc.pNext = NULL;
9704 mem_alloc.allocationSize = 0;
9705 mem_alloc.memoryTypeIndex = 0;
9706 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9707 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009708 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009709 ASSERT_TRUE(pass);
9710 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9711 ASSERT_VK_SUCCESS(err);
9712 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9713 ASSERT_VK_SUCCESS(err);
9714 // Now create view for image
9715 VkImageViewCreateInfo image_view_ci = {};
9716 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9717 image_view_ci.image = image;
9718 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9719 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9720 image_view_ci.subresourceRange.layerCount = 1;
9721 image_view_ci.subresourceRange.baseArrayLayer = 0;
9722 image_view_ci.subresourceRange.levelCount = 1;
9723 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009724 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009725
9726 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009727 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009728 ASSERT_VK_SUCCESS(err);
9729
9730 VkDescriptorImageInfo img_info = {};
9731 img_info.imageView = image_view;
9732 VkWriteDescriptorSet descriptor_write = {};
9733 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9734 descriptor_write.dstBinding = 0;
9735 descriptor_write.descriptorCount = 1;
9736 descriptor_write.pTexelBufferView = NULL;
9737 descriptor_write.pBufferInfo = NULL;
9738 descriptor_write.pImageInfo = &img_info;
9739 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9740 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009741 const char *error_msg =
9742 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
9743 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009745
9746 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9747
9748 m_errorMonitor->VerifyFound();
9749 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9750 vkDestroyImage(m_device->device(), image, NULL);
9751 vkFreeMemory(m_device->device(), image_mem, NULL);
9752 vkDestroyImageView(m_device->device(), image_view, NULL);
9753 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9754 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9755}
9756
Karl Schultz6addd812016-02-02 17:17:23 -07009757TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009758 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07009759 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009760
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9762 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
9763 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009764
Tobin Ehlis3b780662015-05-28 12:11:26 -06009765 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009766 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009767 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009768 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9769 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009770
9771 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009772 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9773 ds_pool_ci.pNext = NULL;
9774 ds_pool_ci.maxSets = 1;
9775 ds_pool_ci.poolSizeCount = 1;
9776 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009777
Tobin Ehlis3b780662015-05-28 12:11:26 -06009778 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009779 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009780 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009781 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009782 dsl_binding.binding = 0;
9783 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9784 dsl_binding.descriptorCount = 1;
9785 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9786 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009787
Tony Barboureb254902015-07-15 12:50:33 -06009788 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009789 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9790 ds_layout_ci.pNext = NULL;
9791 ds_layout_ci.bindingCount = 1;
9792 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009793
Tobin Ehlis3b780662015-05-28 12:11:26 -06009794 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009795 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009796 ASSERT_VK_SUCCESS(err);
9797
9798 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009799 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009800 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009801 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009802 alloc_info.descriptorPool = ds_pool;
9803 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009804 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009805 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009806
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009807 VkSamplerCreateInfo sampler_ci = {};
9808 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9809 sampler_ci.pNext = NULL;
9810 sampler_ci.magFilter = VK_FILTER_NEAREST;
9811 sampler_ci.minFilter = VK_FILTER_NEAREST;
9812 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9813 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9814 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9815 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9816 sampler_ci.mipLodBias = 1.0;
9817 sampler_ci.anisotropyEnable = VK_FALSE;
9818 sampler_ci.maxAnisotropy = 1;
9819 sampler_ci.compareEnable = VK_FALSE;
9820 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9821 sampler_ci.minLod = 1.0;
9822 sampler_ci.maxLod = 1.0;
9823 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9824 sampler_ci.unnormalizedCoordinates = VK_FALSE;
9825 VkSampler sampler;
9826 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9827 ASSERT_VK_SUCCESS(err);
9828
9829 VkDescriptorImageInfo info = {};
9830 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009831
9832 VkWriteDescriptorSet descriptor_write;
9833 memset(&descriptor_write, 0, sizeof(descriptor_write));
9834 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009835 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009836 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009837 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009838 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009839 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009840
9841 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9842
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009843 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009844
Chia-I Wuf7458c52015-10-26 21:10:41 +08009845 vkDestroySampler(m_device->device(), sampler, NULL);
9846 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9847 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009848}
9849
Karl Schultz6addd812016-02-02 17:17:23 -07009850TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009851 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07009852 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009853
Tobin Ehlisf922ef82016-11-30 10:19:14 -07009854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009855
Tobin Ehlis3b780662015-05-28 12:11:26 -06009856 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009857 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009858 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009859 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9860 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009861
9862 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009863 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9864 ds_pool_ci.pNext = NULL;
9865 ds_pool_ci.maxSets = 1;
9866 ds_pool_ci.poolSizeCount = 1;
9867 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009868
Tobin Ehlis3b780662015-05-28 12:11:26 -06009869 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009870 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009871 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009872
Tony Barboureb254902015-07-15 12:50:33 -06009873 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009874 dsl_binding.binding = 0;
9875 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9876 dsl_binding.descriptorCount = 1;
9877 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9878 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009879
9880 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009881 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9882 ds_layout_ci.pNext = NULL;
9883 ds_layout_ci.bindingCount = 1;
9884 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009885
Tobin Ehlis3b780662015-05-28 12:11:26 -06009886 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009887 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009888 ASSERT_VK_SUCCESS(err);
9889
9890 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009891 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009892 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009893 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009894 alloc_info.descriptorPool = ds_pool;
9895 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009896 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009897 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009898
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009899 // Correctly update descriptor to avoid "NOT_UPDATED" error
9900 VkDescriptorBufferInfo buff_info = {};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009901 buff_info.buffer = VkBuffer(0); // Don't care about buffer handle for this test
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009902 buff_info.offset = 0;
9903 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009904
9905 VkWriteDescriptorSet descriptor_write;
9906 memset(&descriptor_write, 0, sizeof(descriptor_write));
9907 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009908 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009909 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08009910 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009911 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9912 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009913
9914 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9915
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009916 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009917
Chia-I Wuf7458c52015-10-26 21:10:41 +08009918 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9919 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009920}
9921
Karl Schultz6addd812016-02-02 17:17:23 -07009922TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009923 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -07009924 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009925
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009927
Tobin Ehlis3b780662015-05-28 12:11:26 -06009928 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009929 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009930 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009931 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9932 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009933
9934 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009935 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9936 ds_pool_ci.pNext = NULL;
9937 ds_pool_ci.maxSets = 1;
9938 ds_pool_ci.poolSizeCount = 1;
9939 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009940
Tobin Ehlis3b780662015-05-28 12:11:26 -06009941 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009942 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009943 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009944
Tony Barboureb254902015-07-15 12:50:33 -06009945 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009946 dsl_binding.binding = 0;
9947 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9948 dsl_binding.descriptorCount = 1;
9949 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9950 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009951
9952 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009953 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9954 ds_layout_ci.pNext = NULL;
9955 ds_layout_ci.bindingCount = 1;
9956 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009957 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009958 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009959 ASSERT_VK_SUCCESS(err);
9960
9961 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009962 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009963 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009964 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009965 alloc_info.descriptorPool = ds_pool;
9966 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009967 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009968 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009969
Tony Barboureb254902015-07-15 12:50:33 -06009970 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009971 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9972 sampler_ci.pNext = NULL;
9973 sampler_ci.magFilter = VK_FILTER_NEAREST;
9974 sampler_ci.minFilter = VK_FILTER_NEAREST;
9975 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9976 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9977 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9978 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9979 sampler_ci.mipLodBias = 1.0;
9980 sampler_ci.anisotropyEnable = VK_FALSE;
9981 sampler_ci.maxAnisotropy = 1;
9982 sampler_ci.compareEnable = VK_FALSE;
9983 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9984 sampler_ci.minLod = 1.0;
9985 sampler_ci.maxLod = 1.0;
9986 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9987 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06009988
Tobin Ehlis3b780662015-05-28 12:11:26 -06009989 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009990 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009991 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009992
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009993 VkDescriptorImageInfo info = {};
9994 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009995
9996 VkWriteDescriptorSet descriptor_write;
9997 memset(&descriptor_write, 0, sizeof(descriptor_write));
9998 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009999 descriptor_write.dstSet = descriptorSet;
10000 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010001 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010002 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010003 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010004 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010005
10006 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10007
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010008 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010009
Chia-I Wuf7458c52015-10-26 21:10:41 +080010010 vkDestroySampler(m_device->device(), sampler, NULL);
10011 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10012 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010013}
10014
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010015TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10016 // Create layout w/ empty binding and attempt to update it
10017 VkResult err;
10018
10019 ASSERT_NO_FATAL_FAILURE(InitState());
10020
10021 VkDescriptorPoolSize ds_type_count = {};
10022 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10023 ds_type_count.descriptorCount = 1;
10024
10025 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10026 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10027 ds_pool_ci.pNext = NULL;
10028 ds_pool_ci.maxSets = 1;
10029 ds_pool_ci.poolSizeCount = 1;
10030 ds_pool_ci.pPoolSizes = &ds_type_count;
10031
10032 VkDescriptorPool ds_pool;
10033 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10034 ASSERT_VK_SUCCESS(err);
10035
10036 VkDescriptorSetLayoutBinding dsl_binding = {};
10037 dsl_binding.binding = 0;
10038 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10039 dsl_binding.descriptorCount = 0;
10040 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10041 dsl_binding.pImmutableSamplers = NULL;
10042
10043 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10044 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10045 ds_layout_ci.pNext = NULL;
10046 ds_layout_ci.bindingCount = 1;
10047 ds_layout_ci.pBindings = &dsl_binding;
10048 VkDescriptorSetLayout ds_layout;
10049 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10050 ASSERT_VK_SUCCESS(err);
10051
10052 VkDescriptorSet descriptor_set;
10053 VkDescriptorSetAllocateInfo alloc_info = {};
10054 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10055 alloc_info.descriptorSetCount = 1;
10056 alloc_info.descriptorPool = ds_pool;
10057 alloc_info.pSetLayouts = &ds_layout;
10058 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10059 ASSERT_VK_SUCCESS(err);
10060
10061 VkSamplerCreateInfo sampler_ci = {};
10062 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10063 sampler_ci.magFilter = VK_FILTER_NEAREST;
10064 sampler_ci.minFilter = VK_FILTER_NEAREST;
10065 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10066 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10067 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10068 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10069 sampler_ci.mipLodBias = 1.0;
10070 sampler_ci.maxAnisotropy = 1;
10071 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10072 sampler_ci.minLod = 1.0;
10073 sampler_ci.maxLod = 1.0;
10074 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10075
10076 VkSampler sampler;
10077 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10078 ASSERT_VK_SUCCESS(err);
10079
10080 VkDescriptorImageInfo info = {};
10081 info.sampler = sampler;
10082
10083 VkWriteDescriptorSet descriptor_write;
10084 memset(&descriptor_write, 0, sizeof(descriptor_write));
10085 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10086 descriptor_write.dstSet = descriptor_set;
10087 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010088 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010089 // This is the wrong type, but empty binding error will be flagged first
10090 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10091 descriptor_write.pImageInfo = &info;
10092
10093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10094 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10095 m_errorMonitor->VerifyFound();
10096
10097 vkDestroySampler(m_device->device(), sampler, NULL);
10098 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10099 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10100}
10101
Karl Schultz6addd812016-02-02 17:17:23 -070010102TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10103 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10104 // types
10105 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010106
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010107 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 -060010108
Tobin Ehlis3b780662015-05-28 12:11:26 -060010109 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010110
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010111 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010112 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10113 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010114
10115 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010116 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10117 ds_pool_ci.pNext = NULL;
10118 ds_pool_ci.maxSets = 1;
10119 ds_pool_ci.poolSizeCount = 1;
10120 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010121
Tobin Ehlis3b780662015-05-28 12:11:26 -060010122 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010123 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010124 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010125 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010126 dsl_binding.binding = 0;
10127 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10128 dsl_binding.descriptorCount = 1;
10129 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10130 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010131
Tony Barboureb254902015-07-15 12:50:33 -060010132 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010133 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10134 ds_layout_ci.pNext = NULL;
10135 ds_layout_ci.bindingCount = 1;
10136 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010137
Tobin Ehlis3b780662015-05-28 12:11:26 -060010138 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010139 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010140 ASSERT_VK_SUCCESS(err);
10141
10142 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010143 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010144 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010145 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010146 alloc_info.descriptorPool = ds_pool;
10147 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010148 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010149 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010150
Tony Barboureb254902015-07-15 12:50:33 -060010151 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010152 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10153 sampler_ci.pNext = NULL;
10154 sampler_ci.magFilter = VK_FILTER_NEAREST;
10155 sampler_ci.minFilter = VK_FILTER_NEAREST;
10156 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10157 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10158 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10159 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10160 sampler_ci.mipLodBias = 1.0;
10161 sampler_ci.anisotropyEnable = VK_FALSE;
10162 sampler_ci.maxAnisotropy = 1;
10163 sampler_ci.compareEnable = VK_FALSE;
10164 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10165 sampler_ci.minLod = 1.0;
10166 sampler_ci.maxLod = 1.0;
10167 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10168 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010169 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010170 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010171 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010172
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010173 VkDescriptorImageInfo info = {};
10174 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010175
10176 VkWriteDescriptorSet descriptor_write;
10177 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010178 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010179 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010180 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010181 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010182 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010183 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010184
10185 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10186
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010187 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010188
Chia-I Wuf7458c52015-10-26 21:10:41 +080010189 vkDestroySampler(m_device->device(), sampler, NULL);
10190 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10191 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010192}
10193
Karl Schultz6addd812016-02-02 17:17:23 -070010194TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010195 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010196 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010197
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010199
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010200 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010201 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10202 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010203 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010204 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10205 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010206
10207 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010208 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10209 ds_pool_ci.pNext = NULL;
10210 ds_pool_ci.maxSets = 1;
10211 ds_pool_ci.poolSizeCount = 1;
10212 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010213
10214 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010215 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010216 ASSERT_VK_SUCCESS(err);
10217
10218 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010219 dsl_binding.binding = 0;
10220 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10221 dsl_binding.descriptorCount = 1;
10222 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10223 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010224
10225 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010226 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10227 ds_layout_ci.pNext = NULL;
10228 ds_layout_ci.bindingCount = 1;
10229 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010230 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010231 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010232 ASSERT_VK_SUCCESS(err);
10233
10234 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010235 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010236 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010237 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010238 alloc_info.descriptorPool = ds_pool;
10239 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010240 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010241 ASSERT_VK_SUCCESS(err);
10242
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010243 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010244
10245 VkDescriptorImageInfo descriptor_info;
10246 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10247 descriptor_info.sampler = sampler;
10248
10249 VkWriteDescriptorSet descriptor_write;
10250 memset(&descriptor_write, 0, sizeof(descriptor_write));
10251 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010252 descriptor_write.dstSet = descriptorSet;
10253 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010254 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010255 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10256 descriptor_write.pImageInfo = &descriptor_info;
10257
10258 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10259
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010260 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010261
Chia-I Wuf7458c52015-10-26 21:10:41 +080010262 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10263 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010264}
10265
Karl Schultz6addd812016-02-02 17:17:23 -070010266TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10267 // Create a single combined Image/Sampler descriptor and send it an invalid
10268 // imageView
10269 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010270
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010272
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010273 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010274 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010275 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10276 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010277
10278 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010279 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10280 ds_pool_ci.pNext = NULL;
10281 ds_pool_ci.maxSets = 1;
10282 ds_pool_ci.poolSizeCount = 1;
10283 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010284
10285 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010286 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010287 ASSERT_VK_SUCCESS(err);
10288
10289 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010290 dsl_binding.binding = 0;
10291 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10292 dsl_binding.descriptorCount = 1;
10293 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10294 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010295
10296 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010297 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10298 ds_layout_ci.pNext = NULL;
10299 ds_layout_ci.bindingCount = 1;
10300 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010301 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010302 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010303 ASSERT_VK_SUCCESS(err);
10304
10305 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010306 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010307 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010308 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010309 alloc_info.descriptorPool = ds_pool;
10310 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010311 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010312 ASSERT_VK_SUCCESS(err);
10313
10314 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010315 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10316 sampler_ci.pNext = NULL;
10317 sampler_ci.magFilter = VK_FILTER_NEAREST;
10318 sampler_ci.minFilter = VK_FILTER_NEAREST;
10319 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10320 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10321 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10322 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10323 sampler_ci.mipLodBias = 1.0;
10324 sampler_ci.anisotropyEnable = VK_FALSE;
10325 sampler_ci.maxAnisotropy = 1;
10326 sampler_ci.compareEnable = VK_FALSE;
10327 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10328 sampler_ci.minLod = 1.0;
10329 sampler_ci.maxLod = 1.0;
10330 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10331 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010332
10333 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010334 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010335 ASSERT_VK_SUCCESS(err);
10336
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010337 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010338
10339 VkDescriptorImageInfo descriptor_info;
10340 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10341 descriptor_info.sampler = sampler;
10342 descriptor_info.imageView = view;
10343
10344 VkWriteDescriptorSet descriptor_write;
10345 memset(&descriptor_write, 0, sizeof(descriptor_write));
10346 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010347 descriptor_write.dstSet = descriptorSet;
10348 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010349 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010350 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10351 descriptor_write.pImageInfo = &descriptor_info;
10352
10353 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10354
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010355 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010356
Chia-I Wuf7458c52015-10-26 21:10:41 +080010357 vkDestroySampler(m_device->device(), sampler, NULL);
10358 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10359 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010360}
10361
Karl Schultz6addd812016-02-02 17:17:23 -070010362TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10363 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10364 // into the other
10365 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010366
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10368 " binding #1 with type "
10369 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10370 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010371
Tobin Ehlis04356f92015-10-27 16:35:27 -060010372 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010373 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010374 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010375 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10376 ds_type_count[0].descriptorCount = 1;
10377 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10378 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010379
10380 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010381 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10382 ds_pool_ci.pNext = NULL;
10383 ds_pool_ci.maxSets = 1;
10384 ds_pool_ci.poolSizeCount = 2;
10385 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010386
10387 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010388 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010389 ASSERT_VK_SUCCESS(err);
10390 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010391 dsl_binding[0].binding = 0;
10392 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10393 dsl_binding[0].descriptorCount = 1;
10394 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10395 dsl_binding[0].pImmutableSamplers = NULL;
10396 dsl_binding[1].binding = 1;
10397 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10398 dsl_binding[1].descriptorCount = 1;
10399 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10400 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010401
10402 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010403 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10404 ds_layout_ci.pNext = NULL;
10405 ds_layout_ci.bindingCount = 2;
10406 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010407
10408 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010409 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010410 ASSERT_VK_SUCCESS(err);
10411
10412 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010413 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010414 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010415 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010416 alloc_info.descriptorPool = ds_pool;
10417 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010418 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010419 ASSERT_VK_SUCCESS(err);
10420
10421 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010422 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10423 sampler_ci.pNext = NULL;
10424 sampler_ci.magFilter = VK_FILTER_NEAREST;
10425 sampler_ci.minFilter = VK_FILTER_NEAREST;
10426 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10427 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10428 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10429 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10430 sampler_ci.mipLodBias = 1.0;
10431 sampler_ci.anisotropyEnable = VK_FALSE;
10432 sampler_ci.maxAnisotropy = 1;
10433 sampler_ci.compareEnable = VK_FALSE;
10434 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10435 sampler_ci.minLod = 1.0;
10436 sampler_ci.maxLod = 1.0;
10437 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10438 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010439
10440 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010441 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010442 ASSERT_VK_SUCCESS(err);
10443
10444 VkDescriptorImageInfo info = {};
10445 info.sampler = sampler;
10446
10447 VkWriteDescriptorSet descriptor_write;
10448 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10449 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010450 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010451 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010452 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010453 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10454 descriptor_write.pImageInfo = &info;
10455 // This write update should succeed
10456 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10457 // Now perform a copy update that fails due to type mismatch
10458 VkCopyDescriptorSet copy_ds_update;
10459 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10460 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10461 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010462 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010463 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010464 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10465 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010466 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10467
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010468 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010469 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010470 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 -060010471 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10472 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10473 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010474 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010475 copy_ds_update.dstSet = descriptorSet;
10476 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010477 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010478 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10479
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010480 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010481
Tobin Ehlis04356f92015-10-27 16:35:27 -060010482 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10484 " binding#1 with offset index of 1 plus "
10485 "update array offset of 0 and update of "
10486 "5 descriptors oversteps total number "
10487 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010488
Tobin Ehlis04356f92015-10-27 16:35:27 -060010489 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10490 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10491 copy_ds_update.srcSet = descriptorSet;
10492 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010493 copy_ds_update.dstSet = descriptorSet;
10494 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010495 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010496 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10497
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010498 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010499
Chia-I Wuf7458c52015-10-26 21:10:41 +080010500 vkDestroySampler(m_device->device(), sampler, NULL);
10501 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10502 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010503}
10504
Karl Schultz6addd812016-02-02 17:17:23 -070010505TEST_F(VkLayerTest, NumSamplesMismatch) {
10506 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10507 // sampleCount
10508 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010509
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010511
Tobin Ehlis3b780662015-05-28 12:11:26 -060010512 ASSERT_NO_FATAL_FAILURE(InitState());
10513 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010514 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010515 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010516 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010517
10518 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010519 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10520 ds_pool_ci.pNext = NULL;
10521 ds_pool_ci.maxSets = 1;
10522 ds_pool_ci.poolSizeCount = 1;
10523 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010524
Tobin Ehlis3b780662015-05-28 12:11:26 -060010525 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010526 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010527 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010528
Tony Barboureb254902015-07-15 12:50:33 -060010529 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010530 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010531 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010532 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010533 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10534 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010535
Tony Barboureb254902015-07-15 12:50:33 -060010536 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10537 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10538 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010539 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010540 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010541
Tobin Ehlis3b780662015-05-28 12:11:26 -060010542 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010543 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010544 ASSERT_VK_SUCCESS(err);
10545
10546 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010547 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010548 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010549 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010550 alloc_info.descriptorPool = ds_pool;
10551 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010552 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010553 ASSERT_VK_SUCCESS(err);
10554
Tony Barboureb254902015-07-15 12:50:33 -060010555 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010556 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010557 pipe_ms_state_ci.pNext = NULL;
10558 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10559 pipe_ms_state_ci.sampleShadingEnable = 0;
10560 pipe_ms_state_ci.minSampleShading = 1.0;
10561 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010562
Tony Barboureb254902015-07-15 12:50:33 -060010563 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010564 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10565 pipeline_layout_ci.pNext = NULL;
10566 pipeline_layout_ci.setLayoutCount = 1;
10567 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010568
10569 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010570 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010571 ASSERT_VK_SUCCESS(err);
10572
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010573 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010574 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 -060010575 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010576 VkPipelineObj pipe(m_device);
10577 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010578 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010579 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010580 pipe.SetMSAA(&pipe_ms_state_ci);
10581 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010582
Tony Barbour552f6c02016-12-21 14:34:07 -070010583 m_commandBuffer->BeginCommandBuffer();
10584 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010585 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010586
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010587 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10588 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10589 VkRect2D scissor = {{0, 0}, {16, 16}};
10590 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10591
Mark Young29927482016-05-04 14:38:51 -060010592 // Render triangle (the error should trigger on the attempt to draw).
10593 Draw(3, 1, 0, 0);
10594
10595 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010596 m_commandBuffer->EndRenderPass();
10597 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010598
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010599 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010600
Chia-I Wuf7458c52015-10-26 21:10:41 +080010601 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10602 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10603 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010604}
Mark Young29927482016-05-04 14:38:51 -060010605
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010606TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010607 TEST_DESCRIPTION(
10608 "Hit RenderPass incompatible cases. "
10609 "Initial case is drawing with an active renderpass that's "
10610 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010611 VkResult err;
10612
10613 ASSERT_NO_FATAL_FAILURE(InitState());
10614 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10615
10616 VkDescriptorSetLayoutBinding dsl_binding = {};
10617 dsl_binding.binding = 0;
10618 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10619 dsl_binding.descriptorCount = 1;
10620 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10621 dsl_binding.pImmutableSamplers = NULL;
10622
10623 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10624 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10625 ds_layout_ci.pNext = NULL;
10626 ds_layout_ci.bindingCount = 1;
10627 ds_layout_ci.pBindings = &dsl_binding;
10628
10629 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010630 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010631 ASSERT_VK_SUCCESS(err);
10632
10633 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10634 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10635 pipeline_layout_ci.pNext = NULL;
10636 pipeline_layout_ci.setLayoutCount = 1;
10637 pipeline_layout_ci.pSetLayouts = &ds_layout;
10638
10639 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010640 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010641 ASSERT_VK_SUCCESS(err);
10642
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010643 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010644 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 -060010645 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010646 // Create a renderpass that will be incompatible with default renderpass
10647 VkAttachmentReference attach = {};
10648 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
10649 VkAttachmentReference color_att = {};
10650 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10651 VkSubpassDescription subpass = {};
10652 subpass.inputAttachmentCount = 1;
10653 subpass.pInputAttachments = &attach;
10654 subpass.colorAttachmentCount = 1;
10655 subpass.pColorAttachments = &color_att;
10656 VkRenderPassCreateInfo rpci = {};
10657 rpci.subpassCount = 1;
10658 rpci.pSubpasses = &subpass;
10659 rpci.attachmentCount = 1;
10660 VkAttachmentDescription attach_desc = {};
10661 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060010662 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
10663 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010664 rpci.pAttachments = &attach_desc;
10665 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
10666 VkRenderPass rp;
10667 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10668 VkPipelineObj pipe(m_device);
10669 pipe.AddShader(&vs);
10670 pipe.AddShader(&fs);
10671 pipe.AddColorAttachment();
10672 VkViewport view_port = {};
10673 m_viewports.push_back(view_port);
10674 pipe.SetViewport(m_viewports);
10675 VkRect2D rect = {};
10676 m_scissors.push_back(rect);
10677 pipe.SetScissor(m_scissors);
10678 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10679
10680 VkCommandBufferInheritanceInfo cbii = {};
10681 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
10682 cbii.renderPass = rp;
10683 cbii.subpass = 0;
10684 VkCommandBufferBeginInfo cbbi = {};
10685 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10686 cbbi.pInheritanceInfo = &cbii;
10687 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
10688 VkRenderPassBeginInfo rpbi = {};
10689 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10690 rpbi.framebuffer = m_framebuffer;
10691 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010692 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
10693 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010694
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010696 // Render triangle (the error should trigger on the attempt to draw).
10697 Draw(3, 1, 0, 0);
10698
10699 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010700 m_commandBuffer->EndRenderPass();
10701 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010702
10703 m_errorMonitor->VerifyFound();
10704
10705 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10706 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10707 vkDestroyRenderPass(m_device->device(), rp, NULL);
10708}
10709
Mark Youngc89c6312016-03-31 16:03:20 -060010710TEST_F(VkLayerTest, NumBlendAttachMismatch) {
10711 // Create Pipeline where the number of blend attachments doesn't match the
10712 // number of color attachments. In this case, we don't add any color
10713 // blend attachments even though we have a color attachment.
10714 VkResult err;
10715
Tobin Ehlis974c0d92017-02-01 13:31:22 -070010716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060010717
10718 ASSERT_NO_FATAL_FAILURE(InitState());
10719 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10720 VkDescriptorPoolSize ds_type_count = {};
10721 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10722 ds_type_count.descriptorCount = 1;
10723
10724 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10725 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10726 ds_pool_ci.pNext = NULL;
10727 ds_pool_ci.maxSets = 1;
10728 ds_pool_ci.poolSizeCount = 1;
10729 ds_pool_ci.pPoolSizes = &ds_type_count;
10730
10731 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010732 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060010733 ASSERT_VK_SUCCESS(err);
10734
10735 VkDescriptorSetLayoutBinding dsl_binding = {};
10736 dsl_binding.binding = 0;
10737 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10738 dsl_binding.descriptorCount = 1;
10739 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10740 dsl_binding.pImmutableSamplers = NULL;
10741
10742 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10743 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10744 ds_layout_ci.pNext = NULL;
10745 ds_layout_ci.bindingCount = 1;
10746 ds_layout_ci.pBindings = &dsl_binding;
10747
10748 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010749 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010750 ASSERT_VK_SUCCESS(err);
10751
10752 VkDescriptorSet descriptorSet;
10753 VkDescriptorSetAllocateInfo alloc_info = {};
10754 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10755 alloc_info.descriptorSetCount = 1;
10756 alloc_info.descriptorPool = ds_pool;
10757 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010758 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060010759 ASSERT_VK_SUCCESS(err);
10760
10761 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010762 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060010763 pipe_ms_state_ci.pNext = NULL;
10764 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10765 pipe_ms_state_ci.sampleShadingEnable = 0;
10766 pipe_ms_state_ci.minSampleShading = 1.0;
10767 pipe_ms_state_ci.pSampleMask = NULL;
10768
10769 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10770 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10771 pipeline_layout_ci.pNext = NULL;
10772 pipeline_layout_ci.setLayoutCount = 1;
10773 pipeline_layout_ci.pSetLayouts = &ds_layout;
10774
10775 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010776 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010777 ASSERT_VK_SUCCESS(err);
10778
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010779 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010780 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 -060010781 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060010782 VkPipelineObj pipe(m_device);
10783 pipe.AddShader(&vs);
10784 pipe.AddShader(&fs);
10785 pipe.SetMSAA(&pipe_ms_state_ci);
10786 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010787 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060010788
10789 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10790 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10791 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10792}
Mark Young29927482016-05-04 14:38:51 -060010793
Mark Muellerd4914412016-06-13 17:52:06 -060010794TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010795 TEST_DESCRIPTION(
10796 "Points to a wrong colorAttachment index in a VkClearAttachment "
10797 "structure passed to vkCmdClearAttachments");
Cody Northropc31a84f2016-08-22 10:41:47 -060010798 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060010800
10801 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
10802 m_errorMonitor->VerifyFound();
10803}
10804
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010805TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010806 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
10807 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010808
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010809 ASSERT_NO_FATAL_FAILURE(InitState());
10810 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010811
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010812 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010813 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10814 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010815
10816 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010817 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10818 ds_pool_ci.pNext = NULL;
10819 ds_pool_ci.maxSets = 1;
10820 ds_pool_ci.poolSizeCount = 1;
10821 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010822
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010823 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010824 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010825 ASSERT_VK_SUCCESS(err);
10826
Tony Barboureb254902015-07-15 12:50:33 -060010827 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010828 dsl_binding.binding = 0;
10829 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10830 dsl_binding.descriptorCount = 1;
10831 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10832 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010833
Tony Barboureb254902015-07-15 12:50:33 -060010834 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010835 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10836 ds_layout_ci.pNext = NULL;
10837 ds_layout_ci.bindingCount = 1;
10838 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010839
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010840 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010841 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010842 ASSERT_VK_SUCCESS(err);
10843
10844 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010845 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010846 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010847 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010848 alloc_info.descriptorPool = ds_pool;
10849 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010850 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010851 ASSERT_VK_SUCCESS(err);
10852
Tony Barboureb254902015-07-15 12:50:33 -060010853 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010854 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010855 pipe_ms_state_ci.pNext = NULL;
10856 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10857 pipe_ms_state_ci.sampleShadingEnable = 0;
10858 pipe_ms_state_ci.minSampleShading = 1.0;
10859 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010860
Tony Barboureb254902015-07-15 12:50:33 -060010861 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010862 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10863 pipeline_layout_ci.pNext = NULL;
10864 pipeline_layout_ci.setLayoutCount = 1;
10865 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010866
10867 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010868 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010869 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010870
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010871 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060010872 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070010873 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010874 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010875
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010876 VkPipelineObj pipe(m_device);
10877 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010878 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010879 pipe.SetMSAA(&pipe_ms_state_ci);
10880 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010881
Tony Barbour552f6c02016-12-21 14:34:07 -070010882 m_commandBuffer->BeginCommandBuffer();
10883 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010884
Karl Schultz6addd812016-02-02 17:17:23 -070010885 // Main thing we care about for this test is that the VkImage obj we're
10886 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010887 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010888 VkClearAttachment color_attachment;
10889 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10890 color_attachment.clearValue.color.float32[0] = 1.0;
10891 color_attachment.clearValue.color.float32[1] = 1.0;
10892 color_attachment.clearValue.color.float32[2] = 1.0;
10893 color_attachment.clearValue.color.float32[3] = 1.0;
10894 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010895 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010896
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010897 // Call for full-sized FB Color attachment prior to issuing a Draw
10898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070010899 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010900 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010901 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010902
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010903 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
10904 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
10905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
10906 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
10907 m_errorMonitor->VerifyFound();
10908
10909 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
10910 clear_rect.layerCount = 2;
10911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
10912 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010913 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010914
Chia-I Wuf7458c52015-10-26 21:10:41 +080010915 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10916 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10917 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010918}
10919
Karl Schultz6addd812016-02-02 17:17:23 -070010920TEST_F(VkLayerTest, VtxBufferBadIndex) {
10921 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010922
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10924 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010925
Tobin Ehlis502480b2015-06-24 15:53:07 -060010926 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060010927 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060010928 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010929
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010930 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010931 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10932 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010933
10934 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010935 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10936 ds_pool_ci.pNext = NULL;
10937 ds_pool_ci.maxSets = 1;
10938 ds_pool_ci.poolSizeCount = 1;
10939 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010940
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010941 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010942 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010943 ASSERT_VK_SUCCESS(err);
10944
Tony Barboureb254902015-07-15 12:50:33 -060010945 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010946 dsl_binding.binding = 0;
10947 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10948 dsl_binding.descriptorCount = 1;
10949 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10950 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010951
Tony Barboureb254902015-07-15 12:50:33 -060010952 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010953 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10954 ds_layout_ci.pNext = NULL;
10955 ds_layout_ci.bindingCount = 1;
10956 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010957
Tobin Ehlis502480b2015-06-24 15:53:07 -060010958 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010959 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010960 ASSERT_VK_SUCCESS(err);
10961
10962 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010963 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010964 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010965 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010966 alloc_info.descriptorPool = ds_pool;
10967 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010968 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010969 ASSERT_VK_SUCCESS(err);
10970
Tony Barboureb254902015-07-15 12:50:33 -060010971 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010972 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010973 pipe_ms_state_ci.pNext = NULL;
10974 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10975 pipe_ms_state_ci.sampleShadingEnable = 0;
10976 pipe_ms_state_ci.minSampleShading = 1.0;
10977 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010978
Tony Barboureb254902015-07-15 12:50:33 -060010979 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010980 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10981 pipeline_layout_ci.pNext = NULL;
10982 pipeline_layout_ci.setLayoutCount = 1;
10983 pipeline_layout_ci.pSetLayouts = &ds_layout;
10984 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010985
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010986 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010987 ASSERT_VK_SUCCESS(err);
10988
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010989 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010990 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 -060010991 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010992 VkPipelineObj pipe(m_device);
10993 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010994 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010995 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010996 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060010997 pipe.SetViewport(m_viewports);
10998 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010999 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011000
Tony Barbour552f6c02016-12-21 14:34:07 -070011001 m_commandBuffer->BeginCommandBuffer();
11002 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011003 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011004 // Don't care about actual data, just need to get to draw to flag error
11005 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011006 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011007 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011008 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011009
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011010 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011011
Chia-I Wuf7458c52015-10-26 21:10:41 +080011012 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11013 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11014 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011015}
Mark Muellerdfe37552016-07-07 14:47:42 -060011016
Mark Mueller2ee294f2016-08-04 12:59:48 -060011017TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011018 TEST_DESCRIPTION(
11019 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11020 "Use invalid Queue Family Index in vkCreateDevice");
Cody Northropc31a84f2016-08-22 10:41:47 -060011021 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011022
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011023 const char *invalid_queueFamilyIndex_message =
11024 "Invalid queue create request in vkCreateDevice(). Invalid "
11025 "queueFamilyIndex ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011026
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011027 const char *unavailable_feature_message = "While calling vkCreateDevice(), requesting feature #";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011028
Mark Mueller880fce52016-08-17 15:23:23 -060011029 // The following test fails with recent NVidia drivers.
11030 // By the time core_validation is reached, the NVidia
11031 // driver has sanitized the invalid condition and core_validation
11032 // is not introduced to the failure condition. This is not the case
11033 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011034 // uint32_t count = static_cast<uint32_t>(~0);
11035 // VkPhysicalDevice physical_device;
11036 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11037 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011038
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queueFamilyIndex_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011040 float queue_priority = 0.0;
11041
11042 VkDeviceQueueCreateInfo queue_create_info = {};
11043 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11044 queue_create_info.queueCount = 1;
11045 queue_create_info.pQueuePriorities = &queue_priority;
11046 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11047
11048 VkPhysicalDeviceFeatures features = m_device->phy().features();
11049 VkDevice testDevice;
11050 VkDeviceCreateInfo device_create_info = {};
11051 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11052 device_create_info.queueCreateInfoCount = 1;
11053 device_create_info.pQueueCreateInfos = &queue_create_info;
11054 device_create_info.pEnabledFeatures = &features;
11055 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11056 m_errorMonitor->VerifyFound();
11057
11058 queue_create_info.queueFamilyIndex = 1;
11059
11060 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11061 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11062 for (unsigned i = 0; i < feature_count; i++) {
11063 if (VK_FALSE == feature_array[i]) {
11064 feature_array[i] = VK_TRUE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, unavailable_feature_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011066 device_create_info.pEnabledFeatures = &features;
11067 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11068 m_errorMonitor->VerifyFound();
11069 break;
11070 }
11071 }
11072}
11073
Tobin Ehlis16edf082016-11-21 12:33:49 -070011074TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11075 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11076
11077 ASSERT_NO_FATAL_FAILURE(InitState());
11078
11079 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11080 std::vector<VkDeviceQueueCreateInfo> queue_info;
11081 queue_info.reserve(queue_props.size());
11082 std::vector<std::vector<float>> queue_priorities;
11083 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11084 VkDeviceQueueCreateInfo qi{};
11085 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11086 qi.queueFamilyIndex = i;
11087 qi.queueCount = queue_props[i].queueCount;
11088 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11089 qi.pQueuePriorities = queue_priorities[i].data();
11090 queue_info.push_back(qi);
11091 }
11092
11093 std::vector<const char *> device_extension_names;
11094
11095 VkDevice local_device;
11096 VkDeviceCreateInfo device_create_info = {};
11097 auto features = m_device->phy().features();
11098 // Intentionally disable pipeline stats
11099 features.pipelineStatisticsQuery = VK_FALSE;
11100 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11101 device_create_info.pNext = NULL;
11102 device_create_info.queueCreateInfoCount = queue_info.size();
11103 device_create_info.pQueueCreateInfos = queue_info.data();
11104 device_create_info.enabledLayerCount = 0;
11105 device_create_info.ppEnabledLayerNames = NULL;
11106 device_create_info.pEnabledFeatures = &features;
11107 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11108 ASSERT_VK_SUCCESS(err);
11109
11110 VkQueryPoolCreateInfo qpci{};
11111 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11112 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11113 qpci.queryCount = 1;
11114 VkQueryPool query_pool;
11115
11116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11117 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11118 m_errorMonitor->VerifyFound();
11119
11120 vkDestroyDevice(local_device, nullptr);
11121}
11122
Mark Mueller2ee294f2016-08-04 12:59:48 -060011123TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011124 TEST_DESCRIPTION(
11125 "Use an invalid queue index in a vkCmdWaitEvents call."
11126 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011127
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011128 const char *invalid_queue_index =
11129 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11130 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11131 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011132
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011133 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011134
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011136
11137 ASSERT_NO_FATAL_FAILURE(InitState());
11138
11139 VkEvent event;
11140 VkEventCreateInfo event_create_info{};
11141 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11142 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11143
Mark Mueller2ee294f2016-08-04 12:59:48 -060011144 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011145 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011146
Tony Barbour552f6c02016-12-21 14:34:07 -070011147 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011148
11149 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011150 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 -060011151 ASSERT_TRUE(image.initialized());
11152 VkImageMemoryBarrier img_barrier = {};
11153 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11154 img_barrier.pNext = NULL;
11155 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11156 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11157 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11158 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11159 img_barrier.image = image.handle();
11160 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011161
11162 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11163 // that layer validation catches the case when it is not.
11164 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011165 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11166 img_barrier.subresourceRange.baseArrayLayer = 0;
11167 img_barrier.subresourceRange.baseMipLevel = 0;
11168 img_barrier.subresourceRange.layerCount = 1;
11169 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011170 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11171 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011172 m_errorMonitor->VerifyFound();
11173
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011175
11176 VkQueryPool query_pool;
11177 VkQueryPoolCreateInfo query_pool_create_info = {};
11178 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11179 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11180 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011181 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011182
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011183 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011184 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11185
11186 vkEndCommandBuffer(m_commandBuffer->handle());
11187 m_errorMonitor->VerifyFound();
11188
11189 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11190 vkDestroyEvent(m_device->device(), event, nullptr);
11191}
11192
Mark Muellerdfe37552016-07-07 14:47:42 -060011193TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011194 TEST_DESCRIPTION(
11195 "Submit a command buffer using deleted vertex buffer, "
11196 "delete a buffer twice, use an invalid offset for each "
11197 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011198
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011199 const char *deleted_buffer_in_command_buffer =
11200 "Cannot submit cmd buffer "
11201 "using deleted buffer ";
11202 const char *invalid_offset_message =
11203 "vkBindBufferMemory(): "
11204 "memoryOffset is 0x";
11205 const char *invalid_storage_buffer_offset_message =
11206 "vkBindBufferMemory(): "
11207 "storage memoryOffset "
11208 "is 0x";
11209 const char *invalid_texel_buffer_offset_message =
11210 "vkBindBufferMemory(): "
11211 "texel memoryOffset "
11212 "is 0x";
11213 const char *invalid_uniform_buffer_offset_message =
11214 "vkBindBufferMemory(): "
11215 "uniform memoryOffset "
11216 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011217
11218 ASSERT_NO_FATAL_FAILURE(InitState());
11219 ASSERT_NO_FATAL_FAILURE(InitViewport());
11220 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11221
11222 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011223 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011224 pipe_ms_state_ci.pNext = NULL;
11225 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11226 pipe_ms_state_ci.sampleShadingEnable = 0;
11227 pipe_ms_state_ci.minSampleShading = 1.0;
11228 pipe_ms_state_ci.pSampleMask = nullptr;
11229
11230 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11231 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11232 VkPipelineLayout pipeline_layout;
11233
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011234 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011235 ASSERT_VK_SUCCESS(err);
11236
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011237 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11238 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011239 VkPipelineObj pipe(m_device);
11240 pipe.AddShader(&vs);
11241 pipe.AddShader(&fs);
11242 pipe.AddColorAttachment();
11243 pipe.SetMSAA(&pipe_ms_state_ci);
11244 pipe.SetViewport(m_viewports);
11245 pipe.SetScissor(m_scissors);
11246 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11247
Tony Barbour552f6c02016-12-21 14:34:07 -070011248 m_commandBuffer->BeginCommandBuffer();
11249 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011250 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011251
11252 {
11253 // Create and bind a vertex buffer in a reduced scope, which will cause
11254 // it to be deleted upon leaving this scope
11255 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011256 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011257 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11258 draw_verticies.AddVertexInputToPipe(pipe);
11259 }
11260
11261 Draw(1, 0, 0, 0);
11262
Tony Barbour552f6c02016-12-21 14:34:07 -070011263 m_commandBuffer->EndRenderPass();
11264 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011265
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011267 QueueCommandBuffer(false);
11268 m_errorMonitor->VerifyFound();
11269
11270 {
11271 // Create and bind a vertex buffer in a reduced scope, and delete it
11272 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011273 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011275 buffer_test.TestDoubleDestroy();
11276 }
11277 m_errorMonitor->VerifyFound();
11278
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011279 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011280 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
11282 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11283 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011284 m_errorMonitor->VerifyFound();
11285 }
11286
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011287 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11288 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011289 // Create and bind a memory buffer with an invalid offset again,
11290 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
11292 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11293 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011294 m_errorMonitor->VerifyFound();
11295 }
11296
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011297 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011298 // Create and bind a memory buffer with an invalid offset again, but
11299 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
11301 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11302 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011303 m_errorMonitor->VerifyFound();
11304 }
11305
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011306 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011307 // Create and bind a memory buffer with an invalid offset again, but
11308 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
11310 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11311 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011312 m_errorMonitor->VerifyFound();
11313 }
11314
11315 {
11316 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011318 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11319 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011320 m_errorMonitor->VerifyFound();
11321 }
11322
11323 {
11324 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011326 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11327 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011328 }
11329 m_errorMonitor->VerifyFound();
11330
11331 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11332}
11333
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011334// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11335TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011336 TEST_DESCRIPTION(
11337 "Hit all possible validation checks associated with the "
11338 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11339 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011340 // 3 in ValidateCmdBufImageLayouts
11341 // * -1 Attempt to submit cmd buf w/ deleted image
11342 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11343 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011344
11345 ASSERT_NO_FATAL_FAILURE(InitState());
11346 // Create src & dst images to use for copy operations
11347 VkImage src_image;
11348 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011349 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011350
11351 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11352 const int32_t tex_width = 32;
11353 const int32_t tex_height = 32;
11354
11355 VkImageCreateInfo image_create_info = {};
11356 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11357 image_create_info.pNext = NULL;
11358 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11359 image_create_info.format = tex_format;
11360 image_create_info.extent.width = tex_width;
11361 image_create_info.extent.height = tex_height;
11362 image_create_info.extent.depth = 1;
11363 image_create_info.mipLevels = 1;
11364 image_create_info.arrayLayers = 4;
11365 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11366 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11367 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011368 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011369 image_create_info.flags = 0;
11370
11371 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11372 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011373 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011374 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11375 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011376 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11377 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11378 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11379 ASSERT_VK_SUCCESS(err);
11380
11381 // Allocate memory
11382 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011383 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011384 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011385 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11386 mem_alloc.pNext = NULL;
11387 mem_alloc.allocationSize = 0;
11388 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011389
11390 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011391 mem_alloc.allocationSize = img_mem_reqs.size;
11392 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011393 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011394 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011395 ASSERT_VK_SUCCESS(err);
11396
11397 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011398 mem_alloc.allocationSize = img_mem_reqs.size;
11399 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011400 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011401 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011402 ASSERT_VK_SUCCESS(err);
11403
11404 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011405 mem_alloc.allocationSize = img_mem_reqs.size;
11406 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011407 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011408 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011409 ASSERT_VK_SUCCESS(err);
11410
11411 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11412 ASSERT_VK_SUCCESS(err);
11413 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11414 ASSERT_VK_SUCCESS(err);
11415 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11416 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011417
Tony Barbour552f6c02016-12-21 14:34:07 -070011418 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011419 VkImageCopy copy_region;
11420 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11421 copy_region.srcSubresource.mipLevel = 0;
11422 copy_region.srcSubresource.baseArrayLayer = 0;
11423 copy_region.srcSubresource.layerCount = 1;
11424 copy_region.srcOffset.x = 0;
11425 copy_region.srcOffset.y = 0;
11426 copy_region.srcOffset.z = 0;
11427 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11428 copy_region.dstSubresource.mipLevel = 0;
11429 copy_region.dstSubresource.baseArrayLayer = 0;
11430 copy_region.dstSubresource.layerCount = 1;
11431 copy_region.dstOffset.x = 0;
11432 copy_region.dstOffset.y = 0;
11433 copy_region.dstOffset.z = 0;
11434 copy_region.extent.width = 1;
11435 copy_region.extent.height = 1;
11436 copy_region.extent.depth = 1;
11437
11438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11439 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11440 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 -060011441 m_errorMonitor->VerifyFound();
11442 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11444 "Cannot copy from an image whose source layout is "
11445 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
11446 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011447 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 -060011448 m_errorMonitor->VerifyFound();
11449 // Final src error is due to bad layout type
11450 m_errorMonitor->SetDesiredFailureMsg(
11451 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11452 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011453 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 -060011454 m_errorMonitor->VerifyFound();
11455 // Now verify same checks for dst
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11457 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011458 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 -060011459 m_errorMonitor->VerifyFound();
11460 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11462 "Cannot copy from an image whose dest layout is "
11463 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
11464 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011465 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 -060011466 m_errorMonitor->VerifyFound();
11467 m_errorMonitor->SetDesiredFailureMsg(
11468 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11469 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011470 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 -060011471 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011472
Cort3b021012016-12-07 12:00:57 -080011473 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11474 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11475 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11476 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11477 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11478 transfer_dst_image_barrier[0].srcAccessMask = 0;
11479 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11480 transfer_dst_image_barrier[0].image = dst_image;
11481 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11482 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11483 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11484 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11485 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11486 transfer_dst_image_barrier[0].image = depth_image;
11487 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11488 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11489 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11490
11491 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011492 VkClearColorValue color_clear_value = {};
11493 VkImageSubresourceRange clear_range;
11494 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11495 clear_range.baseMipLevel = 0;
11496 clear_range.baseArrayLayer = 0;
11497 clear_range.layerCount = 1;
11498 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011499
Cort3b021012016-12-07 12:00:57 -080011500 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11501 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011504 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011505 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011506 // Fail due to provided layout not matching actual current layout for color clear.
11507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011508 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011509 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011510
Cort530cf382016-12-08 09:59:47 -080011511 VkClearDepthStencilValue depth_clear_value = {};
11512 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011513
11514 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11515 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011518 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011519 m_errorMonitor->VerifyFound();
11520 // Fail due to provided layout not matching actual current layout for depth clear.
11521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011522 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011523 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011524
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011525 // Now cause error due to bad image layout transition in PipelineBarrier
11526 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011527 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011528 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011529 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011530 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011531 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11532 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011533 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11535 "You cannot transition the layout of aspect 1 from "
11536 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when "
11537 "current layout is VK_IMAGE_LAYOUT_GENERAL.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011538 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11539 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011540 m_errorMonitor->VerifyFound();
11541
11542 // Finally some layout errors at RenderPass create time
11543 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11544 VkAttachmentReference attach = {};
11545 // perf warning for GENERAL layout w/ non-DS input attachment
11546 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11547 VkSubpassDescription subpass = {};
11548 subpass.inputAttachmentCount = 1;
11549 subpass.pInputAttachments = &attach;
11550 VkRenderPassCreateInfo rpci = {};
11551 rpci.subpassCount = 1;
11552 rpci.pSubpasses = &subpass;
11553 rpci.attachmentCount = 1;
11554 VkAttachmentDescription attach_desc = {};
11555 attach_desc.format = VK_FORMAT_UNDEFINED;
11556 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011557 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011558 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11560 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011561 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11562 m_errorMonitor->VerifyFound();
11563 // error w/ non-general layout
11564 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11565
11566 m_errorMonitor->SetDesiredFailureMsg(
11567 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11568 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11569 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11570 m_errorMonitor->VerifyFound();
11571 subpass.inputAttachmentCount = 0;
11572 subpass.colorAttachmentCount = 1;
11573 subpass.pColorAttachments = &attach;
11574 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11575 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11577 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011578 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11579 m_errorMonitor->VerifyFound();
11580 // error w/ non-color opt or GENERAL layout for color attachment
11581 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11582 m_errorMonitor->SetDesiredFailureMsg(
11583 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11584 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11585 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11586 m_errorMonitor->VerifyFound();
11587 subpass.colorAttachmentCount = 0;
11588 subpass.pDepthStencilAttachment = &attach;
11589 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11590 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11592 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011593 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11594 m_errorMonitor->VerifyFound();
11595 // error w/ non-ds opt or GENERAL layout for color attachment
11596 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11598 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
11599 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011600 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11601 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011602 // For this error we need a valid renderpass so create default one
11603 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11604 attach.attachment = 0;
11605 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
11606 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11607 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11608 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
11609 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11610 // Can't do a CLEAR load on READ_ONLY initialLayout
11611 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11612 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11613 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011614 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11615 " with invalid first layout "
11616 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
11617 "ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060011618 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11619 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011620
Cort3b021012016-12-07 12:00:57 -080011621 vkFreeMemory(m_device->device(), src_image_mem, NULL);
11622 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
11623 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011624 vkDestroyImage(m_device->device(), src_image, NULL);
11625 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080011626 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011627}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060011628
Tobin Ehlise0936662016-10-11 08:10:51 -060011629TEST_F(VkLayerTest, InvalidStorageImageLayout) {
11630 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
11631 VkResult err;
11632
11633 ASSERT_NO_FATAL_FAILURE(InitState());
11634
11635 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
11636 VkImageTiling tiling;
11637 VkFormatProperties format_properties;
11638 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
11639 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
11640 tiling = VK_IMAGE_TILING_LINEAR;
11641 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
11642 tiling = VK_IMAGE_TILING_OPTIMAL;
11643 } else {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011644 printf(
11645 "Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
11646 "skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060011647 return;
11648 }
11649
11650 VkDescriptorPoolSize ds_type = {};
11651 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11652 ds_type.descriptorCount = 1;
11653
11654 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11655 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11656 ds_pool_ci.maxSets = 1;
11657 ds_pool_ci.poolSizeCount = 1;
11658 ds_pool_ci.pPoolSizes = &ds_type;
11659 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
11660
11661 VkDescriptorPool ds_pool;
11662 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11663 ASSERT_VK_SUCCESS(err);
11664
11665 VkDescriptorSetLayoutBinding dsl_binding = {};
11666 dsl_binding.binding = 0;
11667 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11668 dsl_binding.descriptorCount = 1;
11669 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11670 dsl_binding.pImmutableSamplers = NULL;
11671
11672 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11673 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11674 ds_layout_ci.pNext = NULL;
11675 ds_layout_ci.bindingCount = 1;
11676 ds_layout_ci.pBindings = &dsl_binding;
11677
11678 VkDescriptorSetLayout ds_layout;
11679 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11680 ASSERT_VK_SUCCESS(err);
11681
11682 VkDescriptorSetAllocateInfo alloc_info = {};
11683 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11684 alloc_info.descriptorSetCount = 1;
11685 alloc_info.descriptorPool = ds_pool;
11686 alloc_info.pSetLayouts = &ds_layout;
11687 VkDescriptorSet descriptor_set;
11688 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11689 ASSERT_VK_SUCCESS(err);
11690
11691 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11692 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11693 pipeline_layout_ci.pNext = NULL;
11694 pipeline_layout_ci.setLayoutCount = 1;
11695 pipeline_layout_ci.pSetLayouts = &ds_layout;
11696 VkPipelineLayout pipeline_layout;
11697 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11698 ASSERT_VK_SUCCESS(err);
11699
11700 VkImageObj image(m_device);
11701 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
11702 ASSERT_TRUE(image.initialized());
11703 VkImageView view = image.targetView(tex_format);
11704
11705 VkDescriptorImageInfo image_info = {};
11706 image_info.imageView = view;
11707 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11708
11709 VkWriteDescriptorSet descriptor_write = {};
11710 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11711 descriptor_write.dstSet = descriptor_set;
11712 descriptor_write.dstBinding = 0;
11713 descriptor_write.descriptorCount = 1;
11714 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11715 descriptor_write.pImageInfo = &image_info;
11716
11717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11718 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
11719 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
11720 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11721 m_errorMonitor->VerifyFound();
11722
11723 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11724 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11725 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
11726 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11727}
11728
Mark Mueller93b938f2016-08-18 10:27:40 -060011729TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011730 TEST_DESCRIPTION(
11731 "Use vkCmdExecuteCommands with invalid state "
11732 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060011733
11734 ASSERT_NO_FATAL_FAILURE(InitState());
11735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11736
Mike Weiblen95dd0f92016-10-19 12:28:27 -060011737 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011738 const char *simultaneous_use_message2 =
11739 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
11740 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060011741
11742 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011743 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060011744 command_buffer_allocate_info.commandPool = m_commandPool;
11745 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
11746 command_buffer_allocate_info.commandBufferCount = 1;
11747
11748 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011749 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060011750 VkCommandBufferBeginInfo command_buffer_begin_info = {};
11751 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011752 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060011753 command_buffer_inheritance_info.renderPass = m_renderPass;
11754 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011755
Mark Mueller93b938f2016-08-18 10:27:40 -060011756 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011757 command_buffer_begin_info.flags =
11758 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011759 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
11760
11761 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
11762 vkEndCommandBuffer(secondary_command_buffer);
11763
Mark Mueller93b938f2016-08-18 10:27:40 -060011764 VkSubmitInfo submit_info = {};
11765 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11766 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011767 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060011768
Mark Mueller4042b652016-09-05 22:52:21 -060011769 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011770 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
11771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
11772 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011773 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011774 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011775 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11776 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060011777
Dave Houltonfbf52152017-01-06 12:55:29 -070011778 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060011779 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070011780 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060011781
Mark Mueller4042b652016-09-05 22:52:21 -060011782 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011783 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011784 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060011785
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
11787 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011788 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011789 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11790 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011791
11792 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller93b938f2016-08-18 10:27:40 -060011793}
11794
Tony Barbour626994c2017-02-08 15:29:37 -070011795TEST_F(VkLayerTest, SimultaneousUseOneShot) {
11796 TEST_DESCRIPTION(
11797 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
11798 "errors");
11799 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
11800 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
11801 ASSERT_NO_FATAL_FAILURE(InitState());
11802
11803 VkCommandBuffer cmd_bufs[2];
11804 VkCommandBufferAllocateInfo alloc_info;
11805 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
11806 alloc_info.pNext = NULL;
11807 alloc_info.commandBufferCount = 2;
11808 alloc_info.commandPool = m_commandPool;
11809 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
11810 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
11811
11812 VkCommandBufferBeginInfo cb_binfo;
11813 cb_binfo.pNext = NULL;
11814 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11815 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
11816 cb_binfo.flags = 0;
11817 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
11818 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11819 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
11820 vkEndCommandBuffer(cmd_bufs[0]);
11821 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
11822
11823 VkSubmitInfo submit_info = {};
11824 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11825 submit_info.commandBufferCount = 2;
11826 submit_info.pCommandBuffers = duplicates;
11827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
11828 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11829 m_errorMonitor->VerifyFound();
11830 vkQueueWaitIdle(m_device->m_queue);
11831
11832 // Set one time use and now look for one time submit
11833 duplicates[0] = duplicates[1] = cmd_bufs[1];
11834 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
11835 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
11836 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
11837 vkEndCommandBuffer(cmd_bufs[1]);
11838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
11839 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11840 m_errorMonitor->VerifyFound();
11841 vkQueueWaitIdle(m_device->m_queue);
11842}
11843
Tobin Ehlisb093da82017-01-19 12:05:27 -070011844TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011845 TEST_DESCRIPTION(
11846 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
11847 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070011848
11849 ASSERT_NO_FATAL_FAILURE(InitState());
11850 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11851
11852 std::vector<const char *> device_extension_names;
11853 auto features = m_device->phy().features();
11854 // Make sure gs & ts are disabled
11855 features.geometryShader = false;
11856 features.tessellationShader = false;
11857 // The sacrificial device object
11858 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
11859
11860 VkCommandPoolCreateInfo pool_create_info{};
11861 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
11862 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
11863
11864 VkCommandPool command_pool;
11865 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
11866
11867 VkCommandBufferAllocateInfo cmd = {};
11868 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
11869 cmd.pNext = NULL;
11870 cmd.commandPool = command_pool;
11871 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
11872 cmd.commandBufferCount = 1;
11873
11874 VkCommandBuffer cmd_buffer;
11875 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
11876 ASSERT_VK_SUCCESS(err);
11877
11878 VkEvent event;
11879 VkEventCreateInfo evci = {};
11880 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11881 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
11882 ASSERT_VK_SUCCESS(result);
11883
11884 VkCommandBufferBeginInfo cbbi = {};
11885 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11886 vkBeginCommandBuffer(cmd_buffer, &cbbi);
11887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
11888 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
11889 m_errorMonitor->VerifyFound();
11890
11891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
11892 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
11893 m_errorMonitor->VerifyFound();
11894
11895 vkDestroyEvent(test_device.handle(), event, NULL);
11896 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
11897}
11898
Mark Mueller917f6bc2016-08-30 10:57:19 -060011899TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011900 TEST_DESCRIPTION(
11901 "Use vkCmdExecuteCommands with invalid state "
11902 "in primary and secondary command buffers. "
11903 "Delete objects that are inuse. Call VkQueueSubmit "
11904 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060011905
11906 ASSERT_NO_FATAL_FAILURE(InitState());
11907 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11908
Tony Barbour552f6c02016-12-21 14:34:07 -070011909 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060011910
11911 VkEvent event;
11912 VkEventCreateInfo event_create_info = {};
11913 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11914 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011915 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011916
Tony Barbour552f6c02016-12-21 14:34:07 -070011917 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060011918 vkDestroyEvent(m_device->device(), event, nullptr);
11919
11920 VkSubmitInfo submit_info = {};
11921 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11922 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011923 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Jeremy Hayes1b082d72017-01-27 11:34:28 -070011924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted event 0x");
11925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You are submitting command buffer 0x");
Mark Muellerc8d441e2016-08-23 17:36:00 -060011926 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11927 m_errorMonitor->VerifyFound();
11928
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011929 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060011930 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
11931
11932 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11933
Mark Mueller917f6bc2016-08-30 10:57:19 -060011934 VkSemaphoreCreateInfo semaphore_create_info = {};
11935 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
11936 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011937 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011938 VkFenceCreateInfo fence_create_info = {};
11939 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
11940 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011941 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011942
11943 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011944 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011945 descriptor_pool_type_count.descriptorCount = 1;
11946
11947 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
11948 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11949 descriptor_pool_create_info.maxSets = 1;
11950 descriptor_pool_create_info.poolSizeCount = 1;
11951 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011952 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011953
11954 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011955 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011956
11957 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011958 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011959 descriptorset_layout_binding.descriptorCount = 1;
11960 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
11961
11962 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011963 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011964 descriptorset_layout_create_info.bindingCount = 1;
11965 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
11966
11967 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011968 ASSERT_VK_SUCCESS(
11969 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011970
11971 VkDescriptorSet descriptorset;
11972 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011973 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011974 descriptorset_allocate_info.descriptorSetCount = 1;
11975 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
11976 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011977 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011978
Mark Mueller4042b652016-09-05 22:52:21 -060011979 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
11980
11981 VkDescriptorBufferInfo buffer_info = {};
11982 buffer_info.buffer = buffer_test.GetBuffer();
11983 buffer_info.offset = 0;
11984 buffer_info.range = 1024;
11985
11986 VkWriteDescriptorSet write_descriptor_set = {};
11987 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11988 write_descriptor_set.dstSet = descriptorset;
11989 write_descriptor_set.descriptorCount = 1;
11990 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11991 write_descriptor_set.pBufferInfo = &buffer_info;
11992
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011993 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060011994
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011995 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11996 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011997
11998 VkPipelineObj pipe(m_device);
11999 pipe.AddColorAttachment();
12000 pipe.AddShader(&vs);
12001 pipe.AddShader(&fs);
12002
12003 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012004 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012005 pipeline_layout_create_info.setLayoutCount = 1;
12006 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12007
12008 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012009 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012010
12011 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12012
Tony Barbour552f6c02016-12-21 14:34:07 -070012013 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012014 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012015
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012016 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12017 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12018 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012019
Tony Barbour552f6c02016-12-21 14:34:07 -070012020 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012021
Mark Mueller917f6bc2016-08-30 10:57:19 -060012022 submit_info.signalSemaphoreCount = 1;
12023 submit_info.pSignalSemaphores = &semaphore;
12024 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012025 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012026
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012028 vkDestroyEvent(m_device->device(), event, nullptr);
12029 m_errorMonitor->VerifyFound();
12030
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012032 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12033 m_errorMonitor->VerifyFound();
12034
Jeremy Hayes08369882017-02-02 10:31:06 -070012035 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012036 vkDestroyFence(m_device->device(), fence, nullptr);
12037 m_errorMonitor->VerifyFound();
12038
Tobin Ehlis122207b2016-09-01 08:50:06 -070012039 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012040 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12041 vkDestroyFence(m_device->device(), fence, nullptr);
12042 vkDestroyEvent(m_device->device(), event, nullptr);
12043 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012044 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012045 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12046}
12047
Tobin Ehlis2adda372016-09-01 08:51:06 -070012048TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12049 TEST_DESCRIPTION("Delete in-use query pool.");
12050
12051 ASSERT_NO_FATAL_FAILURE(InitState());
12052 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12053
12054 VkQueryPool query_pool;
12055 VkQueryPoolCreateInfo query_pool_ci{};
12056 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12057 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12058 query_pool_ci.queryCount = 1;
12059 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012060 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012061 // Reset query pool to create binding with cmd buffer
12062 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12063
Tony Barbour552f6c02016-12-21 14:34:07 -070012064 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012065
12066 VkSubmitInfo submit_info = {};
12067 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12068 submit_info.commandBufferCount = 1;
12069 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12070 // Submit cmd buffer and then destroy query pool while in-flight
12071 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12072
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012074 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12075 m_errorMonitor->VerifyFound();
12076
12077 vkQueueWaitIdle(m_device->m_queue);
12078 // Now that cmd buffer done we can safely destroy query_pool
12079 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12080}
12081
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012082TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12083 TEST_DESCRIPTION("Delete in-use pipeline.");
12084
12085 ASSERT_NO_FATAL_FAILURE(InitState());
12086 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12087
12088 // Empty pipeline layout used for binding PSO
12089 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12090 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12091 pipeline_layout_ci.setLayoutCount = 0;
12092 pipeline_layout_ci.pSetLayouts = NULL;
12093
12094 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012095 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012096 ASSERT_VK_SUCCESS(err);
12097
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012099 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012100 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12101 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012102 // Store pipeline handle so we can actually delete it before test finishes
12103 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012104 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012105 VkPipelineObj pipe(m_device);
12106 pipe.AddShader(&vs);
12107 pipe.AddShader(&fs);
12108 pipe.AddColorAttachment();
12109 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12110 delete_this_pipeline = pipe.handle();
12111
Tony Barbour552f6c02016-12-21 14:34:07 -070012112 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012113 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012114 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012115
Tony Barbour552f6c02016-12-21 14:34:07 -070012116 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012117
12118 VkSubmitInfo submit_info = {};
12119 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12120 submit_info.commandBufferCount = 1;
12121 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12122 // Submit cmd buffer and then pipeline destroyed while in-flight
12123 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012124 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012125 m_errorMonitor->VerifyFound();
12126 // Make sure queue finished and then actually delete pipeline
12127 vkQueueWaitIdle(m_device->m_queue);
12128 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12129 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12130}
12131
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012132TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12133 TEST_DESCRIPTION("Delete in-use imageView.");
12134
12135 ASSERT_NO_FATAL_FAILURE(InitState());
12136 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12137
12138 VkDescriptorPoolSize ds_type_count;
12139 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12140 ds_type_count.descriptorCount = 1;
12141
12142 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12143 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12144 ds_pool_ci.maxSets = 1;
12145 ds_pool_ci.poolSizeCount = 1;
12146 ds_pool_ci.pPoolSizes = &ds_type_count;
12147
12148 VkDescriptorPool ds_pool;
12149 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12150 ASSERT_VK_SUCCESS(err);
12151
12152 VkSamplerCreateInfo sampler_ci = {};
12153 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12154 sampler_ci.pNext = NULL;
12155 sampler_ci.magFilter = VK_FILTER_NEAREST;
12156 sampler_ci.minFilter = VK_FILTER_NEAREST;
12157 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12158 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12159 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12160 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12161 sampler_ci.mipLodBias = 1.0;
12162 sampler_ci.anisotropyEnable = VK_FALSE;
12163 sampler_ci.maxAnisotropy = 1;
12164 sampler_ci.compareEnable = VK_FALSE;
12165 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12166 sampler_ci.minLod = 1.0;
12167 sampler_ci.maxLod = 1.0;
12168 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12169 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12170 VkSampler sampler;
12171
12172 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12173 ASSERT_VK_SUCCESS(err);
12174
12175 VkDescriptorSetLayoutBinding layout_binding;
12176 layout_binding.binding = 0;
12177 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12178 layout_binding.descriptorCount = 1;
12179 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12180 layout_binding.pImmutableSamplers = NULL;
12181
12182 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12183 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12184 ds_layout_ci.bindingCount = 1;
12185 ds_layout_ci.pBindings = &layout_binding;
12186 VkDescriptorSetLayout ds_layout;
12187 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12188 ASSERT_VK_SUCCESS(err);
12189
12190 VkDescriptorSetAllocateInfo alloc_info = {};
12191 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12192 alloc_info.descriptorSetCount = 1;
12193 alloc_info.descriptorPool = ds_pool;
12194 alloc_info.pSetLayouts = &ds_layout;
12195 VkDescriptorSet descriptor_set;
12196 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12197 ASSERT_VK_SUCCESS(err);
12198
12199 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12200 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12201 pipeline_layout_ci.pNext = NULL;
12202 pipeline_layout_ci.setLayoutCount = 1;
12203 pipeline_layout_ci.pSetLayouts = &ds_layout;
12204
12205 VkPipelineLayout pipeline_layout;
12206 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12207 ASSERT_VK_SUCCESS(err);
12208
12209 VkImageObj image(m_device);
12210 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12211 ASSERT_TRUE(image.initialized());
12212
12213 VkImageView view;
12214 VkImageViewCreateInfo ivci = {};
12215 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12216 ivci.image = image.handle();
12217 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12218 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12219 ivci.subresourceRange.layerCount = 1;
12220 ivci.subresourceRange.baseMipLevel = 0;
12221 ivci.subresourceRange.levelCount = 1;
12222 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12223
12224 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12225 ASSERT_VK_SUCCESS(err);
12226
12227 VkDescriptorImageInfo image_info{};
12228 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12229 image_info.imageView = view;
12230 image_info.sampler = sampler;
12231
12232 VkWriteDescriptorSet descriptor_write = {};
12233 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12234 descriptor_write.dstSet = descriptor_set;
12235 descriptor_write.dstBinding = 0;
12236 descriptor_write.descriptorCount = 1;
12237 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12238 descriptor_write.pImageInfo = &image_info;
12239
12240 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12241
12242 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012243 char const *vsSource =
12244 "#version 450\n"
12245 "\n"
12246 "out gl_PerVertex { \n"
12247 " vec4 gl_Position;\n"
12248 "};\n"
12249 "void main(){\n"
12250 " gl_Position = vec4(1);\n"
12251 "}\n";
12252 char const *fsSource =
12253 "#version 450\n"
12254 "\n"
12255 "layout(set=0, binding=0) uniform sampler2D s;\n"
12256 "layout(location=0) out vec4 x;\n"
12257 "void main(){\n"
12258 " x = texture(s, vec2(1));\n"
12259 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012260 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12261 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12262 VkPipelineObj pipe(m_device);
12263 pipe.AddShader(&vs);
12264 pipe.AddShader(&fs);
12265 pipe.AddColorAttachment();
12266 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12267
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012269
Tony Barbour552f6c02016-12-21 14:34:07 -070012270 m_commandBuffer->BeginCommandBuffer();
12271 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012272 // Bind pipeline to cmd buffer
12273 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12274 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12275 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012276
12277 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12278 VkRect2D scissor = {{0, 0}, {16, 16}};
12279 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12280 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12281
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012282 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012283 m_commandBuffer->EndRenderPass();
12284 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012285 // Submit cmd buffer then destroy sampler
12286 VkSubmitInfo submit_info = {};
12287 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12288 submit_info.commandBufferCount = 1;
12289 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12290 // Submit cmd buffer and then destroy imageView while in-flight
12291 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12292
12293 vkDestroyImageView(m_device->device(), view, nullptr);
12294 m_errorMonitor->VerifyFound();
12295 vkQueueWaitIdle(m_device->m_queue);
12296 // Now we can actually destroy imageView
12297 vkDestroyImageView(m_device->device(), view, NULL);
12298 vkDestroySampler(m_device->device(), sampler, nullptr);
12299 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12300 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12301 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12302}
12303
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012304TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12305 TEST_DESCRIPTION("Delete in-use bufferView.");
12306
12307 ASSERT_NO_FATAL_FAILURE(InitState());
12308 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12309
12310 VkDescriptorPoolSize ds_type_count;
12311 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12312 ds_type_count.descriptorCount = 1;
12313
12314 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12315 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12316 ds_pool_ci.maxSets = 1;
12317 ds_pool_ci.poolSizeCount = 1;
12318 ds_pool_ci.pPoolSizes = &ds_type_count;
12319
12320 VkDescriptorPool ds_pool;
12321 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12322 ASSERT_VK_SUCCESS(err);
12323
12324 VkDescriptorSetLayoutBinding layout_binding;
12325 layout_binding.binding = 0;
12326 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12327 layout_binding.descriptorCount = 1;
12328 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12329 layout_binding.pImmutableSamplers = NULL;
12330
12331 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12332 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12333 ds_layout_ci.bindingCount = 1;
12334 ds_layout_ci.pBindings = &layout_binding;
12335 VkDescriptorSetLayout ds_layout;
12336 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12337 ASSERT_VK_SUCCESS(err);
12338
12339 VkDescriptorSetAllocateInfo alloc_info = {};
12340 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12341 alloc_info.descriptorSetCount = 1;
12342 alloc_info.descriptorPool = ds_pool;
12343 alloc_info.pSetLayouts = &ds_layout;
12344 VkDescriptorSet descriptor_set;
12345 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12346 ASSERT_VK_SUCCESS(err);
12347
12348 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12349 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12350 pipeline_layout_ci.pNext = NULL;
12351 pipeline_layout_ci.setLayoutCount = 1;
12352 pipeline_layout_ci.pSetLayouts = &ds_layout;
12353
12354 VkPipelineLayout pipeline_layout;
12355 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12356 ASSERT_VK_SUCCESS(err);
12357
12358 VkBuffer buffer;
12359 uint32_t queue_family_index = 0;
12360 VkBufferCreateInfo buffer_create_info = {};
12361 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12362 buffer_create_info.size = 1024;
12363 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12364 buffer_create_info.queueFamilyIndexCount = 1;
12365 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12366
12367 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12368 ASSERT_VK_SUCCESS(err);
12369
12370 VkMemoryRequirements memory_reqs;
12371 VkDeviceMemory buffer_memory;
12372
12373 VkMemoryAllocateInfo memory_info = {};
12374 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12375 memory_info.allocationSize = 0;
12376 memory_info.memoryTypeIndex = 0;
12377
12378 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12379 memory_info.allocationSize = memory_reqs.size;
12380 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12381 ASSERT_TRUE(pass);
12382
12383 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12384 ASSERT_VK_SUCCESS(err);
12385 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12386 ASSERT_VK_SUCCESS(err);
12387
12388 VkBufferView view;
12389 VkBufferViewCreateInfo bvci = {};
12390 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12391 bvci.buffer = buffer;
12392 bvci.format = VK_FORMAT_R8_UNORM;
12393 bvci.range = VK_WHOLE_SIZE;
12394
12395 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12396 ASSERT_VK_SUCCESS(err);
12397
12398 VkWriteDescriptorSet descriptor_write = {};
12399 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12400 descriptor_write.dstSet = descriptor_set;
12401 descriptor_write.dstBinding = 0;
12402 descriptor_write.descriptorCount = 1;
12403 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12404 descriptor_write.pTexelBufferView = &view;
12405
12406 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12407
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012408 char const *vsSource =
12409 "#version 450\n"
12410 "\n"
12411 "out gl_PerVertex { \n"
12412 " vec4 gl_Position;\n"
12413 "};\n"
12414 "void main(){\n"
12415 " gl_Position = vec4(1);\n"
12416 "}\n";
12417 char const *fsSource =
12418 "#version 450\n"
12419 "\n"
12420 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12421 "layout(location=0) out vec4 x;\n"
12422 "void main(){\n"
12423 " x = imageLoad(s, 0);\n"
12424 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012425 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12426 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12427 VkPipelineObj pipe(m_device);
12428 pipe.AddShader(&vs);
12429 pipe.AddShader(&fs);
12430 pipe.AddColorAttachment();
12431 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12432
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012434
Tony Barbour552f6c02016-12-21 14:34:07 -070012435 m_commandBuffer->BeginCommandBuffer();
12436 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012437 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12438 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12439 VkRect2D scissor = {{0, 0}, {16, 16}};
12440 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12441 // Bind pipeline to cmd buffer
12442 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12443 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12444 &descriptor_set, 0, nullptr);
12445 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012446 m_commandBuffer->EndRenderPass();
12447 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012448
12449 VkSubmitInfo submit_info = {};
12450 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12451 submit_info.commandBufferCount = 1;
12452 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12453 // Submit cmd buffer and then destroy bufferView while in-flight
12454 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12455
12456 vkDestroyBufferView(m_device->device(), view, nullptr);
12457 m_errorMonitor->VerifyFound();
12458 vkQueueWaitIdle(m_device->m_queue);
12459 // Now we can actually destroy bufferView
12460 vkDestroyBufferView(m_device->device(), view, NULL);
12461 vkDestroyBuffer(m_device->device(), buffer, NULL);
12462 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12463 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12464 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12465 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12466}
12467
Tobin Ehlis209532e2016-09-07 13:52:18 -060012468TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12469 TEST_DESCRIPTION("Delete in-use sampler.");
12470
12471 ASSERT_NO_FATAL_FAILURE(InitState());
12472 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12473
12474 VkDescriptorPoolSize ds_type_count;
12475 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12476 ds_type_count.descriptorCount = 1;
12477
12478 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12479 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12480 ds_pool_ci.maxSets = 1;
12481 ds_pool_ci.poolSizeCount = 1;
12482 ds_pool_ci.pPoolSizes = &ds_type_count;
12483
12484 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012485 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012486 ASSERT_VK_SUCCESS(err);
12487
12488 VkSamplerCreateInfo sampler_ci = {};
12489 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12490 sampler_ci.pNext = NULL;
12491 sampler_ci.magFilter = VK_FILTER_NEAREST;
12492 sampler_ci.minFilter = VK_FILTER_NEAREST;
12493 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12494 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12495 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12496 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12497 sampler_ci.mipLodBias = 1.0;
12498 sampler_ci.anisotropyEnable = VK_FALSE;
12499 sampler_ci.maxAnisotropy = 1;
12500 sampler_ci.compareEnable = VK_FALSE;
12501 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12502 sampler_ci.minLod = 1.0;
12503 sampler_ci.maxLod = 1.0;
12504 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12505 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12506 VkSampler sampler;
12507
12508 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12509 ASSERT_VK_SUCCESS(err);
12510
12511 VkDescriptorSetLayoutBinding layout_binding;
12512 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012513 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012514 layout_binding.descriptorCount = 1;
12515 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12516 layout_binding.pImmutableSamplers = NULL;
12517
12518 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12519 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12520 ds_layout_ci.bindingCount = 1;
12521 ds_layout_ci.pBindings = &layout_binding;
12522 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012523 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012524 ASSERT_VK_SUCCESS(err);
12525
12526 VkDescriptorSetAllocateInfo alloc_info = {};
12527 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12528 alloc_info.descriptorSetCount = 1;
12529 alloc_info.descriptorPool = ds_pool;
12530 alloc_info.pSetLayouts = &ds_layout;
12531 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012532 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012533 ASSERT_VK_SUCCESS(err);
12534
12535 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12536 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12537 pipeline_layout_ci.pNext = NULL;
12538 pipeline_layout_ci.setLayoutCount = 1;
12539 pipeline_layout_ci.pSetLayouts = &ds_layout;
12540
12541 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012542 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012543 ASSERT_VK_SUCCESS(err);
12544
12545 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012546 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 -060012547 ASSERT_TRUE(image.initialized());
12548
12549 VkImageView view;
12550 VkImageViewCreateInfo ivci = {};
12551 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12552 ivci.image = image.handle();
12553 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12554 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12555 ivci.subresourceRange.layerCount = 1;
12556 ivci.subresourceRange.baseMipLevel = 0;
12557 ivci.subresourceRange.levelCount = 1;
12558 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12559
12560 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12561 ASSERT_VK_SUCCESS(err);
12562
12563 VkDescriptorImageInfo image_info{};
12564 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12565 image_info.imageView = view;
12566 image_info.sampler = sampler;
12567
12568 VkWriteDescriptorSet descriptor_write = {};
12569 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12570 descriptor_write.dstSet = descriptor_set;
12571 descriptor_write.dstBinding = 0;
12572 descriptor_write.descriptorCount = 1;
12573 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12574 descriptor_write.pImageInfo = &image_info;
12575
12576 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12577
12578 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012579 char const *vsSource =
12580 "#version 450\n"
12581 "\n"
12582 "out gl_PerVertex { \n"
12583 " vec4 gl_Position;\n"
12584 "};\n"
12585 "void main(){\n"
12586 " gl_Position = vec4(1);\n"
12587 "}\n";
12588 char const *fsSource =
12589 "#version 450\n"
12590 "\n"
12591 "layout(set=0, binding=0) uniform sampler2D s;\n"
12592 "layout(location=0) out vec4 x;\n"
12593 "void main(){\n"
12594 " x = texture(s, vec2(1));\n"
12595 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060012596 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12597 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12598 VkPipelineObj pipe(m_device);
12599 pipe.AddShader(&vs);
12600 pipe.AddShader(&fs);
12601 pipe.AddColorAttachment();
12602 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12603
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012605
Tony Barbour552f6c02016-12-21 14:34:07 -070012606 m_commandBuffer->BeginCommandBuffer();
12607 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012608 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012609 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12610 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12611 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070012612
12613 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12614 VkRect2D scissor = {{0, 0}, {16, 16}};
12615 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12616 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12617
Tobin Ehlis209532e2016-09-07 13:52:18 -060012618 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012619 m_commandBuffer->EndRenderPass();
12620 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060012621 // Submit cmd buffer then destroy sampler
12622 VkSubmitInfo submit_info = {};
12623 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12624 submit_info.commandBufferCount = 1;
12625 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12626 // Submit cmd buffer and then destroy sampler while in-flight
12627 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12628
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012629 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060012630 m_errorMonitor->VerifyFound();
12631 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070012632
Tobin Ehlis209532e2016-09-07 13:52:18 -060012633 // Now we can actually destroy sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012634 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060012635 vkDestroyImageView(m_device->device(), view, NULL);
12636 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12637 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12638 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12639}
12640
Mark Mueller1cd9f412016-08-25 13:23:52 -060012641TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012642 TEST_DESCRIPTION(
12643 "Call VkQueueSubmit with a semaphore that is already "
12644 "signaled but not waited on by the queue. Wait on a "
12645 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060012646
12647 ASSERT_NO_FATAL_FAILURE(InitState());
12648 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12649
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012650 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 -070012651 const char *invalid_fence_wait_message =
12652 " which has not been submitted on a Queue or during "
12653 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060012654
Tony Barbour552f6c02016-12-21 14:34:07 -070012655 m_commandBuffer->BeginCommandBuffer();
12656 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060012657
12658 VkSemaphoreCreateInfo semaphore_create_info = {};
12659 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12660 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012661 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060012662 VkSubmitInfo submit_info = {};
12663 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12664 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012665 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060012666 submit_info.signalSemaphoreCount = 1;
12667 submit_info.pSignalSemaphores = &semaphore;
12668 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012669 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060012670 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070012671 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070012672 m_commandBuffer->BeginCommandBuffer();
12673 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060012675 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12676 m_errorMonitor->VerifyFound();
12677
Mark Mueller1cd9f412016-08-25 13:23:52 -060012678 VkFenceCreateInfo fence_create_info = {};
12679 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12680 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012681 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060012682
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060012684 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
12685 m_errorMonitor->VerifyFound();
12686
Mark Mueller4042b652016-09-05 22:52:21 -060012687 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060012688 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060012689 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12690}
12691
Tobin Ehlis4af23302016-07-19 10:50:30 -060012692TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012693 TEST_DESCRIPTION(
12694 "Bind a secondary command buffer with with a framebuffer "
12695 "that does not match the framebuffer for the active "
12696 "renderpass.");
Tobin Ehlis4af23302016-07-19 10:50:30 -060012697 ASSERT_NO_FATAL_FAILURE(InitState());
12698 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12699
12700 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012701 VkAttachmentDescription attachment = {0,
12702 VK_FORMAT_B8G8R8A8_UNORM,
12703 VK_SAMPLE_COUNT_1_BIT,
12704 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12705 VK_ATTACHMENT_STORE_OP_STORE,
12706 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12707 VK_ATTACHMENT_STORE_OP_DONT_CARE,
12708 VK_IMAGE_LAYOUT_UNDEFINED,
12709 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012710
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012711 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012712
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012713 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012714
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012715 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012716
12717 VkRenderPass rp;
12718 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
12719 ASSERT_VK_SUCCESS(err);
12720
12721 // A compatible framebuffer.
12722 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012723 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 -060012724 ASSERT_TRUE(image.initialized());
12725
12726 VkImageViewCreateInfo ivci = {
12727 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
12728 nullptr,
12729 0,
12730 image.handle(),
12731 VK_IMAGE_VIEW_TYPE_2D,
12732 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012733 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
12734 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060012735 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
12736 };
12737 VkImageView view;
12738 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
12739 ASSERT_VK_SUCCESS(err);
12740
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012741 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012742 VkFramebuffer fb;
12743 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
12744 ASSERT_VK_SUCCESS(err);
12745
12746 VkCommandBufferAllocateInfo cbai = {};
12747 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12748 cbai.commandPool = m_commandPool;
12749 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12750 cbai.commandBufferCount = 1;
12751
12752 VkCommandBuffer sec_cb;
12753 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
12754 ASSERT_VK_SUCCESS(err);
12755 VkCommandBufferBeginInfo cbbi = {};
12756 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130012757 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060012758 cbii.renderPass = renderPass();
12759 cbii.framebuffer = fb;
12760 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12761 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012762 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 -060012763 cbbi.pInheritanceInfo = &cbii;
12764 vkBeginCommandBuffer(sec_cb, &cbbi);
12765 vkEndCommandBuffer(sec_cb);
12766
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012767 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120012768 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
12769 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060012770
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060012772 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060012773 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
12774 m_errorMonitor->VerifyFound();
12775 // Cleanup
12776 vkDestroyImageView(m_device->device(), view, NULL);
12777 vkDestroyRenderPass(m_device->device(), rp, NULL);
12778 vkDestroyFramebuffer(m_device->device(), fb, NULL);
12779}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012780
12781TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012782 TEST_DESCRIPTION(
12783 "If logicOp is available on the device, set it to an "
12784 "invalid value. If logicOp is not available, attempt to "
12785 "use it and verify that we see the correct error.");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012786 ASSERT_NO_FATAL_FAILURE(InitState());
12787 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12788
12789 auto features = m_device->phy().features();
12790 // Set the expected error depending on whether or not logicOp available
12791 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12793 "If logic operations feature not "
12794 "enabled, logicOpEnable must be "
12795 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012796 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130012797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012798 }
12799 // Create a pipeline using logicOp
12800 VkResult err;
12801
12802 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12803 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12804
12805 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012806 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012807 ASSERT_VK_SUCCESS(err);
12808
12809 VkPipelineViewportStateCreateInfo vp_state_ci = {};
12810 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12811 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012812 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012813 vp_state_ci.pViewports = &vp;
12814 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012815 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012816 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012817
12818 VkPipelineShaderStageCreateInfo shaderStages[2];
12819 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
12820
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012821 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12822 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012823 shaderStages[0] = vs.GetStageCreateInfo();
12824 shaderStages[1] = fs.GetStageCreateInfo();
12825
12826 VkPipelineVertexInputStateCreateInfo vi_ci = {};
12827 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12828
12829 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
12830 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12831 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12832
12833 VkPipelineRasterizationStateCreateInfo rs_ci = {};
12834 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130012835 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012836
12837 VkPipelineColorBlendAttachmentState att = {};
12838 att.blendEnable = VK_FALSE;
12839 att.colorWriteMask = 0xf;
12840
12841 VkPipelineColorBlendStateCreateInfo cb_ci = {};
12842 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12843 // Enable logicOp & set logicOp to value 1 beyond allowed entries
12844 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012845 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012846 cb_ci.attachmentCount = 1;
12847 cb_ci.pAttachments = &att;
12848
Chris Forbes8aeacbf2016-10-03 14:25:08 +130012849 VkPipelineMultisampleStateCreateInfo ms_ci = {};
12850 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12851 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12852
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012853 VkGraphicsPipelineCreateInfo gp_ci = {};
12854 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12855 gp_ci.stageCount = 2;
12856 gp_ci.pStages = shaderStages;
12857 gp_ci.pVertexInputState = &vi_ci;
12858 gp_ci.pInputAssemblyState = &ia_ci;
12859 gp_ci.pViewportState = &vp_state_ci;
12860 gp_ci.pRasterizationState = &rs_ci;
12861 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130012862 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012863 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12864 gp_ci.layout = pipeline_layout;
12865 gp_ci.renderPass = renderPass();
12866
12867 VkPipelineCacheCreateInfo pc_ci = {};
12868 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12869
12870 VkPipeline pipeline;
12871 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012872 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012873 ASSERT_VK_SUCCESS(err);
12874
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012875 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012876 m_errorMonitor->VerifyFound();
12877 if (VK_SUCCESS == err) {
12878 vkDestroyPipeline(m_device->device(), pipeline, NULL);
12879 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012880 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
12881 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12882}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012883
Mike Stroyanaccf7692015-05-12 16:00:45 -060012884#if GTEST_IS_THREADSAFE
12885struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012886 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012887 VkEvent event;
12888 bool bailout;
12889};
12890
Karl Schultz6addd812016-02-02 17:17:23 -070012891extern "C" void *AddToCommandBuffer(void *arg) {
12892 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012893
Mike Stroyana6d14942016-07-13 15:10:05 -060012894 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012895 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012896 if (data->bailout) {
12897 break;
12898 }
12899 }
12900 return NULL;
12901}
12902
Karl Schultz6addd812016-02-02 17:17:23 -070012903TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012904 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012905
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012906 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012907
Mike Stroyanaccf7692015-05-12 16:00:45 -060012908 ASSERT_NO_FATAL_FAILURE(InitState());
12909 ASSERT_NO_FATAL_FAILURE(InitViewport());
12910 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12911
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012912 // Calls AllocateCommandBuffers
12913 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012914
12915 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012916 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012917
12918 VkEventCreateInfo event_info;
12919 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012920 VkResult err;
12921
12922 memset(&event_info, 0, sizeof(event_info));
12923 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12924
Chia-I Wuf7458c52015-10-26 21:10:41 +080012925 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012926 ASSERT_VK_SUCCESS(err);
12927
Mike Stroyanaccf7692015-05-12 16:00:45 -060012928 err = vkResetEvent(device(), event);
12929 ASSERT_VK_SUCCESS(err);
12930
12931 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012932 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012933 data.event = event;
12934 data.bailout = false;
12935 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060012936
12937 // First do some correct operations using multiple threads.
12938 // Add many entries to command buffer from another thread.
12939 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
12940 // Make non-conflicting calls from this thread at the same time.
12941 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060012942 uint32_t count;
12943 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060012944 }
12945 test_platform_thread_join(thread, NULL);
12946
12947 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060012948 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012949 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012950 // Add many entries to command buffer from this thread at the same time.
12951 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012952
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012953 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012954 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012955
Mike Stroyan10b8cb72016-01-22 15:22:03 -070012956 m_errorMonitor->SetBailout(NULL);
12957
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012958 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012959
Chia-I Wuf7458c52015-10-26 21:10:41 +080012960 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012961}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012962#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012963
Karl Schultz6addd812016-02-02 17:17:23 -070012964TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012965 TEST_DESCRIPTION(
12966 "Test that an error is produced for a spirv module "
12967 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120012968
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012970
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012971 ASSERT_NO_FATAL_FAILURE(InitState());
12972 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12973
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012974 VkShaderModule module;
12975 VkShaderModuleCreateInfo moduleCreateInfo;
12976 struct icd_spv_header spv;
12977
12978 spv.magic = ICD_SPV_MAGIC;
12979 spv.version = ICD_SPV_VERSION;
12980 spv.gen_magic = 0;
12981
12982 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12983 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012984 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012985 moduleCreateInfo.codeSize = 4;
12986 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012987 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012988
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012989 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012990}
12991
Karl Schultz6addd812016-02-02 17:17:23 -070012992TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012993 TEST_DESCRIPTION(
12994 "Test that an error is produced for a spirv module "
12995 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120012996
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012998
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012999 ASSERT_NO_FATAL_FAILURE(InitState());
13000 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13001
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013002 VkShaderModule module;
13003 VkShaderModuleCreateInfo moduleCreateInfo;
13004 struct icd_spv_header spv;
13005
13006 spv.magic = ~ICD_SPV_MAGIC;
13007 spv.version = ICD_SPV_VERSION;
13008 spv.gen_magic = 0;
13009
13010 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13011 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013012 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013013 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13014 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013015 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013016
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013017 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013018}
13019
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013020#if 0
13021// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013022TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013024 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013025
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013026 ASSERT_NO_FATAL_FAILURE(InitState());
13027 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13028
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013029 VkShaderModule module;
13030 VkShaderModuleCreateInfo moduleCreateInfo;
13031 struct icd_spv_header spv;
13032
13033 spv.magic = ICD_SPV_MAGIC;
13034 spv.version = ~ICD_SPV_VERSION;
13035 spv.gen_magic = 0;
13036
13037 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13038 moduleCreateInfo.pNext = NULL;
13039
Karl Schultz6addd812016-02-02 17:17:23 -070013040 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013041 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13042 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013043 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013044
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013045 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013046}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013047#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013048
Karl Schultz6addd812016-02-02 17:17:23 -070013049TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013050 TEST_DESCRIPTION(
13051 "Test that a warning is produced for a vertex output that "
13052 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013054
Chris Forbes9f7ff632015-05-25 11:13:08 +120013055 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013056 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013057
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013058 char const *vsSource =
13059 "#version 450\n"
13060 "\n"
13061 "layout(location=0) out float x;\n"
13062 "out gl_PerVertex {\n"
13063 " vec4 gl_Position;\n"
13064 "};\n"
13065 "void main(){\n"
13066 " gl_Position = vec4(1);\n"
13067 " x = 0;\n"
13068 "}\n";
13069 char const *fsSource =
13070 "#version 450\n"
13071 "\n"
13072 "layout(location=0) out vec4 color;\n"
13073 "void main(){\n"
13074 " color = vec4(1);\n"
13075 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013076
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013077 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13078 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013079
13080 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013081 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013082 pipe.AddShader(&vs);
13083 pipe.AddShader(&fs);
13084
Chris Forbes9f7ff632015-05-25 11:13:08 +120013085 VkDescriptorSetObj descriptorSet(m_device);
13086 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013087 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013088
Tony Barbour5781e8f2015-08-04 16:23:11 -060013089 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013090
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013091 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013092}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013093
Mark Mueller098c9cb2016-09-08 09:01:57 -060013094TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13095 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13096
13097 ASSERT_NO_FATAL_FAILURE(InitState());
13098 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13099
13100 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013101 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013102
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013103 char const *vsSource =
13104 "#version 450\n"
13105 "\n"
13106 "out gl_PerVertex {\n"
13107 " vec4 gl_Position;\n"
13108 "};\n"
13109 "void main(){\n"
13110 " gl_Position = vec4(1);\n"
13111 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013112
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013113 char const *fsSource =
13114 "#version 450\n"
13115 "\n"
13116 "layout (constant_id = 0) const float r = 0.0f;\n"
13117 "layout(location = 0) out vec4 uFragColor;\n"
13118 "void main(){\n"
13119 " uFragColor = vec4(r,1,0,1);\n"
13120 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013121
13122 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13123 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13124
13125 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13126 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13127
13128 VkPipelineLayout pipeline_layout;
13129 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13130
13131 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13132 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13133 vp_state_create_info.viewportCount = 1;
13134 VkViewport viewport = {};
13135 vp_state_create_info.pViewports = &viewport;
13136 vp_state_create_info.scissorCount = 1;
13137 VkRect2D scissors = {};
13138 vp_state_create_info.pScissors = &scissors;
13139
13140 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13141
13142 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13143 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13144 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13145 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13146
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013147 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013148
13149 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13150 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13151
13152 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13153 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13154 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13155
13156 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13157 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13158 rasterization_state_create_info.pNext = nullptr;
13159 rasterization_state_create_info.lineWidth = 1.0f;
13160 rasterization_state_create_info.rasterizerDiscardEnable = true;
13161
13162 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13163 color_blend_attachment_state.blendEnable = VK_FALSE;
13164 color_blend_attachment_state.colorWriteMask = 0xf;
13165
13166 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13167 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13168 color_blend_state_create_info.attachmentCount = 1;
13169 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13170
13171 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13172 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13173 graphicspipe_create_info.stageCount = 2;
13174 graphicspipe_create_info.pStages = shader_stage_create_info;
13175 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13176 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13177 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13178 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13179 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13180 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13181 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13182 graphicspipe_create_info.layout = pipeline_layout;
13183 graphicspipe_create_info.renderPass = renderPass();
13184
13185 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13186 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13187
13188 VkPipelineCache pipelineCache;
13189 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13190
13191 // This structure maps constant ids to data locations.
13192 const VkSpecializationMapEntry entry =
13193 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013194 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013195
13196 uint32_t data = 1;
13197
13198 // Set up the info describing spec map and data
13199 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013200 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013201 };
13202 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13203
13204 VkPipeline pipeline;
13205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13206 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13207 m_errorMonitor->VerifyFound();
13208
13209 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13210 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13211}
13212
13213TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13214 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13215
13216 ASSERT_NO_FATAL_FAILURE(InitState());
13217 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13218
13219 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13220
13221 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13222 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13223 descriptor_pool_type_count[0].descriptorCount = 1;
13224 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13225 descriptor_pool_type_count[1].descriptorCount = 1;
13226
13227 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13228 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13229 descriptor_pool_create_info.maxSets = 1;
13230 descriptor_pool_create_info.poolSizeCount = 2;
13231 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13232 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13233
13234 VkDescriptorPool descriptorset_pool;
13235 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13236
13237 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13238 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13239 descriptorset_layout_binding.descriptorCount = 1;
13240 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
13241
13242 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13243 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13244 descriptorset_layout_create_info.bindingCount = 1;
13245 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13246
13247 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013248 ASSERT_VK_SUCCESS(
13249 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013250
13251 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13252 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13253 descriptorset_allocate_info.descriptorSetCount = 1;
13254 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13255 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13256 VkDescriptorSet descriptorset;
13257 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13258
13259 // Challenge core_validation with a non uniform buffer type.
13260 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13261
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013262 char const *vsSource =
13263 "#version 450\n"
13264 "\n"
13265 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13266 " mat4 mvp;\n"
13267 "} ubuf;\n"
13268 "out gl_PerVertex {\n"
13269 " vec4 gl_Position;\n"
13270 "};\n"
13271 "void main(){\n"
13272 " gl_Position = ubuf.mvp * vec4(1);\n"
13273 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013274
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013275 char const *fsSource =
13276 "#version 450\n"
13277 "\n"
13278 "layout(location = 0) out vec4 uFragColor;\n"
13279 "void main(){\n"
13280 " uFragColor = vec4(0,1,0,1);\n"
13281 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013282
13283 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13284 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13285
13286 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13287 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13288 pipeline_layout_create_info.setLayoutCount = 1;
13289 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13290
13291 VkPipelineLayout pipeline_layout;
13292 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13293
13294 VkPipelineObj pipe(m_device);
13295 pipe.AddColorAttachment();
13296 pipe.AddShader(&vs);
13297 pipe.AddShader(&fs);
13298
13299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13300 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13301 m_errorMonitor->VerifyFound();
13302
13303 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13304 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13305 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13306}
13307
13308TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13309 TEST_DESCRIPTION(
13310 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13311
13312 ASSERT_NO_FATAL_FAILURE(InitState());
13313 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13314
13315 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13316
13317 VkDescriptorPoolSize descriptor_pool_type_count = {};
13318 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13319 descriptor_pool_type_count.descriptorCount = 1;
13320
13321 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13322 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13323 descriptor_pool_create_info.maxSets = 1;
13324 descriptor_pool_create_info.poolSizeCount = 1;
13325 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13326 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13327
13328 VkDescriptorPool descriptorset_pool;
13329 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13330
13331 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13332 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13333 descriptorset_layout_binding.descriptorCount = 1;
13334 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13335 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13336
13337 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13338 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13339 descriptorset_layout_create_info.bindingCount = 1;
13340 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13341
13342 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013343 ASSERT_VK_SUCCESS(
13344 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013345
13346 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13347 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13348 descriptorset_allocate_info.descriptorSetCount = 1;
13349 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13350 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13351 VkDescriptorSet descriptorset;
13352 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13353
13354 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13355
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013356 char const *vsSource =
13357 "#version 450\n"
13358 "\n"
13359 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13360 " mat4 mvp;\n"
13361 "} ubuf;\n"
13362 "out gl_PerVertex {\n"
13363 " vec4 gl_Position;\n"
13364 "};\n"
13365 "void main(){\n"
13366 " gl_Position = ubuf.mvp * vec4(1);\n"
13367 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013368
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013369 char const *fsSource =
13370 "#version 450\n"
13371 "\n"
13372 "layout(location = 0) out vec4 uFragColor;\n"
13373 "void main(){\n"
13374 " uFragColor = vec4(0,1,0,1);\n"
13375 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013376
13377 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13378 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13379
13380 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13381 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13382 pipeline_layout_create_info.setLayoutCount = 1;
13383 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13384
13385 VkPipelineLayout pipeline_layout;
13386 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13387
13388 VkPipelineObj pipe(m_device);
13389 pipe.AddColorAttachment();
13390 pipe.AddShader(&vs);
13391 pipe.AddShader(&fs);
13392
13393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13394 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13395 m_errorMonitor->VerifyFound();
13396
13397 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13398 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13399 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13400}
13401
13402TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013403 TEST_DESCRIPTION(
13404 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13405 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013406
13407 ASSERT_NO_FATAL_FAILURE(InitState());
13408 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13409
13410 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013411 "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 -060013412
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013413 char const *vsSource =
13414 "#version 450\n"
13415 "\n"
13416 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13417 "out gl_PerVertex {\n"
13418 " vec4 gl_Position;\n"
13419 "};\n"
13420 "void main(){\n"
13421 " gl_Position = vec4(consts.x);\n"
13422 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013423
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013424 char const *fsSource =
13425 "#version 450\n"
13426 "\n"
13427 "layout(location = 0) out vec4 uFragColor;\n"
13428 "void main(){\n"
13429 " uFragColor = vec4(0,1,0,1);\n"
13430 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013431
13432 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13433 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13434
13435 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13436 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13437
13438 // Set up a push constant range
13439 VkPushConstantRange push_constant_ranges = {};
13440 // Set to the wrong stage to challenge core_validation
13441 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13442 push_constant_ranges.size = 4;
13443
13444 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13445 pipeline_layout_create_info.pushConstantRangeCount = 1;
13446
13447 VkPipelineLayout pipeline_layout;
13448 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13449
13450 VkPipelineObj pipe(m_device);
13451 pipe.AddColorAttachment();
13452 pipe.AddShader(&vs);
13453 pipe.AddShader(&fs);
13454
13455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13456 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13457 m_errorMonitor->VerifyFound();
13458
13459 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13460}
13461
13462TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13463 TEST_DESCRIPTION(
13464 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13465
13466 ASSERT_NO_FATAL_FAILURE(InitState());
13467 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13468
13469 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013470 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013471
13472 // Some awkward steps are required to test with custom device features.
13473 std::vector<const char *> device_extension_names;
13474 auto features = m_device->phy().features();
13475 // Disable support for 64 bit floats
13476 features.shaderFloat64 = false;
13477 // The sacrificial device object
13478 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13479
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013480 char const *vsSource =
13481 "#version 450\n"
13482 "\n"
13483 "out gl_PerVertex {\n"
13484 " vec4 gl_Position;\n"
13485 "};\n"
13486 "void main(){\n"
13487 " gl_Position = vec4(1);\n"
13488 "}\n";
13489 char const *fsSource =
13490 "#version 450\n"
13491 "\n"
13492 "layout(location=0) out vec4 color;\n"
13493 "void main(){\n"
13494 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13495 " color = vec4(green);\n"
13496 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013497
13498 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13499 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13500
13501 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013502
13503 VkPipelineObj pipe(&test_device);
13504 pipe.AddColorAttachment();
13505 pipe.AddShader(&vs);
13506 pipe.AddShader(&fs);
13507
13508 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13509 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13510 VkPipelineLayout pipeline_layout;
13511 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13512
13513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13514 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13515 m_errorMonitor->VerifyFound();
13516
13517 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13518}
13519
13520TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
13521 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
13522
13523 ASSERT_NO_FATAL_FAILURE(InitState());
13524 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13525
13526 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
13527
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013528 char const *vsSource =
13529 "#version 450\n"
13530 "\n"
13531 "out gl_PerVertex {\n"
13532 " vec4 gl_Position;\n"
13533 "};\n"
13534 "layout(xfb_buffer = 1) out;"
13535 "void main(){\n"
13536 " gl_Position = vec4(1);\n"
13537 "}\n";
13538 char const *fsSource =
13539 "#version 450\n"
13540 "\n"
13541 "layout(location=0) out vec4 color;\n"
13542 "void main(){\n"
13543 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13544 " color = vec4(green);\n"
13545 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013546
13547 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13548 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13549
13550 VkPipelineObj pipe(m_device);
13551 pipe.AddColorAttachment();
13552 pipe.AddShader(&vs);
13553 pipe.AddShader(&fs);
13554
13555 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13556 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13557 VkPipelineLayout pipeline_layout;
13558 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13559
13560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
13561 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13562 m_errorMonitor->VerifyFound();
13563
13564 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13565}
13566
Karl Schultz6addd812016-02-02 17:17:23 -070013567TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013568 TEST_DESCRIPTION(
13569 "Test that an error is produced for a fragment shader input "
13570 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120013571
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013573
Chris Forbes59cb88d2015-05-25 11:13:13 +120013574 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013575 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013576
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013577 char const *vsSource =
13578 "#version 450\n"
13579 "\n"
13580 "out gl_PerVertex {\n"
13581 " vec4 gl_Position;\n"
13582 "};\n"
13583 "void main(){\n"
13584 " gl_Position = vec4(1);\n"
13585 "}\n";
13586 char const *fsSource =
13587 "#version 450\n"
13588 "\n"
13589 "layout(location=0) in float x;\n"
13590 "layout(location=0) out vec4 color;\n"
13591 "void main(){\n"
13592 " color = vec4(x);\n"
13593 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120013594
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013595 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13596 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013597
13598 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013599 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013600 pipe.AddShader(&vs);
13601 pipe.AddShader(&fs);
13602
Chris Forbes59cb88d2015-05-25 11:13:13 +120013603 VkDescriptorSetObj descriptorSet(m_device);
13604 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013605 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013606
Tony Barbour5781e8f2015-08-04 16:23:11 -060013607 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013608
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013609 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013610}
13611
Karl Schultz6addd812016-02-02 17:17:23 -070013612TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013613 TEST_DESCRIPTION(
13614 "Test that an error is produced for a fragment shader input "
13615 "within an interace block, which is not present in the outputs "
13616 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013618
13619 ASSERT_NO_FATAL_FAILURE(InitState());
13620 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13621
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013622 char const *vsSource =
13623 "#version 450\n"
13624 "\n"
13625 "out gl_PerVertex {\n"
13626 " vec4 gl_Position;\n"
13627 "};\n"
13628 "void main(){\n"
13629 " gl_Position = vec4(1);\n"
13630 "}\n";
13631 char const *fsSource =
13632 "#version 450\n"
13633 "\n"
13634 "in block { layout(location=0) float x; } ins;\n"
13635 "layout(location=0) out vec4 color;\n"
13636 "void main(){\n"
13637 " color = vec4(ins.x);\n"
13638 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130013639
13640 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13641 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13642
13643 VkPipelineObj pipe(m_device);
13644 pipe.AddColorAttachment();
13645 pipe.AddShader(&vs);
13646 pipe.AddShader(&fs);
13647
13648 VkDescriptorSetObj descriptorSet(m_device);
13649 descriptorSet.AppendDummy();
13650 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13651
13652 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13653
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013654 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013655}
13656
Karl Schultz6addd812016-02-02 17:17:23 -070013657TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013658 TEST_DESCRIPTION(
13659 "Test that an error is produced for mismatched array sizes "
13660 "across the vertex->fragment shader interface");
13661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13662 "Type mismatch on location 0.0: 'ptr to "
13663 "output arr[2] of float32' vs 'ptr to "
13664 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130013665
13666 ASSERT_NO_FATAL_FAILURE(InitState());
13667 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13668
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013669 char const *vsSource =
13670 "#version 450\n"
13671 "\n"
13672 "layout(location=0) out float x[2];\n"
13673 "out gl_PerVertex {\n"
13674 " vec4 gl_Position;\n"
13675 "};\n"
13676 "void main(){\n"
13677 " x[0] = 0; x[1] = 0;\n"
13678 " gl_Position = vec4(1);\n"
13679 "}\n";
13680 char const *fsSource =
13681 "#version 450\n"
13682 "\n"
13683 "layout(location=0) in float x[1];\n"
13684 "layout(location=0) out vec4 color;\n"
13685 "void main(){\n"
13686 " color = vec4(x[0]);\n"
13687 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130013688
13689 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13690 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13691
13692 VkPipelineObj pipe(m_device);
13693 pipe.AddColorAttachment();
13694 pipe.AddShader(&vs);
13695 pipe.AddShader(&fs);
13696
13697 VkDescriptorSetObj descriptorSet(m_device);
13698 descriptorSet.AppendDummy();
13699 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13700
13701 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13702
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013703 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130013704}
13705
Karl Schultz6addd812016-02-02 17:17:23 -070013706TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013707 TEST_DESCRIPTION(
13708 "Test that an error is produced for mismatched types across "
13709 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013711
Chris Forbesb56af562015-05-25 11:13:17 +120013712 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013713 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120013714
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013715 char const *vsSource =
13716 "#version 450\n"
13717 "\n"
13718 "layout(location=0) out int x;\n"
13719 "out gl_PerVertex {\n"
13720 " vec4 gl_Position;\n"
13721 "};\n"
13722 "void main(){\n"
13723 " x = 0;\n"
13724 " gl_Position = vec4(1);\n"
13725 "}\n";
13726 char const *fsSource =
13727 "#version 450\n"
13728 "\n"
13729 "layout(location=0) in float x;\n" /* VS writes int */
13730 "layout(location=0) out vec4 color;\n"
13731 "void main(){\n"
13732 " color = vec4(x);\n"
13733 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120013734
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013735 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13736 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120013737
13738 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013739 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120013740 pipe.AddShader(&vs);
13741 pipe.AddShader(&fs);
13742
Chris Forbesb56af562015-05-25 11:13:17 +120013743 VkDescriptorSetObj descriptorSet(m_device);
13744 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013745 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120013746
Tony Barbour5781e8f2015-08-04 16:23:11 -060013747 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120013748
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013749 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120013750}
13751
Karl Schultz6addd812016-02-02 17:17:23 -070013752TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013753 TEST_DESCRIPTION(
13754 "Test that an error is produced for mismatched types across "
13755 "the vertex->fragment shader interface, when the variable is contained within "
13756 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013757 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013758
13759 ASSERT_NO_FATAL_FAILURE(InitState());
13760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13761
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013762 char const *vsSource =
13763 "#version 450\n"
13764 "\n"
13765 "out block { layout(location=0) int x; } outs;\n"
13766 "out gl_PerVertex {\n"
13767 " vec4 gl_Position;\n"
13768 "};\n"
13769 "void main(){\n"
13770 " outs.x = 0;\n"
13771 " gl_Position = vec4(1);\n"
13772 "}\n";
13773 char const *fsSource =
13774 "#version 450\n"
13775 "\n"
13776 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
13777 "layout(location=0) out vec4 color;\n"
13778 "void main(){\n"
13779 " color = vec4(ins.x);\n"
13780 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130013781
13782 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13783 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13784
13785 VkPipelineObj pipe(m_device);
13786 pipe.AddColorAttachment();
13787 pipe.AddShader(&vs);
13788 pipe.AddShader(&fs);
13789
13790 VkDescriptorSetObj descriptorSet(m_device);
13791 descriptorSet.AppendDummy();
13792 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13793
13794 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13795
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013796 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013797}
13798
13799TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013800 TEST_DESCRIPTION(
13801 "Test that an error is produced for location mismatches across "
13802 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
13803 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013804 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 +130013805
13806 ASSERT_NO_FATAL_FAILURE(InitState());
13807 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13808
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013809 char const *vsSource =
13810 "#version 450\n"
13811 "\n"
13812 "out block { layout(location=1) float x; } outs;\n"
13813 "out gl_PerVertex {\n"
13814 " vec4 gl_Position;\n"
13815 "};\n"
13816 "void main(){\n"
13817 " outs.x = 0;\n"
13818 " gl_Position = vec4(1);\n"
13819 "}\n";
13820 char const *fsSource =
13821 "#version 450\n"
13822 "\n"
13823 "in block { layout(location=0) float x; } ins;\n"
13824 "layout(location=0) out vec4 color;\n"
13825 "void main(){\n"
13826 " color = vec4(ins.x);\n"
13827 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130013828
13829 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13830 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13831
13832 VkPipelineObj pipe(m_device);
13833 pipe.AddColorAttachment();
13834 pipe.AddShader(&vs);
13835 pipe.AddShader(&fs);
13836
13837 VkDescriptorSetObj descriptorSet(m_device);
13838 descriptorSet.AppendDummy();
13839 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13840
13841 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13842
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013843 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013844}
13845
13846TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013847 TEST_DESCRIPTION(
13848 "Test that an error is produced for component mismatches across the "
13849 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
13850 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013851 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 +130013852
13853 ASSERT_NO_FATAL_FAILURE(InitState());
13854 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13855
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013856 char const *vsSource =
13857 "#version 450\n"
13858 "\n"
13859 "out block { layout(location=0, component=0) float x; } outs;\n"
13860 "out gl_PerVertex {\n"
13861 " vec4 gl_Position;\n"
13862 "};\n"
13863 "void main(){\n"
13864 " outs.x = 0;\n"
13865 " gl_Position = vec4(1);\n"
13866 "}\n";
13867 char const *fsSource =
13868 "#version 450\n"
13869 "\n"
13870 "in block { layout(location=0, component=1) float x; } ins;\n"
13871 "layout(location=0) out vec4 color;\n"
13872 "void main(){\n"
13873 " color = vec4(ins.x);\n"
13874 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130013875
13876 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13877 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13878
13879 VkPipelineObj pipe(m_device);
13880 pipe.AddColorAttachment();
13881 pipe.AddShader(&vs);
13882 pipe.AddShader(&fs);
13883
13884 VkDescriptorSetObj descriptorSet(m_device);
13885 descriptorSet.AppendDummy();
13886 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13887
13888 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13889
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013890 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013891}
13892
Chris Forbes1f3b0152016-11-30 12:48:40 +130013893TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
13894 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
13895
13896 ASSERT_NO_FATAL_FAILURE(InitState());
13897 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13898
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013899 char const *vsSource =
13900 "#version 450\n"
13901 "layout(location=0) out mediump float x;\n"
13902 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13903 char const *fsSource =
13904 "#version 450\n"
13905 "layout(location=0) in highp float x;\n"
13906 "layout(location=0) out vec4 color;\n"
13907 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130013908
13909 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13910 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13911
13912 VkPipelineObj pipe(m_device);
13913 pipe.AddColorAttachment();
13914 pipe.AddShader(&vs);
13915 pipe.AddShader(&fs);
13916
13917 VkDescriptorSetObj descriptorSet(m_device);
13918 descriptorSet.AppendDummy();
13919 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13920
13921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
13922
13923 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13924
13925 m_errorMonitor->VerifyFound();
13926}
13927
Chris Forbes870a39e2016-11-30 12:55:56 +130013928TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
13929 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
13930
13931 ASSERT_NO_FATAL_FAILURE(InitState());
13932 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13933
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013934 char const *vsSource =
13935 "#version 450\n"
13936 "out block { layout(location=0) mediump float x; };\n"
13937 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13938 char const *fsSource =
13939 "#version 450\n"
13940 "in block { layout(location=0) highp float x; };\n"
13941 "layout(location=0) out vec4 color;\n"
13942 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130013943
13944 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13945 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13946
13947 VkPipelineObj pipe(m_device);
13948 pipe.AddColorAttachment();
13949 pipe.AddShader(&vs);
13950 pipe.AddShader(&fs);
13951
13952 VkDescriptorSetObj descriptorSet(m_device);
13953 descriptorSet.AppendDummy();
13954 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13955
13956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
13957
13958 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13959
13960 m_errorMonitor->VerifyFound();
13961}
13962
Karl Schultz6addd812016-02-02 17:17:23 -070013963TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013964 TEST_DESCRIPTION(
13965 "Test that a warning is produced for a vertex attribute which is "
13966 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013968
Chris Forbesde136e02015-05-25 11:13:28 +120013969 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120013971
13972 VkVertexInputBindingDescription input_binding;
13973 memset(&input_binding, 0, sizeof(input_binding));
13974
13975 VkVertexInputAttributeDescription input_attrib;
13976 memset(&input_attrib, 0, sizeof(input_attrib));
13977 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13978
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013979 char const *vsSource =
13980 "#version 450\n"
13981 "\n"
13982 "out gl_PerVertex {\n"
13983 " vec4 gl_Position;\n"
13984 "};\n"
13985 "void main(){\n"
13986 " gl_Position = vec4(1);\n"
13987 "}\n";
13988 char const *fsSource =
13989 "#version 450\n"
13990 "\n"
13991 "layout(location=0) out vec4 color;\n"
13992 "void main(){\n"
13993 " color = vec4(1);\n"
13994 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120013995
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013996 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13997 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120013998
13999 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014000 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014001 pipe.AddShader(&vs);
14002 pipe.AddShader(&fs);
14003
14004 pipe.AddVertexInputBindings(&input_binding, 1);
14005 pipe.AddVertexInputAttribs(&input_attrib, 1);
14006
Chris Forbesde136e02015-05-25 11:13:28 +120014007 VkDescriptorSetObj descriptorSet(m_device);
14008 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014009 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014010
Tony Barbour5781e8f2015-08-04 16:23:11 -060014011 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014012
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014013 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014014}
14015
Karl Schultz6addd812016-02-02 17:17:23 -070014016TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014017 TEST_DESCRIPTION(
14018 "Test that a warning is produced for a location mismatch on "
14019 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014021
14022 ASSERT_NO_FATAL_FAILURE(InitState());
14023 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14024
14025 VkVertexInputBindingDescription input_binding;
14026 memset(&input_binding, 0, sizeof(input_binding));
14027
14028 VkVertexInputAttributeDescription input_attrib;
14029 memset(&input_attrib, 0, sizeof(input_attrib));
14030 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14031
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014032 char const *vsSource =
14033 "#version 450\n"
14034 "\n"
14035 "layout(location=1) in float x;\n"
14036 "out gl_PerVertex {\n"
14037 " vec4 gl_Position;\n"
14038 "};\n"
14039 "void main(){\n"
14040 " gl_Position = vec4(x);\n"
14041 "}\n";
14042 char const *fsSource =
14043 "#version 450\n"
14044 "\n"
14045 "layout(location=0) out vec4 color;\n"
14046 "void main(){\n"
14047 " color = vec4(1);\n"
14048 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014049
14050 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14051 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14052
14053 VkPipelineObj pipe(m_device);
14054 pipe.AddColorAttachment();
14055 pipe.AddShader(&vs);
14056 pipe.AddShader(&fs);
14057
14058 pipe.AddVertexInputBindings(&input_binding, 1);
14059 pipe.AddVertexInputAttribs(&input_attrib, 1);
14060
14061 VkDescriptorSetObj descriptorSet(m_device);
14062 descriptorSet.AppendDummy();
14063 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14064
14065 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14066
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014067 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014068}
14069
Karl Schultz6addd812016-02-02 17:17:23 -070014070TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014071 TEST_DESCRIPTION(
14072 "Test that an error is produced for a vertex shader input which is not "
14073 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014074 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14075 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014076
Chris Forbes62e8e502015-05-25 11:13:29 +120014077 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014079
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014080 char const *vsSource =
14081 "#version 450\n"
14082 "\n"
14083 "layout(location=0) in vec4 x;\n" /* not provided */
14084 "out gl_PerVertex {\n"
14085 " vec4 gl_Position;\n"
14086 "};\n"
14087 "void main(){\n"
14088 " gl_Position = x;\n"
14089 "}\n";
14090 char const *fsSource =
14091 "#version 450\n"
14092 "\n"
14093 "layout(location=0) out vec4 color;\n"
14094 "void main(){\n"
14095 " color = vec4(1);\n"
14096 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014097
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014098 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14099 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014100
14101 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014102 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014103 pipe.AddShader(&vs);
14104 pipe.AddShader(&fs);
14105
Chris Forbes62e8e502015-05-25 11:13:29 +120014106 VkDescriptorSetObj descriptorSet(m_device);
14107 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014108 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014109
Tony Barbour5781e8f2015-08-04 16:23:11 -060014110 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014111
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014112 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014113}
14114
Karl Schultz6addd812016-02-02 17:17:23 -070014115TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014116 TEST_DESCRIPTION(
14117 "Test that an error is produced for a mismatch between the "
14118 "fundamental type (float/int/uint) of an attribute and the "
14119 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014120 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 -060014121
Chris Forbesc97d98e2015-05-25 11:13:31 +120014122 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014123 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014124
14125 VkVertexInputBindingDescription input_binding;
14126 memset(&input_binding, 0, sizeof(input_binding));
14127
14128 VkVertexInputAttributeDescription input_attrib;
14129 memset(&input_attrib, 0, sizeof(input_attrib));
14130 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14131
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014132 char const *vsSource =
14133 "#version 450\n"
14134 "\n"
14135 "layout(location=0) in int x;\n" /* attrib provided float */
14136 "out gl_PerVertex {\n"
14137 " vec4 gl_Position;\n"
14138 "};\n"
14139 "void main(){\n"
14140 " gl_Position = vec4(x);\n"
14141 "}\n";
14142 char const *fsSource =
14143 "#version 450\n"
14144 "\n"
14145 "layout(location=0) out vec4 color;\n"
14146 "void main(){\n"
14147 " color = vec4(1);\n"
14148 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014149
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014150 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14151 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014152
14153 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014154 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014155 pipe.AddShader(&vs);
14156 pipe.AddShader(&fs);
14157
14158 pipe.AddVertexInputBindings(&input_binding, 1);
14159 pipe.AddVertexInputAttribs(&input_attrib, 1);
14160
Chris Forbesc97d98e2015-05-25 11:13:31 +120014161 VkDescriptorSetObj descriptorSet(m_device);
14162 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014163 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014164
Tony Barbour5781e8f2015-08-04 16:23:11 -060014165 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014166
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014167 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014168}
14169
Chris Forbesc68b43c2016-04-06 11:18:47 +120014170TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014171 TEST_DESCRIPTION(
14172 "Test that an error is produced for a pipeline containing multiple "
14173 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14175 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014176
14177 ASSERT_NO_FATAL_FAILURE(InitState());
14178 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14179
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014180 char const *vsSource =
14181 "#version 450\n"
14182 "\n"
14183 "out gl_PerVertex {\n"
14184 " vec4 gl_Position;\n"
14185 "};\n"
14186 "void main(){\n"
14187 " gl_Position = vec4(1);\n"
14188 "}\n";
14189 char const *fsSource =
14190 "#version 450\n"
14191 "\n"
14192 "layout(location=0) out vec4 color;\n"
14193 "void main(){\n"
14194 " color = vec4(1);\n"
14195 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014196
14197 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14198 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14199
14200 VkPipelineObj pipe(m_device);
14201 pipe.AddColorAttachment();
14202 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014203 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014204 pipe.AddShader(&fs);
14205
14206 VkDescriptorSetObj descriptorSet(m_device);
14207 descriptorSet.AppendDummy();
14208 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14209
14210 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14211
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014212 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014213}
14214
Chris Forbes82ff92a2016-09-09 10:50:24 +120014215TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014217
14218 ASSERT_NO_FATAL_FAILURE(InitState());
14219 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14220
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014221 char const *vsSource =
14222 "#version 450\n"
14223 "out gl_PerVertex {\n"
14224 " vec4 gl_Position;\n"
14225 "};\n"
14226 "void main(){\n"
14227 " gl_Position = vec4(0);\n"
14228 "}\n";
14229 char const *fsSource =
14230 "#version 450\n"
14231 "\n"
14232 "layout(location=0) out vec4 color;\n"
14233 "void main(){\n"
14234 " color = vec4(1);\n"
14235 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014236
14237 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14238 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14239
14240 VkPipelineObj pipe(m_device);
14241 pipe.AddColorAttachment();
14242 pipe.AddShader(&vs);
14243 pipe.AddShader(&fs);
14244
14245 VkDescriptorSetObj descriptorSet(m_device);
14246 descriptorSet.AppendDummy();
14247 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14248
14249 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14250
14251 m_errorMonitor->VerifyFound();
14252}
14253
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014254TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14256 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14257 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014258
14259 ASSERT_NO_FATAL_FAILURE(InitState());
14260 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14261
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014262 char const *vsSource =
14263 "#version 450\n"
14264 "void main(){ gl_Position = vec4(0); }\n";
14265 char const *fsSource =
14266 "#version 450\n"
14267 "\n"
14268 "layout(location=0) out vec4 color;\n"
14269 "void main(){\n"
14270 " color = vec4(1);\n"
14271 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014272
14273 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14274 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14275
14276 VkPipelineObj pipe(m_device);
14277 pipe.AddColorAttachment();
14278 pipe.AddShader(&vs);
14279 pipe.AddShader(&fs);
14280
14281 VkDescriptorSetObj descriptorSet(m_device);
14282 descriptorSet.AppendDummy();
14283 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14284
14285 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014286 {
14287 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14288 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14289 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014290 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014291 {
14292 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14293 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14294 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014295 },
14296 };
14297 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014298 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014299 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014300 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14301 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014302 VkRenderPass rp;
14303 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14304 ASSERT_VK_SUCCESS(err);
14305
14306 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14307
14308 m_errorMonitor->VerifyFound();
14309
14310 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14311}
14312
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014313TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014314 TEST_DESCRIPTION(
14315 "Test that an error is produced for a variable output from "
14316 "the TCS without the patch decoration, but consumed in the TES "
14317 "with the decoration.");
14318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14319 "is per-vertex in tessellation control shader stage "
14320 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014321
14322 ASSERT_NO_FATAL_FAILURE(InitState());
14323 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14324
Chris Forbesc1e852d2016-04-04 19:26:42 +120014325 if (!m_device->phy().features().tessellationShader) {
14326 printf("Device does not support tessellation shaders; skipped.\n");
14327 return;
14328 }
14329
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014330 char const *vsSource =
14331 "#version 450\n"
14332 "void main(){}\n";
14333 char const *tcsSource =
14334 "#version 450\n"
14335 "layout(location=0) out int x[];\n"
14336 "layout(vertices=3) out;\n"
14337 "void main(){\n"
14338 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14339 " gl_TessLevelInner[0] = 1;\n"
14340 " x[gl_InvocationID] = gl_InvocationID;\n"
14341 "}\n";
14342 char const *tesSource =
14343 "#version 450\n"
14344 "layout(triangles, equal_spacing, cw) in;\n"
14345 "layout(location=0) patch in int x;\n"
14346 "out gl_PerVertex { vec4 gl_Position; };\n"
14347 "void main(){\n"
14348 " gl_Position.xyz = gl_TessCoord;\n"
14349 " gl_Position.w = x;\n"
14350 "}\n";
14351 char const *fsSource =
14352 "#version 450\n"
14353 "layout(location=0) out vec4 color;\n"
14354 "void main(){\n"
14355 " color = vec4(1);\n"
14356 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014357
14358 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14359 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14360 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14361 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14362
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014363 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14364 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014365
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014366 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014367
14368 VkPipelineObj pipe(m_device);
14369 pipe.SetInputAssembly(&iasci);
14370 pipe.SetTessellation(&tsci);
14371 pipe.AddColorAttachment();
14372 pipe.AddShader(&vs);
14373 pipe.AddShader(&tcs);
14374 pipe.AddShader(&tes);
14375 pipe.AddShader(&fs);
14376
14377 VkDescriptorSetObj descriptorSet(m_device);
14378 descriptorSet.AppendDummy();
14379 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14380
14381 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14382
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014383 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014384}
14385
Karl Schultz6addd812016-02-02 17:17:23 -070014386TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014387 TEST_DESCRIPTION(
14388 "Test that an error is produced for a vertex attribute setup where multiple "
14389 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014390 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14391 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014392
Chris Forbes280ba2c2015-06-12 11:16:41 +120014393 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014394 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014395
14396 /* Two binding descriptions for binding 0 */
14397 VkVertexInputBindingDescription input_bindings[2];
14398 memset(input_bindings, 0, sizeof(input_bindings));
14399
14400 VkVertexInputAttributeDescription input_attrib;
14401 memset(&input_attrib, 0, sizeof(input_attrib));
14402 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14403
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014404 char const *vsSource =
14405 "#version 450\n"
14406 "\n"
14407 "layout(location=0) in float x;\n" /* attrib provided float */
14408 "out gl_PerVertex {\n"
14409 " vec4 gl_Position;\n"
14410 "};\n"
14411 "void main(){\n"
14412 " gl_Position = vec4(x);\n"
14413 "}\n";
14414 char const *fsSource =
14415 "#version 450\n"
14416 "\n"
14417 "layout(location=0) out vec4 color;\n"
14418 "void main(){\n"
14419 " color = vec4(1);\n"
14420 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014421
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014422 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14423 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014424
14425 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014426 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014427 pipe.AddShader(&vs);
14428 pipe.AddShader(&fs);
14429
14430 pipe.AddVertexInputBindings(input_bindings, 2);
14431 pipe.AddVertexInputAttribs(&input_attrib, 1);
14432
Chris Forbes280ba2c2015-06-12 11:16:41 +120014433 VkDescriptorSetObj descriptorSet(m_device);
14434 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014435 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014436
Tony Barbour5781e8f2015-08-04 16:23:11 -060014437 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014438
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014439 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014440}
Chris Forbes8f68b562015-05-25 11:13:32 +120014441
Karl Schultz6addd812016-02-02 17:17:23 -070014442TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014443 TEST_DESCRIPTION(
14444 "Test that an error is produced for a fragment shader which does not "
14445 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014447
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014448 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014449
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014450 char const *vsSource =
14451 "#version 450\n"
14452 "\n"
14453 "out gl_PerVertex {\n"
14454 " vec4 gl_Position;\n"
14455 "};\n"
14456 "void main(){\n"
14457 " gl_Position = vec4(1);\n"
14458 "}\n";
14459 char const *fsSource =
14460 "#version 450\n"
14461 "\n"
14462 "void main(){\n"
14463 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014464
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014465 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14466 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014467
14468 VkPipelineObj pipe(m_device);
14469 pipe.AddShader(&vs);
14470 pipe.AddShader(&fs);
14471
Chia-I Wu08accc62015-07-07 11:50:03 +080014472 /* set up CB 0, not written */
14473 pipe.AddColorAttachment();
14474 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014475
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014476 VkDescriptorSetObj descriptorSet(m_device);
14477 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014478 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014479
Tony Barbour5781e8f2015-08-04 16:23:11 -060014480 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014481
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014482 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014483}
14484
Karl Schultz6addd812016-02-02 17:17:23 -070014485TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014486 TEST_DESCRIPTION(
14487 "Test that a warning is produced for a fragment shader which provides a spurious "
14488 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014490 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014491
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014492 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +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 "layout(location=0) out vec4 x;\n"
14507 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14508 "void main(){\n"
14509 " x = vec4(1);\n"
14510 " y = vec4(1);\n"
14511 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014512
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014513 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14514 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014515
14516 VkPipelineObj pipe(m_device);
14517 pipe.AddShader(&vs);
14518 pipe.AddShader(&fs);
14519
Chia-I Wu08accc62015-07-07 11:50:03 +080014520 /* set up CB 0, not written */
14521 pipe.AddColorAttachment();
14522 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014523 /* FS writes CB 1, but we don't configure it */
14524
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014525 VkDescriptorSetObj descriptorSet(m_device);
14526 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014527 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014528
Tony Barbour5781e8f2015-08-04 16:23:11 -060014529 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014530
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014531 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014532}
14533
Karl Schultz6addd812016-02-02 17:17:23 -070014534TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014535 TEST_DESCRIPTION(
14536 "Test that an error is produced for a mismatch between the fundamental "
14537 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014538 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014539
Chris Forbesa36d69e2015-05-25 11:13:44 +120014540 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014541
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014542 char const *vsSource =
14543 "#version 450\n"
14544 "\n"
14545 "out gl_PerVertex {\n"
14546 " vec4 gl_Position;\n"
14547 "};\n"
14548 "void main(){\n"
14549 " gl_Position = vec4(1);\n"
14550 "}\n";
14551 char const *fsSource =
14552 "#version 450\n"
14553 "\n"
14554 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14555 "void main(){\n"
14556 " x = ivec4(1);\n"
14557 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014558
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014559 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14560 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014561
14562 VkPipelineObj pipe(m_device);
14563 pipe.AddShader(&vs);
14564 pipe.AddShader(&fs);
14565
Chia-I Wu08accc62015-07-07 11:50:03 +080014566 /* set up CB 0; type is UNORM by default */
14567 pipe.AddColorAttachment();
14568 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014569
Chris Forbesa36d69e2015-05-25 11:13:44 +120014570 VkDescriptorSetObj descriptorSet(m_device);
14571 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014572 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014573
Tony Barbour5781e8f2015-08-04 16:23:11 -060014574 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014575
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014576 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014577}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014578
Karl Schultz6addd812016-02-02 17:17:23 -070014579TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014580 TEST_DESCRIPTION(
14581 "Test that an error is produced for a shader consuming a uniform "
14582 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014583 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014584
Chris Forbes556c76c2015-08-14 12:04:59 +120014585 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120014586
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014587 char const *vsSource =
14588 "#version 450\n"
14589 "\n"
14590 "out gl_PerVertex {\n"
14591 " vec4 gl_Position;\n"
14592 "};\n"
14593 "void main(){\n"
14594 " gl_Position = vec4(1);\n"
14595 "}\n";
14596 char const *fsSource =
14597 "#version 450\n"
14598 "\n"
14599 "layout(location=0) out vec4 x;\n"
14600 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
14601 "void main(){\n"
14602 " x = vec4(bar.y);\n"
14603 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120014604
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014605 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14606 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120014607
Chris Forbes556c76c2015-08-14 12:04:59 +120014608 VkPipelineObj pipe(m_device);
14609 pipe.AddShader(&vs);
14610 pipe.AddShader(&fs);
14611
14612 /* set up CB 0; type is UNORM by default */
14613 pipe.AddColorAttachment();
14614 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14615
14616 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014617 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120014618
14619 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14620
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014621 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120014622}
14623
Chris Forbes5c59e902016-02-26 16:56:09 +130014624TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014625 TEST_DESCRIPTION(
14626 "Test that an error is produced for a shader consuming push constants "
14627 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014628 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130014629
14630 ASSERT_NO_FATAL_FAILURE(InitState());
14631
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014632 char const *vsSource =
14633 "#version 450\n"
14634 "\n"
14635 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14636 "out gl_PerVertex {\n"
14637 " vec4 gl_Position;\n"
14638 "};\n"
14639 "void main(){\n"
14640 " gl_Position = vec4(consts.x);\n"
14641 "}\n";
14642 char const *fsSource =
14643 "#version 450\n"
14644 "\n"
14645 "layout(location=0) out vec4 x;\n"
14646 "void main(){\n"
14647 " x = vec4(1);\n"
14648 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130014649
14650 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14651 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14652
14653 VkPipelineObj pipe(m_device);
14654 pipe.AddShader(&vs);
14655 pipe.AddShader(&fs);
14656
14657 /* set up CB 0; type is UNORM by default */
14658 pipe.AddColorAttachment();
14659 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14660
14661 VkDescriptorSetObj descriptorSet(m_device);
14662 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14663
14664 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14665
14666 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014667 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130014668}
14669
Chris Forbes3fb17902016-08-22 14:57:55 +120014670TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014671 TEST_DESCRIPTION(
14672 "Test that an error is produced for a shader consuming an input attachment "
14673 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120014674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14675 "consumes input attachment index 0 but not provided in subpass");
14676
14677 ASSERT_NO_FATAL_FAILURE(InitState());
14678
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014679 char const *vsSource =
14680 "#version 450\n"
14681 "\n"
14682 "out gl_PerVertex {\n"
14683 " vec4 gl_Position;\n"
14684 "};\n"
14685 "void main(){\n"
14686 " gl_Position = vec4(1);\n"
14687 "}\n";
14688 char const *fsSource =
14689 "#version 450\n"
14690 "\n"
14691 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
14692 "layout(location=0) out vec4 color;\n"
14693 "void main() {\n"
14694 " color = subpassLoad(x);\n"
14695 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120014696
14697 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14698 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14699
14700 VkPipelineObj pipe(m_device);
14701 pipe.AddShader(&vs);
14702 pipe.AddShader(&fs);
14703 pipe.AddColorAttachment();
14704 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14705
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014706 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
14707 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120014708 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014709 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120014710 ASSERT_VK_SUCCESS(err);
14711
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014712 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120014713 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014714 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120014715 ASSERT_VK_SUCCESS(err);
14716
14717 // error here.
14718 pipe.CreateVKPipeline(pl, renderPass());
14719
14720 m_errorMonitor->VerifyFound();
14721
14722 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14723 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14724}
14725
Chris Forbes5a9a0472016-08-22 16:02:09 +120014726TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014727 TEST_DESCRIPTION(
14728 "Test that an error is produced for a shader consuming an input attachment "
14729 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120014730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14731 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
14732
14733 ASSERT_NO_FATAL_FAILURE(InitState());
14734
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014735 char const *vsSource =
14736 "#version 450\n"
14737 "\n"
14738 "out gl_PerVertex {\n"
14739 " vec4 gl_Position;\n"
14740 "};\n"
14741 "void main(){\n"
14742 " gl_Position = vec4(1);\n"
14743 "}\n";
14744 char const *fsSource =
14745 "#version 450\n"
14746 "\n"
14747 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
14748 "layout(location=0) out vec4 color;\n"
14749 "void main() {\n"
14750 " color = subpassLoad(x);\n"
14751 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120014752
14753 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14754 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14755
14756 VkPipelineObj pipe(m_device);
14757 pipe.AddShader(&vs);
14758 pipe.AddShader(&fs);
14759 pipe.AddColorAttachment();
14760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14761
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014762 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
14763 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014764 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014765 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120014766 ASSERT_VK_SUCCESS(err);
14767
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014768 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014769 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014770 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120014771 ASSERT_VK_SUCCESS(err);
14772
14773 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014774 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
14775 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
14776 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
14777 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
14778 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 +120014779 };
14780 VkAttachmentReference color = {
14781 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
14782 };
14783 VkAttachmentReference input = {
14784 1, VK_IMAGE_LAYOUT_GENERAL,
14785 };
14786
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014787 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014788
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014789 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120014790 VkRenderPass rp;
14791 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14792 ASSERT_VK_SUCCESS(err);
14793
14794 // error here.
14795 pipe.CreateVKPipeline(pl, rp);
14796
14797 m_errorMonitor->VerifyFound();
14798
14799 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14800 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14801 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14802}
14803
Chris Forbes541f7b02016-08-22 15:30:27 +120014804TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014805 TEST_DESCRIPTION(
14806 "Test that an error is produced for a shader consuming an input attachment "
14807 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120014808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070014809 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120014810
14811 ASSERT_NO_FATAL_FAILURE(InitState());
14812
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014813 char const *vsSource =
14814 "#version 450\n"
14815 "\n"
14816 "out gl_PerVertex {\n"
14817 " vec4 gl_Position;\n"
14818 "};\n"
14819 "void main(){\n"
14820 " gl_Position = vec4(1);\n"
14821 "}\n";
14822 char const *fsSource =
14823 "#version 450\n"
14824 "\n"
14825 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
14826 "layout(location=0) out vec4 color;\n"
14827 "void main() {\n"
14828 " color = subpassLoad(xs[0]);\n"
14829 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120014830
14831 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14832 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14833
14834 VkPipelineObj pipe(m_device);
14835 pipe.AddShader(&vs);
14836 pipe.AddShader(&fs);
14837 pipe.AddColorAttachment();
14838 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14839
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014840 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
14841 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120014842 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014843 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120014844 ASSERT_VK_SUCCESS(err);
14845
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014846 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120014847 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014848 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120014849 ASSERT_VK_SUCCESS(err);
14850
14851 // error here.
14852 pipe.CreateVKPipeline(pl, renderPass());
14853
14854 m_errorMonitor->VerifyFound();
14855
14856 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14857 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14858}
14859
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014860TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014861 TEST_DESCRIPTION(
14862 "Test that an error is produced for a compute pipeline consuming a "
14863 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014865
14866 ASSERT_NO_FATAL_FAILURE(InitState());
14867
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014868 char const *csSource =
14869 "#version 450\n"
14870 "\n"
14871 "layout(local_size_x=1) in;\n"
14872 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14873 "void main(){\n"
14874 " x = vec4(1);\n"
14875 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014876
14877 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14878
14879 VkDescriptorSetObj descriptorSet(m_device);
14880 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14881
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014882 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14883 nullptr,
14884 0,
14885 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
14886 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
14887 descriptorSet.GetPipelineLayout(),
14888 VK_NULL_HANDLE,
14889 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014890
14891 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014892 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014893
14894 m_errorMonitor->VerifyFound();
14895
14896 if (err == VK_SUCCESS) {
14897 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14898 }
14899}
14900
Chris Forbes22a9b092016-07-19 14:34:05 +120014901TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014902 TEST_DESCRIPTION(
14903 "Test that an error is produced for a pipeline consuming a "
14904 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14906 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120014907
14908 ASSERT_NO_FATAL_FAILURE(InitState());
14909
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014910 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
14911 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120014912 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014913 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120014914 ASSERT_VK_SUCCESS(err);
14915
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014916 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120014917 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014918 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120014919 ASSERT_VK_SUCCESS(err);
14920
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014921 char const *csSource =
14922 "#version 450\n"
14923 "\n"
14924 "layout(local_size_x=1) in;\n"
14925 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14926 "void main() {\n"
14927 " x.x = 1.0f;\n"
14928 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120014929 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14930
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014931 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14932 nullptr,
14933 0,
14934 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
14935 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
14936 pl,
14937 VK_NULL_HANDLE,
14938 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120014939
14940 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014941 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120014942
14943 m_errorMonitor->VerifyFound();
14944
14945 if (err == VK_SUCCESS) {
14946 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14947 }
14948
14949 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14950 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14951}
14952
Chris Forbes50020592016-07-27 13:52:41 +120014953TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014954 TEST_DESCRIPTION(
14955 "Test that an error is produced when an image view type "
14956 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120014957
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014958 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 +120014959
14960 ASSERT_NO_FATAL_FAILURE(InitState());
14961 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14962
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014963 char const *vsSource =
14964 "#version 450\n"
14965 "\n"
14966 "out gl_PerVertex { vec4 gl_Position; };\n"
14967 "void main() { gl_Position = vec4(0); }\n";
14968 char const *fsSource =
14969 "#version 450\n"
14970 "\n"
14971 "layout(set=0, binding=0) uniform sampler3D s;\n"
14972 "layout(location=0) out vec4 color;\n"
14973 "void main() {\n"
14974 " color = texture(s, vec3(0));\n"
14975 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120014976 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14977 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14978
14979 VkPipelineObj pipe(m_device);
14980 pipe.AddShader(&vs);
14981 pipe.AddShader(&fs);
14982 pipe.AddColorAttachment();
14983
14984 VkTextureObj texture(m_device, nullptr);
14985 VkSamplerObj sampler(m_device);
14986
14987 VkDescriptorSetObj descriptorSet(m_device);
14988 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14989 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14990
14991 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14992 ASSERT_VK_SUCCESS(err);
14993
Tony Barbour552f6c02016-12-21 14:34:07 -070014994 m_commandBuffer->BeginCommandBuffer();
14995 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120014996
14997 m_commandBuffer->BindPipeline(pipe);
14998 m_commandBuffer->BindDescriptorSet(descriptorSet);
14999
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015000 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015001 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015002 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015003 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15004
15005 // error produced here.
15006 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15007
15008 m_errorMonitor->VerifyFound();
15009
Tony Barbour552f6c02016-12-21 14:34:07 -070015010 m_commandBuffer->EndRenderPass();
15011 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015012}
15013
Chris Forbes5533bfc2016-07-27 14:12:34 +120015014TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015015 TEST_DESCRIPTION(
15016 "Test that an error is produced when a multisampled images "
15017 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015018
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015020
15021 ASSERT_NO_FATAL_FAILURE(InitState());
15022 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15023
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015024 char const *vsSource =
15025 "#version 450\n"
15026 "\n"
15027 "out gl_PerVertex { vec4 gl_Position; };\n"
15028 "void main() { gl_Position = vec4(0); }\n";
15029 char const *fsSource =
15030 "#version 450\n"
15031 "\n"
15032 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15033 "layout(location=0) out vec4 color;\n"
15034 "void main() {\n"
15035 " color = texelFetch(s, ivec2(0), 0);\n"
15036 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015037 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15038 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15039
15040 VkPipelineObj pipe(m_device);
15041 pipe.AddShader(&vs);
15042 pipe.AddShader(&fs);
15043 pipe.AddColorAttachment();
15044
15045 VkTextureObj texture(m_device, nullptr);
15046 VkSamplerObj sampler(m_device);
15047
15048 VkDescriptorSetObj descriptorSet(m_device);
15049 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15050 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15051
15052 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15053 ASSERT_VK_SUCCESS(err);
15054
Tony Barbour552f6c02016-12-21 14:34:07 -070015055 m_commandBuffer->BeginCommandBuffer();
15056 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015057
15058 m_commandBuffer->BindPipeline(pipe);
15059 m_commandBuffer->BindDescriptorSet(descriptorSet);
15060
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015061 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015062 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015063 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015064 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15065
15066 // error produced here.
15067 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15068
15069 m_errorMonitor->VerifyFound();
15070
Tony Barbour552f6c02016-12-21 14:34:07 -070015071 m_commandBuffer->EndRenderPass();
15072 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015073}
15074
Mark Youngc48c4c12016-04-11 14:26:49 -060015075TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015076 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015077
15078 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015079
15080 // Create an image
15081 VkImage image;
15082
Karl Schultz6addd812016-02-02 17:17:23 -070015083 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15084 const int32_t tex_width = 32;
15085 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015086
15087 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015088 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15089 image_create_info.pNext = NULL;
15090 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15091 image_create_info.format = tex_format;
15092 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015093 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070015094 image_create_info.extent.depth = 1;
15095 image_create_info.mipLevels = 1;
15096 image_create_info.arrayLayers = 1;
15097 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15098 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15099 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15100 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015101
15102 // Introduce error by sending down a bogus width extent
15103 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080015104 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015105
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015106 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015107}
15108
Mark Youngc48c4c12016-04-11 14:26:49 -060015109TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Mark Lobodzinski688ed322017-01-27 11:13:21 -070015110 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00716);
Mark Youngc48c4c12016-04-11 14:26:49 -060015111
15112 ASSERT_NO_FATAL_FAILURE(InitState());
15113
15114 // Create an image
15115 VkImage image;
15116
15117 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15118 const int32_t tex_width = 32;
15119 const int32_t tex_height = 32;
15120
15121 VkImageCreateInfo image_create_info = {};
15122 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15123 image_create_info.pNext = NULL;
15124 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15125 image_create_info.format = tex_format;
15126 image_create_info.extent.width = tex_width;
15127 image_create_info.extent.height = tex_height;
15128 image_create_info.extent.depth = 1;
15129 image_create_info.mipLevels = 1;
15130 image_create_info.arrayLayers = 1;
15131 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15132 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15133 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15134 image_create_info.flags = 0;
15135
15136 // Introduce error by sending down a bogus width extent
15137 image_create_info.extent.width = 0;
15138 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15139
15140 m_errorMonitor->VerifyFound();
15141}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015142
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015143TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015144 TEST_DESCRIPTION(
15145 "Create a render pass with an attachment description "
15146 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015147
15148 ASSERT_NO_FATAL_FAILURE(InitState());
15149 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15150
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015152
15153 VkAttachmentReference color_attach = {};
15154 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15155 color_attach.attachment = 0;
15156 VkSubpassDescription subpass = {};
15157 subpass.colorAttachmentCount = 1;
15158 subpass.pColorAttachments = &color_attach;
15159
15160 VkRenderPassCreateInfo rpci = {};
15161 rpci.subpassCount = 1;
15162 rpci.pSubpasses = &subpass;
15163 rpci.attachmentCount = 1;
15164 VkAttachmentDescription attach_desc = {};
15165 attach_desc.format = VK_FORMAT_UNDEFINED;
15166 rpci.pAttachments = &attach_desc;
15167 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15168 VkRenderPass rp;
15169 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15170
15171 m_errorMonitor->VerifyFound();
15172
15173 if (result == VK_SUCCESS) {
15174 vkDestroyRenderPass(m_device->device(), rp, NULL);
15175 }
15176}
15177
Karl Schultz6addd812016-02-02 17:17:23 -070015178TEST_F(VkLayerTest, InvalidImageView) {
15179 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060015180
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015182
Tobin Ehliscde08892015-09-22 10:11:37 -060015183 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060015184
Mike Stroyana3082432015-09-25 13:39:21 -060015185 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015186 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060015187
Karl Schultz6addd812016-02-02 17:17:23 -070015188 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15189 const int32_t tex_width = 32;
15190 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015191
15192 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015193 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15194 image_create_info.pNext = NULL;
15195 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15196 image_create_info.format = tex_format;
15197 image_create_info.extent.width = tex_width;
15198 image_create_info.extent.height = tex_height;
15199 image_create_info.extent.depth = 1;
15200 image_create_info.mipLevels = 1;
15201 image_create_info.arrayLayers = 1;
15202 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15203 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15204 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15205 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015206
Chia-I Wuf7458c52015-10-26 21:10:41 +080015207 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015208 ASSERT_VK_SUCCESS(err);
15209
15210 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015211 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015212 image_view_create_info.image = image;
15213 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15214 image_view_create_info.format = tex_format;
15215 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015216 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015217 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015218 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015219
15220 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015221 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060015222
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015223 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060015224 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015225}
Mike Stroyana3082432015-09-25 13:39:21 -060015226
Mark Youngd339ba32016-05-30 13:28:35 -060015227TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15228 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015230 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015231
15232 ASSERT_NO_FATAL_FAILURE(InitState());
15233
15234 // Create an image and try to create a view with no memory backing the image
15235 VkImage image;
15236
15237 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15238 const int32_t tex_width = 32;
15239 const int32_t tex_height = 32;
15240
15241 VkImageCreateInfo image_create_info = {};
15242 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15243 image_create_info.pNext = NULL;
15244 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15245 image_create_info.format = tex_format;
15246 image_create_info.extent.width = tex_width;
15247 image_create_info.extent.height = tex_height;
15248 image_create_info.extent.depth = 1;
15249 image_create_info.mipLevels = 1;
15250 image_create_info.arrayLayers = 1;
15251 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15252 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15253 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15254 image_create_info.flags = 0;
15255
15256 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15257 ASSERT_VK_SUCCESS(err);
15258
15259 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015260 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015261 image_view_create_info.image = image;
15262 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15263 image_view_create_info.format = tex_format;
15264 image_view_create_info.subresourceRange.layerCount = 1;
15265 image_view_create_info.subresourceRange.baseMipLevel = 0;
15266 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015267 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015268
15269 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015270 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015271
15272 m_errorMonitor->VerifyFound();
15273 vkDestroyImage(m_device->device(), image, NULL);
15274 // If last error is success, it still created the view, so delete it.
15275 if (err == VK_SUCCESS) {
15276 vkDestroyImageView(m_device->device(), view, NULL);
15277 }
Mark Youngd339ba32016-05-30 13:28:35 -060015278}
15279
Karl Schultz6addd812016-02-02 17:17:23 -070015280TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015281 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015283
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015284 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015285
Karl Schultz6addd812016-02-02 17:17:23 -070015286 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015287 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015288 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015289 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015290
15291 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015292 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015293 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015294 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15295 image_view_create_info.format = tex_format;
15296 image_view_create_info.subresourceRange.baseMipLevel = 0;
15297 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015298 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015299 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015300 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015301
15302 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015303 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015304
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015305 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015306}
15307
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015308TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015309 VkResult err;
15310 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015311
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015312 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015313
Mike Stroyana3082432015-09-25 13:39:21 -060015314 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015315
15316 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015317 VkImage srcImage;
15318 VkImage dstImage;
15319 VkDeviceMemory srcMem;
15320 VkDeviceMemory destMem;
15321 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015322
15323 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015324 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15325 image_create_info.pNext = NULL;
15326 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15327 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15328 image_create_info.extent.width = 32;
15329 image_create_info.extent.height = 32;
15330 image_create_info.extent.depth = 1;
15331 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015332 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015333 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15334 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15335 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15336 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015337
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015338 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015339 ASSERT_VK_SUCCESS(err);
15340
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015341 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015342 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015343 ASSERT_VK_SUCCESS(err);
15344
15345 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015346 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015347 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15348 memAlloc.pNext = NULL;
15349 memAlloc.allocationSize = 0;
15350 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015351
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015352 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015353 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015354 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015355 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015356 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015357 ASSERT_VK_SUCCESS(err);
15358
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015359 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015360 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015361 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015362 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015363 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015364 ASSERT_VK_SUCCESS(err);
15365
15366 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15367 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015368 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015369 ASSERT_VK_SUCCESS(err);
15370
Tony Barbour552f6c02016-12-21 14:34:07 -070015371 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015372 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015373 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015374 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015375 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015376 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015377 copyRegion.srcOffset.x = 0;
15378 copyRegion.srcOffset.y = 0;
15379 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015380 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015381 copyRegion.dstSubresource.mipLevel = 0;
15382 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015383 // Introduce failure by forcing the dst layerCount to differ from src
15384 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015385 copyRegion.dstOffset.x = 0;
15386 copyRegion.dstOffset.y = 0;
15387 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015388 copyRegion.extent.width = 1;
15389 copyRegion.extent.height = 1;
15390 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015391 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015392 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015393
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015394 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015395
Chia-I Wuf7458c52015-10-26 21:10:41 +080015396 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015397 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015398 vkFreeMemory(m_device->device(), srcMem, NULL);
15399 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015400}
15401
Tony Barbourd6673642016-05-05 14:46:39 -060015402TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015403 TEST_DESCRIPTION("Creating images with unsuported formats ");
15404
15405 ASSERT_NO_FATAL_FAILURE(InitState());
15406 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15407 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015408 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 -060015409 VK_IMAGE_TILING_OPTIMAL, 0);
15410 ASSERT_TRUE(image.initialized());
15411
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015412 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015413 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015414 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015415 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15416 image_create_info.format = VK_FORMAT_UNDEFINED;
15417 image_create_info.extent.width = 32;
15418 image_create_info.extent.height = 32;
15419 image_create_info.extent.depth = 1;
15420 image_create_info.mipLevels = 1;
15421 image_create_info.arrayLayers = 1;
15422 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15423 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15424 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015425
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15427 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015428
15429 VkImage localImage;
15430 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
15431 m_errorMonitor->VerifyFound();
15432
Tony Barbourd6673642016-05-05 14:46:39 -060015433 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015434 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060015435 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15436 VkFormat format = static_cast<VkFormat>(f);
15437 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015438 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015439 unsupported = format;
15440 break;
15441 }
15442 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015443
Tony Barbourd6673642016-05-05 14:46:39 -060015444 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015445 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015447
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015448 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060015449 m_errorMonitor->VerifyFound();
15450 }
15451}
15452
15453TEST_F(VkLayerTest, ImageLayerViewTests) {
15454 VkResult ret;
15455 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15456
15457 ASSERT_NO_FATAL_FAILURE(InitState());
15458
15459 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015460 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 -060015461 VK_IMAGE_TILING_OPTIMAL, 0);
15462 ASSERT_TRUE(image.initialized());
15463
15464 VkImageView imgView;
15465 VkImageViewCreateInfo imgViewInfo = {};
15466 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15467 imgViewInfo.image = image.handle();
15468 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15469 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15470 imgViewInfo.subresourceRange.layerCount = 1;
15471 imgViewInfo.subresourceRange.baseMipLevel = 0;
15472 imgViewInfo.subresourceRange.levelCount = 1;
15473 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15474
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015476 // View can't have baseMipLevel >= image's mipLevels - Expect
15477 // VIEW_CREATE_ERROR
15478 imgViewInfo.subresourceRange.baseMipLevel = 1;
15479 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15480 m_errorMonitor->VerifyFound();
15481 imgViewInfo.subresourceRange.baseMipLevel = 0;
15482
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015484 // View can't have baseArrayLayer >= image's arraySize - Expect
15485 // VIEW_CREATE_ERROR
15486 imgViewInfo.subresourceRange.baseArrayLayer = 1;
15487 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15488 m_errorMonitor->VerifyFound();
15489 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15490
Mike Weiblenc16b2aa2017-01-25 13:02:44 -070015491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015492 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
15493 imgViewInfo.subresourceRange.levelCount = 0;
15494 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15495 m_errorMonitor->VerifyFound();
15496 imgViewInfo.subresourceRange.levelCount = 1;
15497
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015498 m_errorMonitor->SetDesiredFailureMsg(
15499 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15500 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060015501 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
15502 imgViewInfo.subresourceRange.layerCount = 0;
15503 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15504 m_errorMonitor->VerifyFound();
15505 imgViewInfo.subresourceRange.layerCount = 1;
15506
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15508 "Formats MUST be IDENTICAL unless "
15509 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
15510 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060015511 // Can't use depth format for view into color image - Expect INVALID_FORMAT
15512 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
15513 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15514 m_errorMonitor->VerifyFound();
15515 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15516
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060015518 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
15519 // VIEW_CREATE_ERROR
15520 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
15521 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15522 m_errorMonitor->VerifyFound();
15523 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15524
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015526 // TODO: Update framework to easily passing mutable flag into ImageObj init
15527 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070015528 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
15529 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15530 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060015531 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
15532 // VIEW_CREATE_ERROR
15533 VkImageCreateInfo mutImgInfo = image.create_info();
15534 VkImage mutImage;
15535 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015536 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060015537 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
15538 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15539 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
15540 ASSERT_VK_SUCCESS(ret);
15541 imgViewInfo.image = mutImage;
15542 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15543 m_errorMonitor->VerifyFound();
15544 imgViewInfo.image = image.handle();
15545 vkDestroyImage(m_device->handle(), mutImage, NULL);
15546}
15547
15548TEST_F(VkLayerTest, MiscImageLayerTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015549 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
15550
15551 ASSERT_NO_FATAL_FAILURE(InitState());
15552
Rene Lindsay135204f2016-12-22 17:11:09 -070015553 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060015554 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070015555 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 -070015556 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060015557 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060015558 vk_testing::Buffer buffer;
15559 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070015560 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060015561 VkBufferImageCopy region = {};
15562 region.bufferRowLength = 128;
15563 region.bufferImageHeight = 128;
15564 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15565 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070015566 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015567 region.imageExtent.height = 4;
15568 region.imageExtent.width = 4;
15569 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070015570
15571 VkImageObj image2(m_device);
15572 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 -070015573 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070015574 ASSERT_TRUE(image2.initialized());
15575 vk_testing::Buffer buffer2;
15576 VkMemoryPropertyFlags reqs2 = 0;
15577 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
15578 VkBufferImageCopy region2 = {};
15579 region2.bufferRowLength = 128;
15580 region2.bufferImageHeight = 128;
15581 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15582 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
15583 region2.imageSubresource.layerCount = 1;
15584 region2.imageExtent.height = 4;
15585 region2.imageExtent.width = 4;
15586 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015587 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060015588
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070015589 // Image must have offset.z of 0 and extent.depth of 1
15590 // Introduce failure by setting imageExtent.depth to 0
15591 region.imageExtent.depth = 0;
15592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
15593 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015594 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070015595 m_errorMonitor->VerifyFound();
15596
15597 region.imageExtent.depth = 1;
15598
15599 // Image must have offset.z of 0 and extent.depth of 1
15600 // Introduce failure by setting imageOffset.z to 4
15601 region.imageOffset.z = 4;
15602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
15603 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015604 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070015605 m_errorMonitor->VerifyFound();
15606
15607 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015608 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
15609 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070015610 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015612 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
15613 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015614 m_errorMonitor->VerifyFound();
15615
15616 // BufferOffset must be a multiple of 4
15617 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070015618 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070015620 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
15621 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015622 m_errorMonitor->VerifyFound();
15623
15624 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
15625 region.bufferOffset = 0;
15626 region.imageExtent.height = 128;
15627 region.imageExtent.width = 128;
15628 // Introduce failure by setting bufferRowLength > 0 but less than width
15629 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015631 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
15632 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015633 m_errorMonitor->VerifyFound();
15634
15635 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
15636 region.bufferRowLength = 128;
15637 // Introduce failure by setting bufferRowHeight > 0 but less than height
15638 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070015639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015640 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
15641 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060015642 m_errorMonitor->VerifyFound();
15643
15644 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060015645 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070015646 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
15647 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060015648 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070015649 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
15650 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060015651 VkImageBlit blitRegion = {};
15652 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15653 blitRegion.srcSubresource.baseArrayLayer = 0;
15654 blitRegion.srcSubresource.layerCount = 1;
15655 blitRegion.srcSubresource.mipLevel = 0;
15656 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15657 blitRegion.dstSubresource.baseArrayLayer = 0;
15658 blitRegion.dstSubresource.layerCount = 1;
15659 blitRegion.dstSubresource.mipLevel = 0;
15660
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060015661 // Look for NULL-blit warning
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "Offsets specify a zero-volume area.");
15663 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
15664 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060015665 m_errorMonitor->VerifyFound();
15666
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070015667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015668 VkImageMemoryBarrier img_barrier;
15669 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
15670 img_barrier.pNext = NULL;
15671 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
15672 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
15673 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15674 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15675 img_barrier.image = image.handle();
15676 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15677 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
15678 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15679 img_barrier.subresourceRange.baseArrayLayer = 0;
15680 img_barrier.subresourceRange.baseMipLevel = 0;
15681 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
15682 img_barrier.subresourceRange.layerCount = 0;
15683 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015684 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
15685 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060015686 m_errorMonitor->VerifyFound();
15687 img_barrier.subresourceRange.layerCount = 1;
15688}
15689
15690TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060015691 TEST_DESCRIPTION("Exceed the limits of image format ");
15692
Cody Northropc31a84f2016-08-22 10:41:47 -060015693 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060015695 VkImageCreateInfo image_create_info = {};
15696 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15697 image_create_info.pNext = NULL;
15698 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15699 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15700 image_create_info.extent.width = 32;
15701 image_create_info.extent.height = 32;
15702 image_create_info.extent.depth = 1;
15703 image_create_info.mipLevels = 1;
15704 image_create_info.arrayLayers = 1;
15705 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15706 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15707 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15708 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15709 image_create_info.flags = 0;
15710
15711 VkImage nullImg;
15712 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015713 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
15714 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070015715 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015716 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15717 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15718 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070015719 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060015720
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060015722 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
15723 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15724 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15725 m_errorMonitor->VerifyFound();
15726 image_create_info.mipLevels = 1;
15727
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015728 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060015729 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
15730 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15731 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15732 m_errorMonitor->VerifyFound();
15733 image_create_info.arrayLayers = 1;
15734
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060015736 int samples = imgFmtProps.sampleCounts >> 1;
15737 image_create_info.samples = (VkSampleCountFlagBits)samples;
15738 // Expect INVALID_FORMAT_LIMITS_VIOLATION
15739 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15740 m_errorMonitor->VerifyFound();
15741 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15742
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15744 "pCreateInfo->initialLayout, must be "
15745 "VK_IMAGE_LAYOUT_UNDEFINED or "
15746 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060015747 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
15748 // Expect INVALID_LAYOUT
15749 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
15750 m_errorMonitor->VerifyFound();
15751 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15752}
15753
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015754TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015755 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060015756 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015757
15758 ASSERT_NO_FATAL_FAILURE(InitState());
15759
15760 VkImageObj src_image(m_device);
15761 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
15762 VkImageObj dst_image(m_device);
15763 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
15764
Tony Barbour552f6c02016-12-21 14:34:07 -070015765 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015766 VkImageCopy copy_region;
15767 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15768 copy_region.srcSubresource.mipLevel = 0;
15769 copy_region.srcSubresource.baseArrayLayer = 0;
15770 copy_region.srcSubresource.layerCount = 0;
15771 copy_region.srcOffset.x = 0;
15772 copy_region.srcOffset.y = 0;
15773 copy_region.srcOffset.z = 0;
15774 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15775 copy_region.dstSubresource.mipLevel = 0;
15776 copy_region.dstSubresource.baseArrayLayer = 0;
15777 copy_region.dstSubresource.layerCount = 0;
15778 copy_region.dstOffset.x = 0;
15779 copy_region.dstOffset.y = 0;
15780 copy_region.dstOffset.z = 0;
15781 copy_region.extent.width = 64;
15782 copy_region.extent.height = 64;
15783 copy_region.extent.depth = 1;
15784 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
15785 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070015786 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015787
15788 m_errorMonitor->VerifyFound();
15789}
15790
15791TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015792 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060015793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015794
15795 ASSERT_NO_FATAL_FAILURE(InitState());
15796
15797 VkImageObj src_image(m_device);
15798 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
15799 VkImageObj dst_image(m_device);
15800 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
15801
Tony Barbour552f6c02016-12-21 14:34:07 -070015802 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015803 VkImageCopy copy_region;
15804 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15805 copy_region.srcSubresource.mipLevel = 0;
15806 copy_region.srcSubresource.baseArrayLayer = 0;
15807 copy_region.srcSubresource.layerCount = 0;
15808 copy_region.srcOffset.x = 0;
15809 copy_region.srcOffset.y = 0;
15810 copy_region.srcOffset.z = 0;
15811 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15812 copy_region.dstSubresource.mipLevel = 0;
15813 copy_region.dstSubresource.baseArrayLayer = 0;
15814 copy_region.dstSubresource.layerCount = 0;
15815 copy_region.dstOffset.x = 0;
15816 copy_region.dstOffset.y = 0;
15817 copy_region.dstOffset.z = 0;
15818 copy_region.extent.width = 64;
15819 copy_region.extent.height = 64;
15820 copy_region.extent.depth = 1;
15821 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
15822 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070015823 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015824
15825 m_errorMonitor->VerifyFound();
15826}
15827
Karl Schultz6addd812016-02-02 17:17:23 -070015828TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060015829 VkResult err;
15830 bool pass;
15831
15832 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060015834
15835 ASSERT_NO_FATAL_FAILURE(InitState());
15836
15837 // Create two images of different types and try to copy between them
15838 VkImage srcImage;
15839 VkImage dstImage;
15840 VkDeviceMemory srcMem;
15841 VkDeviceMemory destMem;
15842 VkMemoryRequirements memReqs;
15843
15844 VkImageCreateInfo image_create_info = {};
15845 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15846 image_create_info.pNext = NULL;
15847 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15848 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15849 image_create_info.extent.width = 32;
15850 image_create_info.extent.height = 32;
15851 image_create_info.extent.depth = 1;
15852 image_create_info.mipLevels = 1;
15853 image_create_info.arrayLayers = 1;
15854 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15855 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15856 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15857 image_create_info.flags = 0;
15858
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015859 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060015860 ASSERT_VK_SUCCESS(err);
15861
15862 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15863 // Introduce failure by creating second image with a different-sized format.
15864 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
15865
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015866 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060015867 ASSERT_VK_SUCCESS(err);
15868
15869 // Allocate memory
15870 VkMemoryAllocateInfo memAlloc = {};
15871 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15872 memAlloc.pNext = NULL;
15873 memAlloc.allocationSize = 0;
15874 memAlloc.memoryTypeIndex = 0;
15875
15876 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
15877 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015878 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060015879 ASSERT_TRUE(pass);
15880 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
15881 ASSERT_VK_SUCCESS(err);
15882
15883 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
15884 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015885 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060015886 ASSERT_TRUE(pass);
15887 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
15888 ASSERT_VK_SUCCESS(err);
15889
15890 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15891 ASSERT_VK_SUCCESS(err);
15892 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
15893 ASSERT_VK_SUCCESS(err);
15894
Tony Barbour552f6c02016-12-21 14:34:07 -070015895 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060015896 VkImageCopy copyRegion;
15897 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15898 copyRegion.srcSubresource.mipLevel = 0;
15899 copyRegion.srcSubresource.baseArrayLayer = 0;
15900 copyRegion.srcSubresource.layerCount = 0;
15901 copyRegion.srcOffset.x = 0;
15902 copyRegion.srcOffset.y = 0;
15903 copyRegion.srcOffset.z = 0;
15904 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15905 copyRegion.dstSubresource.mipLevel = 0;
15906 copyRegion.dstSubresource.baseArrayLayer = 0;
15907 copyRegion.dstSubresource.layerCount = 0;
15908 copyRegion.dstOffset.x = 0;
15909 copyRegion.dstOffset.y = 0;
15910 copyRegion.dstOffset.z = 0;
15911 copyRegion.extent.width = 1;
15912 copyRegion.extent.height = 1;
15913 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015914 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015915 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060015916
15917 m_errorMonitor->VerifyFound();
15918
15919 vkDestroyImage(m_device->device(), srcImage, NULL);
15920 vkDestroyImage(m_device->device(), dstImage, NULL);
15921 vkFreeMemory(m_device->device(), srcMem, NULL);
15922 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015923}
15924
Karl Schultz6addd812016-02-02 17:17:23 -070015925TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
15926 VkResult err;
15927 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015928
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015929 // Create a color image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15931 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015932
Mike Stroyana3082432015-09-25 13:39:21 -060015933 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015934
15935 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015936 VkImage srcImage;
15937 VkImage dstImage;
15938 VkDeviceMemory srcMem;
15939 VkDeviceMemory destMem;
15940 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015941
15942 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015943 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15944 image_create_info.pNext = NULL;
15945 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15946 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15947 image_create_info.extent.width = 32;
15948 image_create_info.extent.height = 32;
15949 image_create_info.extent.depth = 1;
15950 image_create_info.mipLevels = 1;
15951 image_create_info.arrayLayers = 1;
15952 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15953 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15954 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15955 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015956
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015957 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015958 ASSERT_VK_SUCCESS(err);
15959
Karl Schultzbdb75952016-04-19 11:36:49 -060015960 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15961
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015962 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070015963 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015964 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015965 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015966
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015967 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015968 ASSERT_VK_SUCCESS(err);
15969
15970 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015971 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015972 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15973 memAlloc.pNext = NULL;
15974 memAlloc.allocationSize = 0;
15975 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015976
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015977 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015978 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015979 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015980 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015981 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015982 ASSERT_VK_SUCCESS(err);
15983
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015984 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015985 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015986 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015987 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015988 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015989 ASSERT_VK_SUCCESS(err);
15990
15991 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15992 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015993 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015994 ASSERT_VK_SUCCESS(err);
15995
Tony Barbour552f6c02016-12-21 14:34:07 -070015996 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015997 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015998 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015999 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016000 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016001 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016002 copyRegion.srcOffset.x = 0;
16003 copyRegion.srcOffset.y = 0;
16004 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016005 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016006 copyRegion.dstSubresource.mipLevel = 0;
16007 copyRegion.dstSubresource.baseArrayLayer = 0;
16008 copyRegion.dstSubresource.layerCount = 0;
16009 copyRegion.dstOffset.x = 0;
16010 copyRegion.dstOffset.y = 0;
16011 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016012 copyRegion.extent.width = 1;
16013 copyRegion.extent.height = 1;
16014 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016015 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016016 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016017
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016018 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016019
Chia-I Wuf7458c52015-10-26 21:10:41 +080016020 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016021 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016022 vkFreeMemory(m_device->device(), srcMem, NULL);
16023 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016024}
16025
Karl Schultz6addd812016-02-02 17:17:23 -070016026TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
16027 VkResult err;
16028 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016029
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16031 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016032
Mike Stroyana3082432015-09-25 13:39:21 -060016033 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016034
16035 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070016036 VkImage srcImage;
16037 VkImage dstImage;
16038 VkDeviceMemory srcMem;
16039 VkDeviceMemory destMem;
16040 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016041
16042 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016043 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16044 image_create_info.pNext = NULL;
16045 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16046 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16047 image_create_info.extent.width = 32;
16048 image_create_info.extent.height = 1;
16049 image_create_info.extent.depth = 1;
16050 image_create_info.mipLevels = 1;
16051 image_create_info.arrayLayers = 1;
16052 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16053 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16054 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16055 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016056
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016057 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016058 ASSERT_VK_SUCCESS(err);
16059
Karl Schultz6addd812016-02-02 17:17:23 -070016060 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016061
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016062 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016063 ASSERT_VK_SUCCESS(err);
16064
16065 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016066 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016067 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16068 memAlloc.pNext = NULL;
16069 memAlloc.allocationSize = 0;
16070 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016071
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016072 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016073 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016074 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016075 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016076 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016077 ASSERT_VK_SUCCESS(err);
16078
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016079 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016080 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016081 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016082 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016083 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016084 ASSERT_VK_SUCCESS(err);
16085
16086 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16087 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016088 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016089 ASSERT_VK_SUCCESS(err);
16090
Tony Barbour552f6c02016-12-21 14:34:07 -070016091 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016092 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016093 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16094 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016095 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016096 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016097 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016098 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016099 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016100 resolveRegion.srcOffset.x = 0;
16101 resolveRegion.srcOffset.y = 0;
16102 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016103 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016104 resolveRegion.dstSubresource.mipLevel = 0;
16105 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016106 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016107 resolveRegion.dstOffset.x = 0;
16108 resolveRegion.dstOffset.y = 0;
16109 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016110 resolveRegion.extent.width = 1;
16111 resolveRegion.extent.height = 1;
16112 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016113 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016114 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016115
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016116 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016117
Chia-I Wuf7458c52015-10-26 21:10:41 +080016118 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016119 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016120 vkFreeMemory(m_device->device(), srcMem, NULL);
16121 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016122}
16123
Karl Schultz6addd812016-02-02 17:17:23 -070016124TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
16125 VkResult err;
16126 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016127
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16129 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016130
Mike Stroyana3082432015-09-25 13:39:21 -060016131 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016132
Chris Forbesa7530692016-05-08 12:35:39 +120016133 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070016134 VkImage srcImage;
16135 VkImage dstImage;
16136 VkDeviceMemory srcMem;
16137 VkDeviceMemory destMem;
16138 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016139
16140 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016141 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16142 image_create_info.pNext = NULL;
16143 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16144 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16145 image_create_info.extent.width = 32;
16146 image_create_info.extent.height = 1;
16147 image_create_info.extent.depth = 1;
16148 image_create_info.mipLevels = 1;
16149 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120016150 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016151 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16152 // Note: Some implementations expect color attachment usage for any
16153 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016154 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016155 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016156
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016157 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016158 ASSERT_VK_SUCCESS(err);
16159
Karl Schultz6addd812016-02-02 17:17:23 -070016160 // Note: Some implementations expect color attachment usage for any
16161 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016162 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016163
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016164 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016165 ASSERT_VK_SUCCESS(err);
16166
16167 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016168 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016169 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16170 memAlloc.pNext = NULL;
16171 memAlloc.allocationSize = 0;
16172 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016173
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016174 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016175 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016176 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016177 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016178 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016179 ASSERT_VK_SUCCESS(err);
16180
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016181 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016182 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016183 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016184 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016185 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016186 ASSERT_VK_SUCCESS(err);
16187
16188 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16189 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016190 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016191 ASSERT_VK_SUCCESS(err);
16192
Tony Barbour552f6c02016-12-21 14:34:07 -070016193 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016194 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016195 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16196 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016197 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016198 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016199 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016200 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016201 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016202 resolveRegion.srcOffset.x = 0;
16203 resolveRegion.srcOffset.y = 0;
16204 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016205 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016206 resolveRegion.dstSubresource.mipLevel = 0;
16207 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016208 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016209 resolveRegion.dstOffset.x = 0;
16210 resolveRegion.dstOffset.y = 0;
16211 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016212 resolveRegion.extent.width = 1;
16213 resolveRegion.extent.height = 1;
16214 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016215 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016216 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016217
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016218 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016219
Chia-I Wuf7458c52015-10-26 21:10:41 +080016220 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016221 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016222 vkFreeMemory(m_device->device(), srcMem, NULL);
16223 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016224}
16225
Karl Schultz6addd812016-02-02 17:17:23 -070016226TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
16227 VkResult err;
16228 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016229
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070016230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016231 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016232
Mike Stroyana3082432015-09-25 13:39:21 -060016233 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016234
16235 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016236 VkImage srcImage;
16237 VkImage dstImage;
16238 VkDeviceMemory srcMem;
16239 VkDeviceMemory destMem;
16240 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016241
16242 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016243 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16244 image_create_info.pNext = NULL;
16245 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16246 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16247 image_create_info.extent.width = 32;
16248 image_create_info.extent.height = 1;
16249 image_create_info.extent.depth = 1;
16250 image_create_info.mipLevels = 1;
16251 image_create_info.arrayLayers = 1;
16252 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16253 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16254 // Note: Some implementations expect color attachment usage for any
16255 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016256 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016257 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016258
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016259 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016260 ASSERT_VK_SUCCESS(err);
16261
Karl Schultz6addd812016-02-02 17:17:23 -070016262 // Set format to something other than source image
16263 image_create_info.format = VK_FORMAT_R32_SFLOAT;
16264 // Note: Some implementations expect color attachment usage for any
16265 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016266 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016267 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016268
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016269 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016270 ASSERT_VK_SUCCESS(err);
16271
16272 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016273 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016274 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16275 memAlloc.pNext = NULL;
16276 memAlloc.allocationSize = 0;
16277 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016278
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016279 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016280 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016281 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016282 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016283 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016284 ASSERT_VK_SUCCESS(err);
16285
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016286 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016287 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016288 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016289 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016290 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016291 ASSERT_VK_SUCCESS(err);
16292
16293 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16294 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016295 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016296 ASSERT_VK_SUCCESS(err);
16297
Tony Barbour552f6c02016-12-21 14:34:07 -070016298 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016299 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016300 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16301 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016302 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016303 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016304 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016305 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016306 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016307 resolveRegion.srcOffset.x = 0;
16308 resolveRegion.srcOffset.y = 0;
16309 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016310 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016311 resolveRegion.dstSubresource.mipLevel = 0;
16312 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016313 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016314 resolveRegion.dstOffset.x = 0;
16315 resolveRegion.dstOffset.y = 0;
16316 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016317 resolveRegion.extent.width = 1;
16318 resolveRegion.extent.height = 1;
16319 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016320 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016321 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016322
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016323 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016324
Chia-I Wuf7458c52015-10-26 21:10:41 +080016325 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016326 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016327 vkFreeMemory(m_device->device(), srcMem, NULL);
16328 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016329}
16330
Karl Schultz6addd812016-02-02 17:17:23 -070016331TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
16332 VkResult err;
16333 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016334
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070016335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016336 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016337
Mike Stroyana3082432015-09-25 13:39:21 -060016338 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016339
16340 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016341 VkImage srcImage;
16342 VkImage dstImage;
16343 VkDeviceMemory srcMem;
16344 VkDeviceMemory destMem;
16345 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016346
16347 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016348 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16349 image_create_info.pNext = NULL;
16350 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16351 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16352 image_create_info.extent.width = 32;
16353 image_create_info.extent.height = 1;
16354 image_create_info.extent.depth = 1;
16355 image_create_info.mipLevels = 1;
16356 image_create_info.arrayLayers = 1;
16357 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
16358 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16359 // Note: Some implementations expect color attachment usage for any
16360 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016361 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016362 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016363
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016364 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016365 ASSERT_VK_SUCCESS(err);
16366
Karl Schultz6addd812016-02-02 17:17:23 -070016367 image_create_info.imageType = VK_IMAGE_TYPE_1D;
16368 // Note: Some implementations expect color attachment usage for any
16369 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016370 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016371 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016372
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016373 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016374 ASSERT_VK_SUCCESS(err);
16375
16376 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016377 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016378 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16379 memAlloc.pNext = NULL;
16380 memAlloc.allocationSize = 0;
16381 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016382
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016383 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016384 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016385 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016386 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016387 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016388 ASSERT_VK_SUCCESS(err);
16389
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016390 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016391 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016392 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016393 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016394 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016395 ASSERT_VK_SUCCESS(err);
16396
16397 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16398 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016399 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016400 ASSERT_VK_SUCCESS(err);
16401
Tony Barbour552f6c02016-12-21 14:34:07 -070016402 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016403 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070016404 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
16405 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060016406 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016407 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016408 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016409 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016410 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016411 resolveRegion.srcOffset.x = 0;
16412 resolveRegion.srcOffset.y = 0;
16413 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016414 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016415 resolveRegion.dstSubresource.mipLevel = 0;
16416 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130016417 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016418 resolveRegion.dstOffset.x = 0;
16419 resolveRegion.dstOffset.y = 0;
16420 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016421 resolveRegion.extent.width = 1;
16422 resolveRegion.extent.height = 1;
16423 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016424 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016425 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016426
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016427 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016428
Chia-I Wuf7458c52015-10-26 21:10:41 +080016429 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016430 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016431 vkFreeMemory(m_device->device(), srcMem, NULL);
16432 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016433}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016434
Karl Schultz6addd812016-02-02 17:17:23 -070016435TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016436 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070016437 // to using a DS format, then cause it to hit error due to COLOR_BIT not
16438 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016439 // The image format check comes 2nd in validation so we trigger it first,
16440 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070016441 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016442
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16444 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016445
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016446 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016447
Chia-I Wu1b99bb22015-10-27 19:25:11 +080016448 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016449 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16450 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016451
16452 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016453 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16454 ds_pool_ci.pNext = NULL;
16455 ds_pool_ci.maxSets = 1;
16456 ds_pool_ci.poolSizeCount = 1;
16457 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016458
16459 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016460 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016461 ASSERT_VK_SUCCESS(err);
16462
16463 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016464 dsl_binding.binding = 0;
16465 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16466 dsl_binding.descriptorCount = 1;
16467 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16468 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016469
16470 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016471 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16472 ds_layout_ci.pNext = NULL;
16473 ds_layout_ci.bindingCount = 1;
16474 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016475 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016476 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016477 ASSERT_VK_SUCCESS(err);
16478
16479 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016480 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080016481 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070016482 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016483 alloc_info.descriptorPool = ds_pool;
16484 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016485 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016486 ASSERT_VK_SUCCESS(err);
16487
Karl Schultz6addd812016-02-02 17:17:23 -070016488 VkImage image_bad;
16489 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016490 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060016491 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016492 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070016493 const int32_t tex_width = 32;
16494 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016495
16496 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016497 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16498 image_create_info.pNext = NULL;
16499 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16500 image_create_info.format = tex_format_bad;
16501 image_create_info.extent.width = tex_width;
16502 image_create_info.extent.height = tex_height;
16503 image_create_info.extent.depth = 1;
16504 image_create_info.mipLevels = 1;
16505 image_create_info.arrayLayers = 1;
16506 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16507 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016508 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070016509 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016510
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016511 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016512 ASSERT_VK_SUCCESS(err);
16513 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016514 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16515 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016516 ASSERT_VK_SUCCESS(err);
16517
Rene Lindsayf1e89c82016-12-28 13:18:31 -070016518 // ---Bind image memory---
16519 VkMemoryRequirements img_mem_reqs;
16520 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
16521 VkMemoryAllocateInfo image_alloc_info = {};
16522 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16523 image_alloc_info.pNext = NULL;
16524 image_alloc_info.memoryTypeIndex = 0;
16525 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016526 bool pass =
16527 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 -070016528 ASSERT_TRUE(pass);
16529 VkDeviceMemory mem;
16530 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
16531 ASSERT_VK_SUCCESS(err);
16532 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
16533 ASSERT_VK_SUCCESS(err);
16534 // -----------------------
16535
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016536 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016537 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070016538 image_view_create_info.image = image_bad;
16539 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16540 image_view_create_info.format = tex_format_bad;
16541 image_view_create_info.subresourceRange.baseArrayLayer = 0;
16542 image_view_create_info.subresourceRange.baseMipLevel = 0;
16543 image_view_create_info.subresourceRange.layerCount = 1;
16544 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070016545 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016546
16547 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016548 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016549
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016550 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016551
Chia-I Wuf7458c52015-10-26 21:10:41 +080016552 vkDestroyImage(m_device->device(), image_bad, NULL);
16553 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016554 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16555 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070016556
16557 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060016558}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016559
16560TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016561 TEST_DESCRIPTION(
16562 "Call ClearColorImage w/ a depth|stencil image and "
16563 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016564
16565 ASSERT_NO_FATAL_FAILURE(InitState());
16566 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16567
Tony Barbour552f6c02016-12-21 14:34:07 -070016568 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016569
16570 // Color image
16571 VkClearColorValue clear_color;
16572 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
16573 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
16574 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
16575 const int32_t img_width = 32;
16576 const int32_t img_height = 32;
16577 VkImageCreateInfo image_create_info = {};
16578 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16579 image_create_info.pNext = NULL;
16580 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16581 image_create_info.format = color_format;
16582 image_create_info.extent.width = img_width;
16583 image_create_info.extent.height = img_height;
16584 image_create_info.extent.depth = 1;
16585 image_create_info.mipLevels = 1;
16586 image_create_info.arrayLayers = 1;
16587 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16588 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16589 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16590
16591 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016592 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016593
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016594 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016595
16596 // Depth/Stencil image
16597 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016598 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016599 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
16600 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
16601 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
16602 ds_image_create_info.extent.width = 64;
16603 ds_image_create_info.extent.height = 64;
16604 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070016605 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 -060016606
16607 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016608 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016609
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016610 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 -060016611
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016612 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016613
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016614 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016615 &color_range);
16616
16617 m_errorMonitor->VerifyFound();
16618
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16620 "vkCmdClearColorImage called with "
16621 "image created without "
16622 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060016623
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070016624 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060016625 &color_range);
16626
16627 m_errorMonitor->VerifyFound();
16628
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016629 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16631 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016632
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016633 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
16634 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060016635
16636 m_errorMonitor->VerifyFound();
16637}
Tobin Ehliscde08892015-09-22 10:11:37 -060016638
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016639// WSI Enabled Tests
16640//
Chris Forbes09368e42016-10-13 11:59:22 +130016641#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016642TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
16643
16644#if defined(VK_USE_PLATFORM_XCB_KHR)
16645 VkSurfaceKHR surface = VK_NULL_HANDLE;
16646
16647 VkResult err;
16648 bool pass;
16649 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
16650 VkSwapchainCreateInfoKHR swapchain_create_info = {};
16651 // uint32_t swapchain_image_count = 0;
16652 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
16653 // uint32_t image_index = 0;
16654 // VkPresentInfoKHR present_info = {};
16655
16656 ASSERT_NO_FATAL_FAILURE(InitState());
16657
16658 // Use the create function from one of the VK_KHR_*_surface extension in
16659 // order to create a surface, testing all known errors in the process,
16660 // before successfully creating a surface:
16661 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
16662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
16663 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
16664 pass = (err != VK_SUCCESS);
16665 ASSERT_TRUE(pass);
16666 m_errorMonitor->VerifyFound();
16667
16668 // Next, try to create a surface with the wrong
16669 // VkXcbSurfaceCreateInfoKHR::sType:
16670 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
16671 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
16672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
16673 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
16674 pass = (err != VK_SUCCESS);
16675 ASSERT_TRUE(pass);
16676 m_errorMonitor->VerifyFound();
16677
16678 // Create a native window, and then correctly create a surface:
16679 xcb_connection_t *connection;
16680 xcb_screen_t *screen;
16681 xcb_window_t xcb_window;
16682 xcb_intern_atom_reply_t *atom_wm_delete_window;
16683
16684 const xcb_setup_t *setup;
16685 xcb_screen_iterator_t iter;
16686 int scr;
16687 uint32_t value_mask, value_list[32];
16688 int width = 1;
16689 int height = 1;
16690
16691 connection = xcb_connect(NULL, &scr);
16692 ASSERT_TRUE(connection != NULL);
16693 setup = xcb_get_setup(connection);
16694 iter = xcb_setup_roots_iterator(setup);
16695 while (scr-- > 0)
16696 xcb_screen_next(&iter);
16697 screen = iter.data;
16698
16699 xcb_window = xcb_generate_id(connection);
16700
16701 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
16702 value_list[0] = screen->black_pixel;
16703 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
16704
16705 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
16706 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
16707
16708 /* Magic code that will send notification when window is destroyed */
16709 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
16710 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
16711
16712 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
16713 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
16714 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
16715 free(reply);
16716
16717 xcb_map_window(connection, xcb_window);
16718
16719 // Force the x/y coordinates to 100,100 results are identical in consecutive
16720 // runs
16721 const uint32_t coords[] = { 100, 100 };
16722 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
16723
16724 // Finally, try to correctly create a surface:
16725 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
16726 xcb_create_info.pNext = NULL;
16727 xcb_create_info.flags = 0;
16728 xcb_create_info.connection = connection;
16729 xcb_create_info.window = xcb_window;
16730 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
16731 pass = (err == VK_SUCCESS);
16732 ASSERT_TRUE(pass);
16733
16734 // Check if surface supports presentation:
16735
16736 // 1st, do so without having queried the queue families:
16737 VkBool32 supported = false;
16738 // TODO: Get the following error to come out:
16739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16740 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
16741 "function");
16742 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
16743 pass = (err != VK_SUCCESS);
16744 // ASSERT_TRUE(pass);
16745 // m_errorMonitor->VerifyFound();
16746
16747 // Next, query a queue family index that's too large:
16748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
16749 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
16750 pass = (err != VK_SUCCESS);
16751 ASSERT_TRUE(pass);
16752 m_errorMonitor->VerifyFound();
16753
16754 // Finally, do so correctly:
16755 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
16756 // SUPPORTED
16757 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
16758 pass = (err == VK_SUCCESS);
16759 ASSERT_TRUE(pass);
16760
16761 // Before proceeding, try to create a swapchain without having called
16762 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
16763 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
16764 swapchain_create_info.pNext = NULL;
16765 swapchain_create_info.flags = 0;
16766 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16767 swapchain_create_info.surface = surface;
16768 swapchain_create_info.imageArrayLayers = 1;
16769 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
16770 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
16771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16772 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
16773 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16774 pass = (err != VK_SUCCESS);
16775 ASSERT_TRUE(pass);
16776 m_errorMonitor->VerifyFound();
16777
16778 // Get the surface capabilities:
16779 VkSurfaceCapabilitiesKHR surface_capabilities;
16780
16781 // Do so correctly (only error logged by this entrypoint is if the
16782 // extension isn't enabled):
16783 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
16784 pass = (err == VK_SUCCESS);
16785 ASSERT_TRUE(pass);
16786
16787 // Get the surface formats:
16788 uint32_t surface_format_count;
16789
16790 // First, try without a pointer to surface_format_count:
16791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
16792 "specified as NULL");
16793 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
16794 pass = (err == VK_SUCCESS);
16795 ASSERT_TRUE(pass);
16796 m_errorMonitor->VerifyFound();
16797
16798 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
16799 // correctly done a 1st try (to get the count):
16800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
16801 surface_format_count = 0;
16802 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
16803 pass = (err == VK_SUCCESS);
16804 ASSERT_TRUE(pass);
16805 m_errorMonitor->VerifyFound();
16806
16807 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
16808 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
16809 pass = (err == VK_SUCCESS);
16810 ASSERT_TRUE(pass);
16811
16812 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
16813 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
16814
16815 // Next, do a 2nd try with surface_format_count being set too high:
16816 surface_format_count += 5;
16817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
16818 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
16819 pass = (err == VK_SUCCESS);
16820 ASSERT_TRUE(pass);
16821 m_errorMonitor->VerifyFound();
16822
16823 // Finally, do a correct 1st and 2nd try:
16824 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
16825 pass = (err == VK_SUCCESS);
16826 ASSERT_TRUE(pass);
16827 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
16828 pass = (err == VK_SUCCESS);
16829 ASSERT_TRUE(pass);
16830
16831 // Get the surface present modes:
16832 uint32_t surface_present_mode_count;
16833
16834 // First, try without a pointer to surface_format_count:
16835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
16836 "specified as NULL");
16837
16838 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
16839 pass = (err == VK_SUCCESS);
16840 ASSERT_TRUE(pass);
16841 m_errorMonitor->VerifyFound();
16842
16843 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
16844 // correctly done a 1st try (to get the count):
16845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
16846 surface_present_mode_count = 0;
16847 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
16848 (VkPresentModeKHR *)&surface_present_mode_count);
16849 pass = (err == VK_SUCCESS);
16850 ASSERT_TRUE(pass);
16851 m_errorMonitor->VerifyFound();
16852
16853 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
16854 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
16855 pass = (err == VK_SUCCESS);
16856 ASSERT_TRUE(pass);
16857
16858 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
16859 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
16860
16861 // Next, do a 2nd try with surface_format_count being set too high:
16862 surface_present_mode_count += 5;
16863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
16864 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
16865 pass = (err == VK_SUCCESS);
16866 ASSERT_TRUE(pass);
16867 m_errorMonitor->VerifyFound();
16868
16869 // Finally, do a correct 1st and 2nd try:
16870 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
16871 pass = (err == VK_SUCCESS);
16872 ASSERT_TRUE(pass);
16873 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
16874 pass = (err == VK_SUCCESS);
16875 ASSERT_TRUE(pass);
16876
16877 // Create a swapchain:
16878
16879 // First, try without a pointer to swapchain_create_info:
16880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
16881 "specified as NULL");
16882
16883 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
16884 pass = (err != VK_SUCCESS);
16885 ASSERT_TRUE(pass);
16886 m_errorMonitor->VerifyFound();
16887
16888 // Next, call with a non-NULL swapchain_create_info, that has the wrong
16889 // sType:
16890 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
16891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
16892
16893 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16894 pass = (err != VK_SUCCESS);
16895 ASSERT_TRUE(pass);
16896 m_errorMonitor->VerifyFound();
16897
16898 // Next, call with a NULL swapchain pointer:
16899 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
16900 swapchain_create_info.pNext = NULL;
16901 swapchain_create_info.flags = 0;
16902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
16903 "specified as NULL");
16904
16905 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
16906 pass = (err != VK_SUCCESS);
16907 ASSERT_TRUE(pass);
16908 m_errorMonitor->VerifyFound();
16909
16910 // TODO: Enhance swapchain layer so that
16911 // swapchain_create_info.queueFamilyIndexCount is checked against something?
16912
16913 // Next, call with a queue family index that's too large:
16914 uint32_t queueFamilyIndex[2] = { 100000, 0 };
16915 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
16916 swapchain_create_info.queueFamilyIndexCount = 2;
16917 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
16918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
16919 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16920 pass = (err != VK_SUCCESS);
16921 ASSERT_TRUE(pass);
16922 m_errorMonitor->VerifyFound();
16923
16924 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
16925 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
16926 swapchain_create_info.queueFamilyIndexCount = 1;
16927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16928 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
16929 "pCreateInfo->pQueueFamilyIndices).");
16930 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16931 pass = (err != VK_SUCCESS);
16932 ASSERT_TRUE(pass);
16933 m_errorMonitor->VerifyFound();
16934
16935 // Next, call with an invalid imageSharingMode:
16936 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
16937 swapchain_create_info.queueFamilyIndexCount = 1;
16938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16939 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
16940 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16941 pass = (err != VK_SUCCESS);
16942 ASSERT_TRUE(pass);
16943 m_errorMonitor->VerifyFound();
16944 // Fix for the future:
16945 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
16946 // SUPPORTED
16947 swapchain_create_info.queueFamilyIndexCount = 0;
16948 queueFamilyIndex[0] = 0;
16949 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
16950
16951 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
16952 // Get the images from a swapchain:
16953 // Acquire an image from a swapchain:
16954 // Present an image to a swapchain:
16955 // Destroy the swapchain:
16956
16957 // TODOs:
16958 //
16959 // - Try destroying the device without first destroying the swapchain
16960 //
16961 // - Try destroying the device without first destroying the surface
16962 //
16963 // - Try destroying the surface without first destroying the swapchain
16964
16965 // Destroy the surface:
16966 vkDestroySurfaceKHR(instance(), surface, NULL);
16967
16968 // Tear down the window:
16969 xcb_destroy_window(connection, xcb_window);
16970 xcb_disconnect(connection);
16971
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016972#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016973 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016974#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016975}
Chris Forbes09368e42016-10-13 11:59:22 +130016976#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016977
16978//
16979// POSITIVE VALIDATION TESTS
16980//
16981// These tests do not expect to encounter ANY validation errors pass only if this is true
16982
Tobin Ehlise0006882016-11-03 10:14:28 -060016983TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016984 TEST_DESCRIPTION(
16985 "Perform an image layout transition in a secondary command buffer followed "
16986 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060016987 VkResult err;
16988 m_errorMonitor->ExpectSuccess();
16989 ASSERT_NO_FATAL_FAILURE(InitState());
16990 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16991 // Allocate a secondary and primary cmd buffer
16992 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
16993 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
16994 command_buffer_allocate_info.commandPool = m_commandPool;
16995 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
16996 command_buffer_allocate_info.commandBufferCount = 1;
16997
16998 VkCommandBuffer secondary_command_buffer;
16999 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
17000 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17001 VkCommandBuffer primary_command_buffer;
17002 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
17003 VkCommandBufferBeginInfo command_buffer_begin_info = {};
17004 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
17005 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
17006 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17007 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
17008 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
17009
17010 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
17011 ASSERT_VK_SUCCESS(err);
17012 VkImageObj image(m_device);
17013 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17014 ASSERT_TRUE(image.initialized());
17015 VkImageMemoryBarrier img_barrier = {};
17016 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17017 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17018 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17019 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17020 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17021 img_barrier.image = image.handle();
17022 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17023 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17024 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17025 img_barrier.subresourceRange.baseArrayLayer = 0;
17026 img_barrier.subresourceRange.baseMipLevel = 0;
17027 img_barrier.subresourceRange.layerCount = 1;
17028 img_barrier.subresourceRange.levelCount = 1;
17029 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
17030 0, nullptr, 1, &img_barrier);
17031 err = vkEndCommandBuffer(secondary_command_buffer);
17032 ASSERT_VK_SUCCESS(err);
17033
17034 // Now update primary cmd buffer to execute secondary and transitions image
17035 command_buffer_begin_info.pInheritanceInfo = nullptr;
17036 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
17037 ASSERT_VK_SUCCESS(err);
17038 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
17039 VkImageMemoryBarrier img_barrier2 = {};
17040 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17041 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17042 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17043 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17044 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17045 img_barrier2.image = image.handle();
17046 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17047 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17048 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17049 img_barrier2.subresourceRange.baseArrayLayer = 0;
17050 img_barrier2.subresourceRange.baseMipLevel = 0;
17051 img_barrier2.subresourceRange.layerCount = 1;
17052 img_barrier2.subresourceRange.levelCount = 1;
17053 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
17054 nullptr, 1, &img_barrier2);
17055 err = vkEndCommandBuffer(primary_command_buffer);
17056 ASSERT_VK_SUCCESS(err);
17057 VkSubmitInfo submit_info = {};
17058 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17059 submit_info.commandBufferCount = 1;
17060 submit_info.pCommandBuffers = &primary_command_buffer;
17061 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
17062 ASSERT_VK_SUCCESS(err);
17063 m_errorMonitor->VerifyNotFound();
17064 err = vkDeviceWaitIdle(m_device->device());
17065 ASSERT_VK_SUCCESS(err);
17066 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &secondary_command_buffer);
17067 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &primary_command_buffer);
17068}
17069
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017070// This is a positive test. No failures are expected.
17071TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017072 TEST_DESCRIPTION(
17073 "Ensure that the vkUpdateDescriptorSets validation code "
17074 "is ignoring VkWriteDescriptorSet members that are not "
17075 "related to the descriptor type specified by "
17076 "VkWriteDescriptorSet::descriptorType. Correct "
17077 "validation behavior will result in the test running to "
17078 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017079
17080 const uintptr_t invalid_ptr = 0xcdcdcdcd;
17081
17082 ASSERT_NO_FATAL_FAILURE(InitState());
17083
17084 // Image Case
17085 {
17086 m_errorMonitor->ExpectSuccess();
17087
17088 VkImage image;
17089 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
17090 const int32_t tex_width = 32;
17091 const int32_t tex_height = 32;
17092 VkImageCreateInfo image_create_info = {};
17093 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17094 image_create_info.pNext = NULL;
17095 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17096 image_create_info.format = tex_format;
17097 image_create_info.extent.width = tex_width;
17098 image_create_info.extent.height = tex_height;
17099 image_create_info.extent.depth = 1;
17100 image_create_info.mipLevels = 1;
17101 image_create_info.arrayLayers = 1;
17102 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17103 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17104 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17105 image_create_info.flags = 0;
17106 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
17107 ASSERT_VK_SUCCESS(err);
17108
17109 VkMemoryRequirements memory_reqs;
17110 VkDeviceMemory image_memory;
17111 bool pass;
17112 VkMemoryAllocateInfo memory_info = {};
17113 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17114 memory_info.pNext = NULL;
17115 memory_info.allocationSize = 0;
17116 memory_info.memoryTypeIndex = 0;
17117 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
17118 memory_info.allocationSize = memory_reqs.size;
17119 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17120 ASSERT_TRUE(pass);
17121 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
17122 ASSERT_VK_SUCCESS(err);
17123 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
17124 ASSERT_VK_SUCCESS(err);
17125
17126 VkImageViewCreateInfo image_view_create_info = {};
17127 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
17128 image_view_create_info.image = image;
17129 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17130 image_view_create_info.format = tex_format;
17131 image_view_create_info.subresourceRange.layerCount = 1;
17132 image_view_create_info.subresourceRange.baseMipLevel = 0;
17133 image_view_create_info.subresourceRange.levelCount = 1;
17134 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17135
17136 VkImageView view;
17137 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
17138 ASSERT_VK_SUCCESS(err);
17139
17140 VkDescriptorPoolSize ds_type_count = {};
17141 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17142 ds_type_count.descriptorCount = 1;
17143
17144 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17145 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17146 ds_pool_ci.pNext = NULL;
17147 ds_pool_ci.maxSets = 1;
17148 ds_pool_ci.poolSizeCount = 1;
17149 ds_pool_ci.pPoolSizes = &ds_type_count;
17150
17151 VkDescriptorPool ds_pool;
17152 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17153 ASSERT_VK_SUCCESS(err);
17154
17155 VkDescriptorSetLayoutBinding dsl_binding = {};
17156 dsl_binding.binding = 0;
17157 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17158 dsl_binding.descriptorCount = 1;
17159 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17160 dsl_binding.pImmutableSamplers = NULL;
17161
17162 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17163 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17164 ds_layout_ci.pNext = NULL;
17165 ds_layout_ci.bindingCount = 1;
17166 ds_layout_ci.pBindings = &dsl_binding;
17167 VkDescriptorSetLayout ds_layout;
17168 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17169 ASSERT_VK_SUCCESS(err);
17170
17171 VkDescriptorSet descriptor_set;
17172 VkDescriptorSetAllocateInfo alloc_info = {};
17173 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17174 alloc_info.descriptorSetCount = 1;
17175 alloc_info.descriptorPool = ds_pool;
17176 alloc_info.pSetLayouts = &ds_layout;
17177 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17178 ASSERT_VK_SUCCESS(err);
17179
17180 VkDescriptorImageInfo image_info = {};
17181 image_info.imageView = view;
17182 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
17183
17184 VkWriteDescriptorSet descriptor_write;
17185 memset(&descriptor_write, 0, sizeof(descriptor_write));
17186 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17187 descriptor_write.dstSet = descriptor_set;
17188 descriptor_write.dstBinding = 0;
17189 descriptor_write.descriptorCount = 1;
17190 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17191 descriptor_write.pImageInfo = &image_info;
17192
17193 // Set pBufferInfo and pTexelBufferView to invalid values, which should
17194 // be
17195 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
17196 // This will most likely produce a crash if the parameter_validation
17197 // layer
17198 // does not correctly ignore pBufferInfo.
17199 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
17200 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
17201
17202 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17203
17204 m_errorMonitor->VerifyNotFound();
17205
17206 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17207 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17208 vkDestroyImageView(m_device->device(), view, NULL);
17209 vkDestroyImage(m_device->device(), image, NULL);
17210 vkFreeMemory(m_device->device(), image_memory, NULL);
17211 }
17212
17213 // Buffer Case
17214 {
17215 m_errorMonitor->ExpectSuccess();
17216
17217 VkBuffer buffer;
17218 uint32_t queue_family_index = 0;
17219 VkBufferCreateInfo buffer_create_info = {};
17220 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17221 buffer_create_info.size = 1024;
17222 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17223 buffer_create_info.queueFamilyIndexCount = 1;
17224 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
17225
17226 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
17227 ASSERT_VK_SUCCESS(err);
17228
17229 VkMemoryRequirements memory_reqs;
17230 VkDeviceMemory buffer_memory;
17231 bool pass;
17232 VkMemoryAllocateInfo memory_info = {};
17233 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17234 memory_info.pNext = NULL;
17235 memory_info.allocationSize = 0;
17236 memory_info.memoryTypeIndex = 0;
17237
17238 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
17239 memory_info.allocationSize = memory_reqs.size;
17240 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17241 ASSERT_TRUE(pass);
17242
17243 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
17244 ASSERT_VK_SUCCESS(err);
17245 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
17246 ASSERT_VK_SUCCESS(err);
17247
17248 VkDescriptorPoolSize ds_type_count = {};
17249 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17250 ds_type_count.descriptorCount = 1;
17251
17252 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17253 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17254 ds_pool_ci.pNext = NULL;
17255 ds_pool_ci.maxSets = 1;
17256 ds_pool_ci.poolSizeCount = 1;
17257 ds_pool_ci.pPoolSizes = &ds_type_count;
17258
17259 VkDescriptorPool ds_pool;
17260 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17261 ASSERT_VK_SUCCESS(err);
17262
17263 VkDescriptorSetLayoutBinding dsl_binding = {};
17264 dsl_binding.binding = 0;
17265 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17266 dsl_binding.descriptorCount = 1;
17267 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17268 dsl_binding.pImmutableSamplers = NULL;
17269
17270 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17271 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17272 ds_layout_ci.pNext = NULL;
17273 ds_layout_ci.bindingCount = 1;
17274 ds_layout_ci.pBindings = &dsl_binding;
17275 VkDescriptorSetLayout ds_layout;
17276 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17277 ASSERT_VK_SUCCESS(err);
17278
17279 VkDescriptorSet descriptor_set;
17280 VkDescriptorSetAllocateInfo alloc_info = {};
17281 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17282 alloc_info.descriptorSetCount = 1;
17283 alloc_info.descriptorPool = ds_pool;
17284 alloc_info.pSetLayouts = &ds_layout;
17285 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17286 ASSERT_VK_SUCCESS(err);
17287
17288 VkDescriptorBufferInfo buffer_info = {};
17289 buffer_info.buffer = buffer;
17290 buffer_info.offset = 0;
17291 buffer_info.range = 1024;
17292
17293 VkWriteDescriptorSet descriptor_write;
17294 memset(&descriptor_write, 0, sizeof(descriptor_write));
17295 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17296 descriptor_write.dstSet = descriptor_set;
17297 descriptor_write.dstBinding = 0;
17298 descriptor_write.descriptorCount = 1;
17299 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17300 descriptor_write.pBufferInfo = &buffer_info;
17301
17302 // Set pImageInfo and pTexelBufferView to invalid values, which should
17303 // be
17304 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
17305 // This will most likely produce a crash if the parameter_validation
17306 // layer
17307 // does not correctly ignore pImageInfo.
17308 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
17309 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
17310
17311 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17312
17313 m_errorMonitor->VerifyNotFound();
17314
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017315 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17316 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17317 vkDestroyBuffer(m_device->device(), buffer, NULL);
17318 vkFreeMemory(m_device->device(), buffer_memory, NULL);
17319 }
17320
17321 // Texel Buffer Case
17322 {
17323 m_errorMonitor->ExpectSuccess();
17324
17325 VkBuffer buffer;
17326 uint32_t queue_family_index = 0;
17327 VkBufferCreateInfo buffer_create_info = {};
17328 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17329 buffer_create_info.size = 1024;
17330 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
17331 buffer_create_info.queueFamilyIndexCount = 1;
17332 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
17333
17334 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
17335 ASSERT_VK_SUCCESS(err);
17336
17337 VkMemoryRequirements memory_reqs;
17338 VkDeviceMemory buffer_memory;
17339 bool pass;
17340 VkMemoryAllocateInfo memory_info = {};
17341 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17342 memory_info.pNext = NULL;
17343 memory_info.allocationSize = 0;
17344 memory_info.memoryTypeIndex = 0;
17345
17346 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
17347 memory_info.allocationSize = memory_reqs.size;
17348 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17349 ASSERT_TRUE(pass);
17350
17351 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
17352 ASSERT_VK_SUCCESS(err);
17353 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
17354 ASSERT_VK_SUCCESS(err);
17355
17356 VkBufferViewCreateInfo buff_view_ci = {};
17357 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
17358 buff_view_ci.buffer = buffer;
17359 buff_view_ci.format = VK_FORMAT_R8_UNORM;
17360 buff_view_ci.range = VK_WHOLE_SIZE;
17361 VkBufferView buffer_view;
17362 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
17363
17364 VkDescriptorPoolSize ds_type_count = {};
17365 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
17366 ds_type_count.descriptorCount = 1;
17367
17368 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17369 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17370 ds_pool_ci.pNext = NULL;
17371 ds_pool_ci.maxSets = 1;
17372 ds_pool_ci.poolSizeCount = 1;
17373 ds_pool_ci.pPoolSizes = &ds_type_count;
17374
17375 VkDescriptorPool ds_pool;
17376 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17377 ASSERT_VK_SUCCESS(err);
17378
17379 VkDescriptorSetLayoutBinding dsl_binding = {};
17380 dsl_binding.binding = 0;
17381 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
17382 dsl_binding.descriptorCount = 1;
17383 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17384 dsl_binding.pImmutableSamplers = NULL;
17385
17386 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17387 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17388 ds_layout_ci.pNext = NULL;
17389 ds_layout_ci.bindingCount = 1;
17390 ds_layout_ci.pBindings = &dsl_binding;
17391 VkDescriptorSetLayout ds_layout;
17392 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17393 ASSERT_VK_SUCCESS(err);
17394
17395 VkDescriptorSet descriptor_set;
17396 VkDescriptorSetAllocateInfo alloc_info = {};
17397 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17398 alloc_info.descriptorSetCount = 1;
17399 alloc_info.descriptorPool = ds_pool;
17400 alloc_info.pSetLayouts = &ds_layout;
17401 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17402 ASSERT_VK_SUCCESS(err);
17403
17404 VkWriteDescriptorSet descriptor_write;
17405 memset(&descriptor_write, 0, sizeof(descriptor_write));
17406 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17407 descriptor_write.dstSet = descriptor_set;
17408 descriptor_write.dstBinding = 0;
17409 descriptor_write.descriptorCount = 1;
17410 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
17411 descriptor_write.pTexelBufferView = &buffer_view;
17412
17413 // Set pImageInfo and pBufferInfo to invalid values, which should be
17414 // ignored for descriptorType ==
17415 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
17416 // This will most likely produce a crash if the parameter_validation
17417 // layer
17418 // does not correctly ignore pImageInfo and pBufferInfo.
17419 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
17420 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
17421
17422 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17423
17424 m_errorMonitor->VerifyNotFound();
17425
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017426 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17427 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17428 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
17429 vkDestroyBuffer(m_device->device(), buffer, NULL);
17430 vkFreeMemory(m_device->device(), buffer_memory, NULL);
17431 }
17432}
17433
Tobin Ehlisf7428442016-10-25 07:58:24 -060017434TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
17435 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
17436
17437 ASSERT_NO_FATAL_FAILURE(InitState());
17438 // Create layout where two binding #s are "1"
17439 static const uint32_t NUM_BINDINGS = 3;
17440 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
17441 dsl_binding[0].binding = 1;
17442 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17443 dsl_binding[0].descriptorCount = 1;
17444 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17445 dsl_binding[0].pImmutableSamplers = NULL;
17446 dsl_binding[1].binding = 0;
17447 dsl_binding[1].descriptorCount = 1;
17448 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17449 dsl_binding[1].descriptorCount = 1;
17450 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17451 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017452 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060017453 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17454 dsl_binding[2].descriptorCount = 1;
17455 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17456 dsl_binding[2].pImmutableSamplers = NULL;
17457
17458 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17459 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17460 ds_layout_ci.pNext = NULL;
17461 ds_layout_ci.bindingCount = NUM_BINDINGS;
17462 ds_layout_ci.pBindings = dsl_binding;
17463 VkDescriptorSetLayout ds_layout;
17464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
17465 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17466 m_errorMonitor->VerifyFound();
17467}
17468
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060017469TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017470 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
17471
17472 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017473
Tony Barbour552f6c02016-12-21 14:34:07 -070017474 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017475
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060017476 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
17477
17478 {
17479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
17480 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
17481 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17482 m_errorMonitor->VerifyFound();
17483 }
17484
17485 {
17486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
17487 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
17488 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17489 m_errorMonitor->VerifyFound();
17490 }
17491
17492 {
17493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
17494 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
17495 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17496 m_errorMonitor->VerifyFound();
17497 }
17498
17499 {
17500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
17501 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
17502 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17503 m_errorMonitor->VerifyFound();
17504 }
17505
17506 {
17507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
17508 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
17509 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17510 m_errorMonitor->VerifyFound();
17511 }
17512
17513 {
17514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
17515 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
17516 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
17517 m_errorMonitor->VerifyFound();
17518 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017519
17520 {
17521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
17522 VkRect2D scissor = {{-1, 0}, {16, 16}};
17523 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17524 m_errorMonitor->VerifyFound();
17525 }
17526
17527 {
17528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
17529 VkRect2D scissor = {{0, -2}, {16, 16}};
17530 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17531 m_errorMonitor->VerifyFound();
17532 }
17533
17534 {
17535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
17536 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
17537 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17538 m_errorMonitor->VerifyFound();
17539 }
17540
17541 {
17542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
17543 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
17544 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17545 m_errorMonitor->VerifyFound();
17546 }
17547
Tony Barbour552f6c02016-12-21 14:34:07 -070017548 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060017549}
17550
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017551// This is a positive test. No failures are expected.
17552TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
17553 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
17554 VkResult err;
17555
17556 ASSERT_NO_FATAL_FAILURE(InitState());
17557 m_errorMonitor->ExpectSuccess();
17558 VkDescriptorPoolSize ds_type_count = {};
17559 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17560 ds_type_count.descriptorCount = 2;
17561
17562 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17563 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17564 ds_pool_ci.pNext = NULL;
17565 ds_pool_ci.maxSets = 1;
17566 ds_pool_ci.poolSizeCount = 1;
17567 ds_pool_ci.pPoolSizes = &ds_type_count;
17568
17569 VkDescriptorPool ds_pool;
17570 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17571 ASSERT_VK_SUCCESS(err);
17572
17573 // Create layout with two uniform buffer descriptors w/ empty binding between them
17574 static const uint32_t NUM_BINDINGS = 3;
17575 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
17576 dsl_binding[0].binding = 0;
17577 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17578 dsl_binding[0].descriptorCount = 1;
17579 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
17580 dsl_binding[0].pImmutableSamplers = NULL;
17581 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017582 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017583 dsl_binding[2].binding = 2;
17584 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17585 dsl_binding[2].descriptorCount = 1;
17586 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
17587 dsl_binding[2].pImmutableSamplers = NULL;
17588
17589 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17590 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17591 ds_layout_ci.pNext = NULL;
17592 ds_layout_ci.bindingCount = NUM_BINDINGS;
17593 ds_layout_ci.pBindings = dsl_binding;
17594 VkDescriptorSetLayout ds_layout;
17595 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17596 ASSERT_VK_SUCCESS(err);
17597
17598 VkDescriptorSet descriptor_set = {};
17599 VkDescriptorSetAllocateInfo alloc_info = {};
17600 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17601 alloc_info.descriptorSetCount = 1;
17602 alloc_info.descriptorPool = ds_pool;
17603 alloc_info.pSetLayouts = &ds_layout;
17604 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17605 ASSERT_VK_SUCCESS(err);
17606
17607 // Create a buffer to be used for update
17608 VkBufferCreateInfo buff_ci = {};
17609 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17610 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17611 buff_ci.size = 256;
17612 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17613 VkBuffer buffer;
17614 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
17615 ASSERT_VK_SUCCESS(err);
17616 // Have to bind memory to buffer before descriptor update
17617 VkMemoryAllocateInfo mem_alloc = {};
17618 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17619 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017620 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017621 mem_alloc.memoryTypeIndex = 0;
17622
17623 VkMemoryRequirements mem_reqs;
17624 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
17625 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
17626 if (!pass) {
17627 vkDestroyBuffer(m_device->device(), buffer, NULL);
17628 return;
17629 }
17630
17631 VkDeviceMemory mem;
17632 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
17633 ASSERT_VK_SUCCESS(err);
17634 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
17635 ASSERT_VK_SUCCESS(err);
17636
17637 // Only update the descriptor at binding 2
17638 VkDescriptorBufferInfo buff_info = {};
17639 buff_info.buffer = buffer;
17640 buff_info.offset = 0;
17641 buff_info.range = VK_WHOLE_SIZE;
17642 VkWriteDescriptorSet descriptor_write = {};
17643 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17644 descriptor_write.dstBinding = 2;
17645 descriptor_write.descriptorCount = 1;
17646 descriptor_write.pTexelBufferView = nullptr;
17647 descriptor_write.pBufferInfo = &buff_info;
17648 descriptor_write.pImageInfo = nullptr;
17649 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
17650 descriptor_write.dstSet = descriptor_set;
17651
17652 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17653
17654 m_errorMonitor->VerifyNotFound();
17655 // Cleanup
17656 vkFreeMemory(m_device->device(), mem, NULL);
17657 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17658 vkDestroyBuffer(m_device->device(), buffer, NULL);
17659 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17660}
17661
17662// This is a positive test. No failures are expected.
17663TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
17664 VkResult err;
17665 bool pass;
17666
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017667 TEST_DESCRIPTION(
17668 "Create a buffer, allocate memory, bind memory, destroy "
17669 "the buffer, create an image, and bind the same memory to "
17670 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017671
17672 m_errorMonitor->ExpectSuccess();
17673
17674 ASSERT_NO_FATAL_FAILURE(InitState());
17675
17676 VkBuffer buffer;
17677 VkImage image;
17678 VkDeviceMemory mem;
17679 VkMemoryRequirements mem_reqs;
17680
17681 VkBufferCreateInfo buf_info = {};
17682 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17683 buf_info.pNext = NULL;
17684 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17685 buf_info.size = 256;
17686 buf_info.queueFamilyIndexCount = 0;
17687 buf_info.pQueueFamilyIndices = NULL;
17688 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17689 buf_info.flags = 0;
17690 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
17691 ASSERT_VK_SUCCESS(err);
17692
17693 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
17694
17695 VkMemoryAllocateInfo alloc_info = {};
17696 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17697 alloc_info.pNext = NULL;
17698 alloc_info.memoryTypeIndex = 0;
17699
17700 // Ensure memory is big enough for both bindings
17701 alloc_info.allocationSize = 0x10000;
17702
17703 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
17704 if (!pass) {
17705 vkDestroyBuffer(m_device->device(), buffer, NULL);
17706 return;
17707 }
17708
17709 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
17710 ASSERT_VK_SUCCESS(err);
17711
17712 uint8_t *pData;
17713 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
17714 ASSERT_VK_SUCCESS(err);
17715
17716 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
17717
17718 vkUnmapMemory(m_device->device(), mem);
17719
17720 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
17721 ASSERT_VK_SUCCESS(err);
17722
17723 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
17724 // memory. In fact, it was never used by the GPU.
17725 // Just be be sure, wait for idle.
17726 vkDestroyBuffer(m_device->device(), buffer, NULL);
17727 vkDeviceWaitIdle(m_device->device());
17728
Tobin Ehlis6a005702016-12-28 15:25:56 -070017729 // Use optimal as some platforms report linear support but then fail image creation
17730 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
17731 VkImageFormatProperties image_format_properties;
17732 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
17733 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
17734 if (image_format_properties.maxExtent.width == 0) {
17735 printf("Image format not supported; skipped.\n");
17736 vkFreeMemory(m_device->device(), mem, NULL);
17737 return;
17738 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017739 VkImageCreateInfo image_create_info = {};
17740 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17741 image_create_info.pNext = NULL;
17742 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17743 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
17744 image_create_info.extent.width = 64;
17745 image_create_info.extent.height = 64;
17746 image_create_info.extent.depth = 1;
17747 image_create_info.mipLevels = 1;
17748 image_create_info.arrayLayers = 1;
17749 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070017750 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017751 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
17752 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17753 image_create_info.queueFamilyIndexCount = 0;
17754 image_create_info.pQueueFamilyIndices = NULL;
17755 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17756 image_create_info.flags = 0;
17757
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017758 /* Create a mappable image. It will be the texture if linear images are ok
17759 * to be textures or it will be the staging image if they are not.
17760 */
17761 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
17762 ASSERT_VK_SUCCESS(err);
17763
17764 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
17765
Tobin Ehlis6a005702016-12-28 15:25:56 -070017766 VkMemoryAllocateInfo mem_alloc = {};
17767 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17768 mem_alloc.pNext = NULL;
17769 mem_alloc.allocationSize = 0;
17770 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017771 mem_alloc.allocationSize = mem_reqs.size;
17772
17773 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
17774 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070017775 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017776 vkDestroyImage(m_device->device(), image, NULL);
17777 return;
17778 }
17779
17780 // VALIDATION FAILURE:
17781 err = vkBindImageMemory(m_device->device(), image, mem, 0);
17782 ASSERT_VK_SUCCESS(err);
17783
17784 m_errorMonitor->VerifyNotFound();
17785
17786 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017787 vkDestroyImage(m_device->device(), image, NULL);
17788}
17789
Tony Barbourab713912017-02-02 14:17:35 -070017790// This is a positive test. No failures are expected.
17791TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
17792 VkResult err;
17793
17794 TEST_DESCRIPTION(
17795 "Call all applicable destroy and free routines with NULL"
17796 "handles, expecting no validation errors");
17797
17798 m_errorMonitor->ExpectSuccess();
17799
17800 ASSERT_NO_FATAL_FAILURE(InitState());
17801 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
17802 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
17803 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
17804 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
17805 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
17806 vkDestroyDevice(VK_NULL_HANDLE, NULL);
17807 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
17808 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
17809 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
17810 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
17811 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
17812 vkDestroyInstance(VK_NULL_HANDLE, NULL);
17813 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
17814 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
17815 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
17816 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
17817 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
17818 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
17819 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
17820 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
17821
17822 VkCommandPool command_pool;
17823 VkCommandPoolCreateInfo pool_create_info{};
17824 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17825 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17826 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17827 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17828 VkCommandBuffer command_buffers[3] = {};
17829 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17830 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17831 command_buffer_allocate_info.commandPool = command_pool;
17832 command_buffer_allocate_info.commandBufferCount = 1;
17833 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17834 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
17835 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
17836 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
17837
17838 VkDescriptorPoolSize ds_type_count = {};
17839 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17840 ds_type_count.descriptorCount = 1;
17841
17842 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17843 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17844 ds_pool_ci.pNext = NULL;
17845 ds_pool_ci.maxSets = 1;
17846 ds_pool_ci.poolSizeCount = 1;
17847 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
17848 ds_pool_ci.pPoolSizes = &ds_type_count;
17849
17850 VkDescriptorPool ds_pool;
17851 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17852 ASSERT_VK_SUCCESS(err);
17853
17854 VkDescriptorSetLayoutBinding dsl_binding = {};
17855 dsl_binding.binding = 2;
17856 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17857 dsl_binding.descriptorCount = 1;
17858 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17859 dsl_binding.pImmutableSamplers = NULL;
17860 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17861 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17862 ds_layout_ci.pNext = NULL;
17863 ds_layout_ci.bindingCount = 1;
17864 ds_layout_ci.pBindings = &dsl_binding;
17865 VkDescriptorSetLayout ds_layout;
17866 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17867 ASSERT_VK_SUCCESS(err);
17868
17869 VkDescriptorSet descriptor_sets[3] = {};
17870 VkDescriptorSetAllocateInfo alloc_info = {};
17871 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17872 alloc_info.descriptorSetCount = 1;
17873 alloc_info.descriptorPool = ds_pool;
17874 alloc_info.pSetLayouts = &ds_layout;
17875 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
17876 ASSERT_VK_SUCCESS(err);
17877 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
17878 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17879 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17880
17881 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
17882
17883 m_errorMonitor->VerifyNotFound();
17884}
17885
Tony Barbour626994c2017-02-08 15:29:37 -070017886TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070017887 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070017888
17889 m_errorMonitor->ExpectSuccess();
17890
17891 ASSERT_NO_FATAL_FAILURE(InitState());
17892 VkCommandBuffer cmd_bufs[4];
17893 VkCommandBufferAllocateInfo alloc_info;
17894 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17895 alloc_info.pNext = NULL;
17896 alloc_info.commandBufferCount = 4;
17897 alloc_info.commandPool = m_commandPool;
17898 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17899 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
17900 VkImageObj image(m_device);
17901 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17902 ASSERT_TRUE(image.initialized());
17903 VkCommandBufferBeginInfo cb_binfo;
17904 cb_binfo.pNext = NULL;
17905 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17906 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
17907 cb_binfo.flags = 0;
17908 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
17909 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
17910 VkImageMemoryBarrier img_barrier = {};
17911 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17912 img_barrier.pNext = NULL;
17913 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17914 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17915 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17916 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
17917 img_barrier.image = image.handle();
17918 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17919 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17920 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17921 img_barrier.subresourceRange.baseArrayLayer = 0;
17922 img_barrier.subresourceRange.baseMipLevel = 0;
17923 img_barrier.subresourceRange.layerCount = 1;
17924 img_barrier.subresourceRange.levelCount = 1;
17925 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17926 &img_barrier);
17927 vkEndCommandBuffer(cmd_bufs[0]);
17928 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
17929 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
17930 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17931 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17932 &img_barrier);
17933 vkEndCommandBuffer(cmd_bufs[1]);
17934 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
17935 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17936 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
17937 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17938 &img_barrier);
17939 vkEndCommandBuffer(cmd_bufs[2]);
17940 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
17941 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
17942 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
17943 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
17944 &img_barrier);
17945 vkEndCommandBuffer(cmd_bufs[3]);
17946
17947 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
17948 VkSemaphore semaphore1, semaphore2;
17949 VkSemaphoreCreateInfo semaphore_create_info{};
17950 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
17951 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
17952 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
17953 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
17954 VkSubmitInfo submit_info[3];
17955 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17956 submit_info[0].pNext = nullptr;
17957 submit_info[0].commandBufferCount = 1;
17958 submit_info[0].pCommandBuffers = &cmd_bufs[0];
17959 submit_info[0].signalSemaphoreCount = 1;
17960 submit_info[0].pSignalSemaphores = &semaphore1;
17961 submit_info[0].waitSemaphoreCount = 0;
17962 submit_info[0].pWaitDstStageMask = nullptr;
17963 submit_info[0].pWaitDstStageMask = flags;
17964 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17965 submit_info[1].pNext = nullptr;
17966 submit_info[1].commandBufferCount = 1;
17967 submit_info[1].pCommandBuffers = &cmd_bufs[1];
17968 submit_info[1].waitSemaphoreCount = 1;
17969 submit_info[1].pWaitSemaphores = &semaphore1;
17970 submit_info[1].signalSemaphoreCount = 1;
17971 submit_info[1].pSignalSemaphores = &semaphore2;
17972 submit_info[1].pWaitDstStageMask = flags;
17973 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17974 submit_info[2].pNext = nullptr;
17975 submit_info[2].commandBufferCount = 2;
17976 submit_info[2].pCommandBuffers = &cmd_bufs[2];
17977 submit_info[2].waitSemaphoreCount = 1;
17978 submit_info[2].pWaitSemaphores = &semaphore2;
17979 submit_info[2].signalSemaphoreCount = 0;
17980 submit_info[2].pSignalSemaphores = nullptr;
17981 submit_info[2].pWaitDstStageMask = flags;
17982 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
17983 vkQueueWaitIdle(m_device->m_queue);
17984
17985 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
17986 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
17987 m_errorMonitor->VerifyNotFound();
17988}
17989
Tobin Ehlis953e8392016-11-17 10:54:13 -070017990TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
17991 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
17992 // We previously had a bug where dynamic offset of inactive bindings was still being used
17993 VkResult err;
17994 m_errorMonitor->ExpectSuccess();
17995
17996 ASSERT_NO_FATAL_FAILURE(InitState());
17997 ASSERT_NO_FATAL_FAILURE(InitViewport());
17998 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17999
18000 VkDescriptorPoolSize ds_type_count = {};
18001 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
18002 ds_type_count.descriptorCount = 3;
18003
18004 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18005 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18006 ds_pool_ci.pNext = NULL;
18007 ds_pool_ci.maxSets = 1;
18008 ds_pool_ci.poolSizeCount = 1;
18009 ds_pool_ci.pPoolSizes = &ds_type_count;
18010
18011 VkDescriptorPool ds_pool;
18012 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18013 ASSERT_VK_SUCCESS(err);
18014
18015 const uint32_t BINDING_COUNT = 3;
18016 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070018017 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070018018 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
18019 dsl_binding[0].descriptorCount = 1;
18020 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18021 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070018022 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070018023 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
18024 dsl_binding[1].descriptorCount = 1;
18025 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18026 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070018027 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070018028 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
18029 dsl_binding[2].descriptorCount = 1;
18030 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18031 dsl_binding[2].pImmutableSamplers = NULL;
18032
18033 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18034 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18035 ds_layout_ci.pNext = NULL;
18036 ds_layout_ci.bindingCount = BINDING_COUNT;
18037 ds_layout_ci.pBindings = dsl_binding;
18038 VkDescriptorSetLayout ds_layout;
18039 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18040 ASSERT_VK_SUCCESS(err);
18041
18042 VkDescriptorSet descriptor_set;
18043 VkDescriptorSetAllocateInfo alloc_info = {};
18044 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18045 alloc_info.descriptorSetCount = 1;
18046 alloc_info.descriptorPool = ds_pool;
18047 alloc_info.pSetLayouts = &ds_layout;
18048 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18049 ASSERT_VK_SUCCESS(err);
18050
18051 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
18052 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
18053 pipeline_layout_ci.pNext = NULL;
18054 pipeline_layout_ci.setLayoutCount = 1;
18055 pipeline_layout_ci.pSetLayouts = &ds_layout;
18056
18057 VkPipelineLayout pipeline_layout;
18058 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
18059 ASSERT_VK_SUCCESS(err);
18060
18061 // Create two buffers to update the descriptors with
18062 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
18063 uint32_t qfi = 0;
18064 VkBufferCreateInfo buffCI = {};
18065 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18066 buffCI.size = 2048;
18067 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18068 buffCI.queueFamilyIndexCount = 1;
18069 buffCI.pQueueFamilyIndices = &qfi;
18070
18071 VkBuffer dyub1;
18072 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
18073 ASSERT_VK_SUCCESS(err);
18074 // buffer2
18075 buffCI.size = 1024;
18076 VkBuffer dyub2;
18077 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
18078 ASSERT_VK_SUCCESS(err);
18079 // Allocate memory and bind to buffers
18080 VkMemoryAllocateInfo mem_alloc[2] = {};
18081 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18082 mem_alloc[0].pNext = NULL;
18083 mem_alloc[0].memoryTypeIndex = 0;
18084 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18085 mem_alloc[1].pNext = NULL;
18086 mem_alloc[1].memoryTypeIndex = 0;
18087
18088 VkMemoryRequirements mem_reqs1;
18089 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
18090 VkMemoryRequirements mem_reqs2;
18091 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
18092 mem_alloc[0].allocationSize = mem_reqs1.size;
18093 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
18094 mem_alloc[1].allocationSize = mem_reqs2.size;
18095 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
18096 if (!pass) {
18097 vkDestroyBuffer(m_device->device(), dyub1, NULL);
18098 vkDestroyBuffer(m_device->device(), dyub2, NULL);
18099 return;
18100 }
18101
18102 VkDeviceMemory mem1;
18103 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
18104 ASSERT_VK_SUCCESS(err);
18105 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
18106 ASSERT_VK_SUCCESS(err);
18107 VkDeviceMemory mem2;
18108 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
18109 ASSERT_VK_SUCCESS(err);
18110 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
18111 ASSERT_VK_SUCCESS(err);
18112 // Update descriptors
18113 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
18114 buff_info[0].buffer = dyub1;
18115 buff_info[0].offset = 0;
18116 buff_info[0].range = 256;
18117 buff_info[1].buffer = dyub1;
18118 buff_info[1].offset = 256;
18119 buff_info[1].range = 512;
18120 buff_info[2].buffer = dyub2;
18121 buff_info[2].offset = 0;
18122 buff_info[2].range = 512;
18123
18124 VkWriteDescriptorSet descriptor_write;
18125 memset(&descriptor_write, 0, sizeof(descriptor_write));
18126 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18127 descriptor_write.dstSet = descriptor_set;
18128 descriptor_write.dstBinding = 0;
18129 descriptor_write.descriptorCount = BINDING_COUNT;
18130 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
18131 descriptor_write.pBufferInfo = buff_info;
18132
18133 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18134
Tony Barbour552f6c02016-12-21 14:34:07 -070018135 m_commandBuffer->BeginCommandBuffer();
18136 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070018137
18138 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018139 char const *vsSource =
18140 "#version 450\n"
18141 "\n"
18142 "out gl_PerVertex { \n"
18143 " vec4 gl_Position;\n"
18144 "};\n"
18145 "void main(){\n"
18146 " gl_Position = vec4(1);\n"
18147 "}\n";
18148 char const *fsSource =
18149 "#version 450\n"
18150 "\n"
18151 "layout(location=0) out vec4 x;\n"
18152 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
18153 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
18154 "void main(){\n"
18155 " x = vec4(bar1.y) + vec4(bar2.y);\n"
18156 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070018157 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
18158 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
18159 VkPipelineObj pipe(m_device);
18160 pipe.SetViewport(m_viewports);
18161 pipe.SetScissor(m_scissors);
18162 pipe.AddShader(&vs);
18163 pipe.AddShader(&fs);
18164 pipe.AddColorAttachment();
18165 pipe.CreateVKPipeline(pipeline_layout, renderPass());
18166
18167 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
18168 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
18169 // we used to have a bug in this case.
18170 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
18171 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
18172 &descriptor_set, BINDING_COUNT, dyn_off);
18173 Draw(1, 0, 0, 0);
18174 m_errorMonitor->VerifyNotFound();
18175
18176 vkDestroyBuffer(m_device->device(), dyub1, NULL);
18177 vkDestroyBuffer(m_device->device(), dyub2, NULL);
18178 vkFreeMemory(m_device->device(), mem1, NULL);
18179 vkFreeMemory(m_device->device(), mem2, NULL);
18180
18181 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
18182 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18183 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18184}
18185
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018186TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018187 TEST_DESCRIPTION(
18188 "Ensure that validations handling of non-coherent memory "
18189 "mapping while using VK_WHOLE_SIZE does not cause access "
18190 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018191 VkResult err;
18192 uint8_t *pData;
18193 ASSERT_NO_FATAL_FAILURE(InitState());
18194
18195 VkDeviceMemory mem;
18196 VkMemoryRequirements mem_reqs;
18197 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018198 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018199 VkMemoryAllocateInfo alloc_info = {};
18200 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18201 alloc_info.pNext = NULL;
18202 alloc_info.memoryTypeIndex = 0;
18203
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018204 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018205 alloc_info.allocationSize = allocation_size;
18206
18207 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
18208 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 -070018209 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018210 if (!pass) {
18211 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018212 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
18213 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018214 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018215 pass = m_device->phy().set_memory_type(
18216 mem_reqs.memoryTypeBits, &alloc_info,
18217 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
18218 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018219 if (!pass) {
18220 return;
18221 }
18222 }
18223 }
18224
18225 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
18226 ASSERT_VK_SUCCESS(err);
18227
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018228 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018229 m_errorMonitor->ExpectSuccess();
18230 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
18231 ASSERT_VK_SUCCESS(err);
18232 VkMappedMemoryRange mmr = {};
18233 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18234 mmr.memory = mem;
18235 mmr.offset = 0;
18236 mmr.size = VK_WHOLE_SIZE;
18237 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18238 ASSERT_VK_SUCCESS(err);
18239 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
18240 ASSERT_VK_SUCCESS(err);
18241 m_errorMonitor->VerifyNotFound();
18242 vkUnmapMemory(m_device->device(), mem);
18243
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018244 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018245 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018246 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018247 ASSERT_VK_SUCCESS(err);
18248 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18249 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018250 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018251 mmr.size = VK_WHOLE_SIZE;
18252 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18253 ASSERT_VK_SUCCESS(err);
18254 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
18255 ASSERT_VK_SUCCESS(err);
18256 m_errorMonitor->VerifyNotFound();
18257 vkUnmapMemory(m_device->device(), mem);
18258
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018259 // Map with offset and size
18260 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018261 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018262 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018263 ASSERT_VK_SUCCESS(err);
18264 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18265 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018266 mmr.offset = 4 * atom_size;
18267 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018268 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18269 ASSERT_VK_SUCCESS(err);
18270 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
18271 ASSERT_VK_SUCCESS(err);
18272 m_errorMonitor->VerifyNotFound();
18273 vkUnmapMemory(m_device->device(), mem);
18274
18275 // Map without offset and flush WHOLE_SIZE with two separate offsets
18276 m_errorMonitor->ExpectSuccess();
18277 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
18278 ASSERT_VK_SUCCESS(err);
18279 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
18280 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018281 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018282 mmr.size = VK_WHOLE_SIZE;
18283 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18284 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070018285 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018286 mmr.size = VK_WHOLE_SIZE;
18287 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
18288 ASSERT_VK_SUCCESS(err);
18289 m_errorMonitor->VerifyNotFound();
18290 vkUnmapMemory(m_device->device(), mem);
18291
18292 vkFreeMemory(m_device->device(), mem, NULL);
18293}
18294
18295// This is a positive test. We used to expect error in this case but spec now allows it
18296TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
18297 m_errorMonitor->ExpectSuccess();
18298 vk_testing::Fence testFence;
18299 VkFenceCreateInfo fenceInfo = {};
18300 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18301 fenceInfo.pNext = NULL;
18302
18303 ASSERT_NO_FATAL_FAILURE(InitState());
18304 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018305 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018306 VkResult result = vkResetFences(m_device->device(), 1, fences);
18307 ASSERT_VK_SUCCESS(result);
18308
18309 m_errorMonitor->VerifyNotFound();
18310}
18311
18312TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
18313 m_errorMonitor->ExpectSuccess();
18314
18315 ASSERT_NO_FATAL_FAILURE(InitState());
18316 VkResult err;
18317
18318 // Record (empty!) command buffer that can be submitted multiple times
18319 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018320 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
18321 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018322 m_commandBuffer->BeginCommandBuffer(&cbbi);
18323 m_commandBuffer->EndCommandBuffer();
18324
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018325 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018326 VkFence fence;
18327 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
18328 ASSERT_VK_SUCCESS(err);
18329
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018330 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018331 VkSemaphore s1, s2;
18332 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
18333 ASSERT_VK_SUCCESS(err);
18334 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
18335 ASSERT_VK_SUCCESS(err);
18336
18337 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018338 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018339 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
18340 ASSERT_VK_SUCCESS(err);
18341
18342 // Submit CB again, signaling s2.
18343 si.pSignalSemaphores = &s2;
18344 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
18345 ASSERT_VK_SUCCESS(err);
18346
18347 // Wait for fence.
18348 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18349 ASSERT_VK_SUCCESS(err);
18350
18351 // CB is still in flight from second submission, but semaphore s1 is no
18352 // longer in flight. delete it.
18353 vkDestroySemaphore(m_device->device(), s1, nullptr);
18354
18355 m_errorMonitor->VerifyNotFound();
18356
18357 // Force device idle and clean up remaining objects
18358 vkDeviceWaitIdle(m_device->device());
18359 vkDestroySemaphore(m_device->device(), s2, nullptr);
18360 vkDestroyFence(m_device->device(), fence, nullptr);
18361}
18362
18363TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
18364 m_errorMonitor->ExpectSuccess();
18365
18366 ASSERT_NO_FATAL_FAILURE(InitState());
18367 VkResult err;
18368
18369 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018370 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018371 VkFence f1;
18372 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
18373 ASSERT_VK_SUCCESS(err);
18374
18375 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018376 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018377 VkFence f2;
18378 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
18379 ASSERT_VK_SUCCESS(err);
18380
18381 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018382 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018383 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
18384
18385 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018386 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018387 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
18388
18389 // Should have both retired!
18390 vkDestroyFence(m_device->device(), f1, nullptr);
18391 vkDestroyFence(m_device->device(), f2, nullptr);
18392
18393 m_errorMonitor->VerifyNotFound();
18394}
18395
18396TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018397 TEST_DESCRIPTION(
18398 "Verify that creating an image view from an image with valid usage "
18399 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018400
18401 ASSERT_NO_FATAL_FAILURE(InitState());
18402
18403 m_errorMonitor->ExpectSuccess();
18404 // Verify that we can create a view with usage INPUT_ATTACHMENT
18405 VkImageObj image(m_device);
18406 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18407 ASSERT_TRUE(image.initialized());
18408 VkImageView imageView;
18409 VkImageViewCreateInfo ivci = {};
18410 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18411 ivci.image = image.handle();
18412 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
18413 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
18414 ivci.subresourceRange.layerCount = 1;
18415 ivci.subresourceRange.baseMipLevel = 0;
18416 ivci.subresourceRange.levelCount = 1;
18417 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18418
18419 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
18420 m_errorMonitor->VerifyNotFound();
18421 vkDestroyImageView(m_device->device(), imageView, NULL);
18422}
18423
18424// This is a positive test. No failures are expected.
18425TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018426 TEST_DESCRIPTION(
18427 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
18428 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018429
18430 ASSERT_NO_FATAL_FAILURE(InitState());
18431
18432 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018433 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018434
18435 m_errorMonitor->ExpectSuccess();
18436
18437 VkImage image;
18438 VkImageCreateInfo image_create_info = {};
18439 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18440 image_create_info.pNext = NULL;
18441 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18442 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18443 image_create_info.extent.width = 64;
18444 image_create_info.extent.height = 64;
18445 image_create_info.extent.depth = 1;
18446 image_create_info.mipLevels = 1;
18447 image_create_info.arrayLayers = 1;
18448 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18449 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18450 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
18451 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
18452 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18453 ASSERT_VK_SUCCESS(err);
18454
18455 VkMemoryRequirements memory_reqs;
18456 VkDeviceMemory memory_one, memory_two;
18457 bool pass;
18458 VkMemoryAllocateInfo memory_info = {};
18459 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18460 memory_info.pNext = NULL;
18461 memory_info.allocationSize = 0;
18462 memory_info.memoryTypeIndex = 0;
18463 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18464 // Find an image big enough to allow sparse mapping of 2 memory regions
18465 // Increase the image size until it is at least twice the
18466 // size of the required alignment, to ensure we can bind both
18467 // allocated memory blocks to the image on aligned offsets.
18468 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
18469 vkDestroyImage(m_device->device(), image, nullptr);
18470 image_create_info.extent.width *= 2;
18471 image_create_info.extent.height *= 2;
18472 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
18473 ASSERT_VK_SUCCESS(err);
18474 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18475 }
18476 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
18477 // at the end of the first
18478 memory_info.allocationSize = memory_reqs.alignment;
18479 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18480 ASSERT_TRUE(pass);
18481 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
18482 ASSERT_VK_SUCCESS(err);
18483 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
18484 ASSERT_VK_SUCCESS(err);
18485 VkSparseMemoryBind binds[2];
18486 binds[0].flags = 0;
18487 binds[0].memory = memory_one;
18488 binds[0].memoryOffset = 0;
18489 binds[0].resourceOffset = 0;
18490 binds[0].size = memory_info.allocationSize;
18491 binds[1].flags = 0;
18492 binds[1].memory = memory_two;
18493 binds[1].memoryOffset = 0;
18494 binds[1].resourceOffset = memory_info.allocationSize;
18495 binds[1].size = memory_info.allocationSize;
18496
18497 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
18498 opaqueBindInfo.image = image;
18499 opaqueBindInfo.bindCount = 2;
18500 opaqueBindInfo.pBinds = binds;
18501
18502 VkFence fence = VK_NULL_HANDLE;
18503 VkBindSparseInfo bindSparseInfo = {};
18504 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
18505 bindSparseInfo.imageOpaqueBindCount = 1;
18506 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
18507
18508 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
18509 vkQueueWaitIdle(m_device->m_queue);
18510 vkDestroyImage(m_device->device(), image, NULL);
18511 vkFreeMemory(m_device->device(), memory_one, NULL);
18512 vkFreeMemory(m_device->device(), memory_two, NULL);
18513 m_errorMonitor->VerifyNotFound();
18514}
18515
18516TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018517 TEST_DESCRIPTION(
18518 "Ensure that CmdBeginRenderPass with an attachment's "
18519 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
18520 "the command buffer has prior knowledge of that "
18521 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018522
18523 m_errorMonitor->ExpectSuccess();
18524
18525 ASSERT_NO_FATAL_FAILURE(InitState());
18526
18527 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018528 VkAttachmentDescription attachment = {0,
18529 VK_FORMAT_R8G8B8A8_UNORM,
18530 VK_SAMPLE_COUNT_1_BIT,
18531 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18532 VK_ATTACHMENT_STORE_OP_STORE,
18533 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18534 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18535 VK_IMAGE_LAYOUT_UNDEFINED,
18536 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018537
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018538 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018539
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018540 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018541
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018542 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018543
18544 VkRenderPass rp;
18545 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18546 ASSERT_VK_SUCCESS(err);
18547
18548 // A compatible framebuffer.
18549 VkImageObj image(m_device);
18550 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18551 ASSERT_TRUE(image.initialized());
18552
18553 VkImageViewCreateInfo ivci = {
18554 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18555 nullptr,
18556 0,
18557 image.handle(),
18558 VK_IMAGE_VIEW_TYPE_2D,
18559 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018560 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
18561 VK_COMPONENT_SWIZZLE_IDENTITY},
18562 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018563 };
18564 VkImageView view;
18565 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18566 ASSERT_VK_SUCCESS(err);
18567
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018568 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018569 VkFramebuffer fb;
18570 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18571 ASSERT_VK_SUCCESS(err);
18572
18573 // Record a single command buffer which uses this renderpass twice. The
18574 // bug is triggered at the beginning of the second renderpass, when the
18575 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018576 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 -070018577 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018578 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18579 vkCmdEndRenderPass(m_commandBuffer->handle());
18580 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18581
18582 m_errorMonitor->VerifyNotFound();
18583
18584 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070018585 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018586
18587 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18588 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18589 vkDestroyImageView(m_device->device(), view, nullptr);
18590}
18591
18592TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018593 TEST_DESCRIPTION(
18594 "This test should pass. Create a Framebuffer and "
18595 "command buffer, bind them together, then destroy "
18596 "command pool and framebuffer and verify there are no "
18597 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018598
18599 m_errorMonitor->ExpectSuccess();
18600
18601 ASSERT_NO_FATAL_FAILURE(InitState());
18602
18603 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018604 VkAttachmentDescription attachment = {0,
18605 VK_FORMAT_R8G8B8A8_UNORM,
18606 VK_SAMPLE_COUNT_1_BIT,
18607 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18608 VK_ATTACHMENT_STORE_OP_STORE,
18609 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18610 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18611 VK_IMAGE_LAYOUT_UNDEFINED,
18612 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018613
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018614 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018615
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018616 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018617
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018618 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018619
18620 VkRenderPass rp;
18621 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18622 ASSERT_VK_SUCCESS(err);
18623
18624 // A compatible framebuffer.
18625 VkImageObj image(m_device);
18626 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18627 ASSERT_TRUE(image.initialized());
18628
18629 VkImageViewCreateInfo ivci = {
18630 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18631 nullptr,
18632 0,
18633 image.handle(),
18634 VK_IMAGE_VIEW_TYPE_2D,
18635 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018636 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
18637 VK_COMPONENT_SWIZZLE_IDENTITY},
18638 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018639 };
18640 VkImageView view;
18641 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18642 ASSERT_VK_SUCCESS(err);
18643
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018644 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018645 VkFramebuffer fb;
18646 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18647 ASSERT_VK_SUCCESS(err);
18648
18649 // Explicitly create a command buffer to bind the FB to so that we can then
18650 // destroy the command pool in order to implicitly free command buffer
18651 VkCommandPool command_pool;
18652 VkCommandPoolCreateInfo pool_create_info{};
18653 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18654 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18655 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18656 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18657
18658 VkCommandBuffer command_buffer;
18659 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18660 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18661 command_buffer_allocate_info.commandPool = command_pool;
18662 command_buffer_allocate_info.commandBufferCount = 1;
18663 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18664 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
18665
18666 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018667 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 -060018668 VkCommandBufferBeginInfo begin_info{};
18669 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18670 vkBeginCommandBuffer(command_buffer, &begin_info);
18671
18672 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18673 vkCmdEndRenderPass(command_buffer);
18674 vkEndCommandBuffer(command_buffer);
18675 vkDestroyImageView(m_device->device(), view, nullptr);
18676 // Destroy command pool to implicitly free command buffer
18677 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18678 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18679 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18680 m_errorMonitor->VerifyNotFound();
18681}
18682
18683TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018684 TEST_DESCRIPTION(
18685 "Ensure that CmdBeginRenderPass applies the layout "
18686 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018687
18688 m_errorMonitor->ExpectSuccess();
18689
18690 ASSERT_NO_FATAL_FAILURE(InitState());
18691
18692 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018693 VkAttachmentDescription attachment = {0,
18694 VK_FORMAT_R8G8B8A8_UNORM,
18695 VK_SAMPLE_COUNT_1_BIT,
18696 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18697 VK_ATTACHMENT_STORE_OP_STORE,
18698 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18699 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18700 VK_IMAGE_LAYOUT_UNDEFINED,
18701 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018702
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018703 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018704
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018705 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018706
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018707 VkSubpassDependency dep = {0,
18708 0,
18709 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18710 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18711 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18712 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18713 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018714
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018715 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018716
18717 VkResult err;
18718 VkRenderPass rp;
18719 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18720 ASSERT_VK_SUCCESS(err);
18721
18722 // A compatible framebuffer.
18723 VkImageObj image(m_device);
18724 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18725 ASSERT_TRUE(image.initialized());
18726
18727 VkImageViewCreateInfo ivci = {
18728 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18729 nullptr,
18730 0,
18731 image.handle(),
18732 VK_IMAGE_VIEW_TYPE_2D,
18733 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018734 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
18735 VK_COMPONENT_SWIZZLE_IDENTITY},
18736 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018737 };
18738 VkImageView view;
18739 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18740 ASSERT_VK_SUCCESS(err);
18741
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018742 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018743 VkFramebuffer fb;
18744 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18745 ASSERT_VK_SUCCESS(err);
18746
18747 // Record a single command buffer which issues a pipeline barrier w/
18748 // image memory barrier for the attachment. This detects the previously
18749 // missing tracking of the subpass layout by throwing a validation error
18750 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018751 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 -070018752 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018753 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18754
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018755 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
18756 nullptr,
18757 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18758 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18759 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
18760 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
18761 VK_QUEUE_FAMILY_IGNORED,
18762 VK_QUEUE_FAMILY_IGNORED,
18763 image.handle(),
18764 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018765 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018766 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
18767 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018768
18769 vkCmdEndRenderPass(m_commandBuffer->handle());
18770 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070018771 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018772
18773 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18774 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18775 vkDestroyImageView(m_device->device(), view, nullptr);
18776}
18777
18778TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018779 TEST_DESCRIPTION(
18780 "Validate that when an imageView of a depth/stencil image "
18781 "is used as a depth/stencil framebuffer attachment, the "
18782 "aspectMask is ignored and both depth and stencil image "
18783 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018784
18785 VkFormatProperties format_properties;
18786 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
18787 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
18788 return;
18789 }
18790
18791 m_errorMonitor->ExpectSuccess();
18792
18793 ASSERT_NO_FATAL_FAILURE(InitState());
18794
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018795 VkAttachmentDescription attachment = {0,
18796 VK_FORMAT_D32_SFLOAT_S8_UINT,
18797 VK_SAMPLE_COUNT_1_BIT,
18798 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18799 VK_ATTACHMENT_STORE_OP_STORE,
18800 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
18801 VK_ATTACHMENT_STORE_OP_DONT_CARE,
18802 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
18803 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018804
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018805 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018806
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018807 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018808
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018809 VkSubpassDependency dep = {0,
18810 0,
18811 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18812 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
18813 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18814 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
18815 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018816
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018817 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018818
18819 VkResult err;
18820 VkRenderPass rp;
18821 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18822 ASSERT_VK_SUCCESS(err);
18823
18824 VkImageObj image(m_device);
18825 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018826 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018827 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018828 ASSERT_TRUE(image.initialized());
18829 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
18830
18831 VkImageViewCreateInfo ivci = {
18832 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
18833 nullptr,
18834 0,
18835 image.handle(),
18836 VK_IMAGE_VIEW_TYPE_2D,
18837 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018838 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
18839 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018840 };
18841 VkImageView view;
18842 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
18843 ASSERT_VK_SUCCESS(err);
18844
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018845 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018846 VkFramebuffer fb;
18847 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18848 ASSERT_VK_SUCCESS(err);
18849
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018850 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 -070018851 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018852 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18853
18854 VkImageMemoryBarrier imb = {};
18855 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18856 imb.pNext = nullptr;
18857 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
18858 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18859 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18860 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18861 imb.srcQueueFamilyIndex = 0;
18862 imb.dstQueueFamilyIndex = 0;
18863 imb.image = image.handle();
18864 imb.subresourceRange.aspectMask = 0x6;
18865 imb.subresourceRange.baseMipLevel = 0;
18866 imb.subresourceRange.levelCount = 0x1;
18867 imb.subresourceRange.baseArrayLayer = 0;
18868 imb.subresourceRange.layerCount = 0x1;
18869
18870 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018871 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
18872 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018873
18874 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070018875 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018876 QueueCommandBuffer(false);
18877 m_errorMonitor->VerifyNotFound();
18878
18879 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18880 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18881 vkDestroyImageView(m_device->device(), view, nullptr);
18882}
18883
18884TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018885 TEST_DESCRIPTION(
18886 "Ensure that layout transitions work correctly without "
18887 "errors, when an attachment reference is "
18888 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018889
18890 m_errorMonitor->ExpectSuccess();
18891
18892 ASSERT_NO_FATAL_FAILURE(InitState());
18893
18894 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018895 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018896
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018897 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018898
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018899 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018900
18901 VkRenderPass rp;
18902 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
18903 ASSERT_VK_SUCCESS(err);
18904
18905 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018906 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018907 VkFramebuffer fb;
18908 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
18909 ASSERT_VK_SUCCESS(err);
18910
18911 // Record a command buffer which just begins and ends the renderpass. The
18912 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018913 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 -070018914 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018915 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
18916 vkCmdEndRenderPass(m_commandBuffer->handle());
18917 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070018918 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018919
18920 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18921 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18922}
18923
18924// This is a positive test. No errors are expected.
18925TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018926 TEST_DESCRIPTION(
18927 "Create a stencil-only attachment with a LOAD_OP set to "
18928 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018929 VkResult result = VK_SUCCESS;
18930 VkImageFormatProperties formatProps;
18931 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018932 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
18933 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018934 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
18935 return;
18936 }
18937
18938 ASSERT_NO_FATAL_FAILURE(InitState());
18939 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
18940 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018941 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018942 VkAttachmentDescription att = {};
18943 VkAttachmentReference ref = {};
18944 att.format = depth_stencil_fmt;
18945 att.samples = VK_SAMPLE_COUNT_1_BIT;
18946 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
18947 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
18948 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
18949 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
18950 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18951 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18952
18953 VkClearValue clear;
18954 clear.depthStencil.depth = 1.0;
18955 clear.depthStencil.stencil = 0;
18956 ref.attachment = 0;
18957 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18958
18959 VkSubpassDescription subpass = {};
18960 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
18961 subpass.flags = 0;
18962 subpass.inputAttachmentCount = 0;
18963 subpass.pInputAttachments = NULL;
18964 subpass.colorAttachmentCount = 0;
18965 subpass.pColorAttachments = NULL;
18966 subpass.pResolveAttachments = NULL;
18967 subpass.pDepthStencilAttachment = &ref;
18968 subpass.preserveAttachmentCount = 0;
18969 subpass.pPreserveAttachments = NULL;
18970
18971 VkRenderPass rp;
18972 VkRenderPassCreateInfo rp_info = {};
18973 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
18974 rp_info.attachmentCount = 1;
18975 rp_info.pAttachments = &att;
18976 rp_info.subpassCount = 1;
18977 rp_info.pSubpasses = &subpass;
18978 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
18979 ASSERT_VK_SUCCESS(result);
18980
18981 VkImageView *depthView = m_depthStencil->BindInfo();
18982 VkFramebufferCreateInfo fb_info = {};
18983 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
18984 fb_info.pNext = NULL;
18985 fb_info.renderPass = rp;
18986 fb_info.attachmentCount = 1;
18987 fb_info.pAttachments = depthView;
18988 fb_info.width = 100;
18989 fb_info.height = 100;
18990 fb_info.layers = 1;
18991 VkFramebuffer fb;
18992 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
18993 ASSERT_VK_SUCCESS(result);
18994
18995 VkRenderPassBeginInfo rpbinfo = {};
18996 rpbinfo.clearValueCount = 1;
18997 rpbinfo.pClearValues = &clear;
18998 rpbinfo.pNext = NULL;
18999 rpbinfo.renderPass = rp;
19000 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
19001 rpbinfo.renderArea.extent.width = 100;
19002 rpbinfo.renderArea.extent.height = 100;
19003 rpbinfo.renderArea.offset.x = 0;
19004 rpbinfo.renderArea.offset.y = 0;
19005 rpbinfo.framebuffer = fb;
19006
19007 VkFence fence = {};
19008 VkFenceCreateInfo fence_ci = {};
19009 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19010 fence_ci.pNext = nullptr;
19011 fence_ci.flags = 0;
19012 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
19013 ASSERT_VK_SUCCESS(result);
19014
19015 m_commandBuffer->BeginCommandBuffer();
19016 m_commandBuffer->BeginRenderPass(rpbinfo);
19017 m_commandBuffer->EndRenderPass();
19018 m_commandBuffer->EndCommandBuffer();
19019 m_commandBuffer->QueueCommandBuffer(fence);
19020
19021 VkImageObj destImage(m_device);
19022 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 -070019023 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019024 VkImageMemoryBarrier barrier = {};
19025 VkImageSubresourceRange range;
19026 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19027 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
19028 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
19029 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19030 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19031 barrier.image = m_depthStencil->handle();
19032 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19033 range.baseMipLevel = 0;
19034 range.levelCount = 1;
19035 range.baseArrayLayer = 0;
19036 range.layerCount = 1;
19037 barrier.subresourceRange = range;
19038 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19039 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
19040 cmdbuf.BeginCommandBuffer();
19041 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 -070019042 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019043 barrier.srcAccessMask = 0;
19044 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
19045 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19046 barrier.image = destImage.handle();
19047 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
19048 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 -070019049 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019050 VkImageCopy cregion;
19051 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19052 cregion.srcSubresource.mipLevel = 0;
19053 cregion.srcSubresource.baseArrayLayer = 0;
19054 cregion.srcSubresource.layerCount = 1;
19055 cregion.srcOffset.x = 0;
19056 cregion.srcOffset.y = 0;
19057 cregion.srcOffset.z = 0;
19058 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19059 cregion.dstSubresource.mipLevel = 0;
19060 cregion.dstSubresource.baseArrayLayer = 0;
19061 cregion.dstSubresource.layerCount = 1;
19062 cregion.dstOffset.x = 0;
19063 cregion.dstOffset.y = 0;
19064 cregion.dstOffset.z = 0;
19065 cregion.extent.width = 100;
19066 cregion.extent.height = 100;
19067 cregion.extent.depth = 1;
19068 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019069 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019070 cmdbuf.EndCommandBuffer();
19071
19072 VkSubmitInfo submit_info;
19073 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19074 submit_info.pNext = NULL;
19075 submit_info.waitSemaphoreCount = 0;
19076 submit_info.pWaitSemaphores = NULL;
19077 submit_info.pWaitDstStageMask = NULL;
19078 submit_info.commandBufferCount = 1;
19079 submit_info.pCommandBuffers = &cmdbuf.handle();
19080 submit_info.signalSemaphoreCount = 0;
19081 submit_info.pSignalSemaphores = NULL;
19082
19083 m_errorMonitor->ExpectSuccess();
19084 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19085 m_errorMonitor->VerifyNotFound();
19086
19087 vkQueueWaitIdle(m_device->m_queue);
19088 vkDestroyFence(m_device->device(), fence, nullptr);
19089 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19090 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19091}
19092
19093// This is a positive test. No errors should be generated.
19094TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
19095 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
19096
19097 m_errorMonitor->ExpectSuccess();
19098 ASSERT_NO_FATAL_FAILURE(InitState());
19099
19100 VkEvent event;
19101 VkEventCreateInfo event_create_info{};
19102 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
19103 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
19104
19105 VkCommandPool command_pool;
19106 VkCommandPoolCreateInfo pool_create_info{};
19107 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19108 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19109 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19110 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19111
19112 VkCommandBuffer command_buffer;
19113 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19114 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19115 command_buffer_allocate_info.commandPool = command_pool;
19116 command_buffer_allocate_info.commandBufferCount = 1;
19117 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19118 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
19119
19120 VkQueue queue = VK_NULL_HANDLE;
19121 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
19122
19123 {
19124 VkCommandBufferBeginInfo begin_info{};
19125 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19126 vkBeginCommandBuffer(command_buffer, &begin_info);
19127
19128 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 -070019129 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019130 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
19131 vkEndCommandBuffer(command_buffer);
19132 }
19133 {
19134 VkSubmitInfo submit_info{};
19135 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19136 submit_info.commandBufferCount = 1;
19137 submit_info.pCommandBuffers = &command_buffer;
19138 submit_info.signalSemaphoreCount = 0;
19139 submit_info.pSignalSemaphores = nullptr;
19140 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19141 }
19142 { vkSetEvent(m_device->device(), event); }
19143
19144 vkQueueWaitIdle(queue);
19145
19146 vkDestroyEvent(m_device->device(), event, nullptr);
19147 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
19148 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19149
19150 m_errorMonitor->VerifyNotFound();
19151}
19152// This is a positive test. No errors should be generated.
19153TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
19154 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
19155
19156 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019157 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019158
19159 m_errorMonitor->ExpectSuccess();
19160
19161 VkQueryPool query_pool;
19162 VkQueryPoolCreateInfo query_pool_create_info{};
19163 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
19164 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
19165 query_pool_create_info.queryCount = 1;
19166 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
19167
19168 VkCommandPool command_pool;
19169 VkCommandPoolCreateInfo pool_create_info{};
19170 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19171 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19172 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19173 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19174
19175 VkCommandBuffer command_buffer;
19176 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19177 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19178 command_buffer_allocate_info.commandPool = command_pool;
19179 command_buffer_allocate_info.commandBufferCount = 1;
19180 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19181 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
19182
19183 VkCommandBuffer secondary_command_buffer;
19184 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19185 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
19186
19187 VkQueue queue = VK_NULL_HANDLE;
19188 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19189
19190 uint32_t qfi = 0;
19191 VkBufferCreateInfo buff_create_info = {};
19192 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19193 buff_create_info.size = 1024;
19194 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
19195 buff_create_info.queueFamilyIndexCount = 1;
19196 buff_create_info.pQueueFamilyIndices = &qfi;
19197
19198 VkResult err;
19199 VkBuffer buffer;
19200 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
19201 ASSERT_VK_SUCCESS(err);
19202 VkMemoryAllocateInfo mem_alloc = {};
19203 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19204 mem_alloc.pNext = NULL;
19205 mem_alloc.allocationSize = 1024;
19206 mem_alloc.memoryTypeIndex = 0;
19207
19208 VkMemoryRequirements memReqs;
19209 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
19210 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
19211 if (!pass) {
19212 vkDestroyBuffer(m_device->device(), buffer, NULL);
19213 return;
19214 }
19215
19216 VkDeviceMemory mem;
19217 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19218 ASSERT_VK_SUCCESS(err);
19219 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19220 ASSERT_VK_SUCCESS(err);
19221
19222 VkCommandBufferInheritanceInfo hinfo = {};
19223 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19224 hinfo.renderPass = VK_NULL_HANDLE;
19225 hinfo.subpass = 0;
19226 hinfo.framebuffer = VK_NULL_HANDLE;
19227 hinfo.occlusionQueryEnable = VK_FALSE;
19228 hinfo.queryFlags = 0;
19229 hinfo.pipelineStatistics = 0;
19230
19231 {
19232 VkCommandBufferBeginInfo begin_info{};
19233 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19234 begin_info.pInheritanceInfo = &hinfo;
19235 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
19236
19237 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
19238 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
19239
19240 vkEndCommandBuffer(secondary_command_buffer);
19241
19242 begin_info.pInheritanceInfo = nullptr;
19243 vkBeginCommandBuffer(command_buffer, &begin_info);
19244
19245 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
19246 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
19247
19248 vkEndCommandBuffer(command_buffer);
19249 }
19250 {
19251 VkSubmitInfo submit_info{};
19252 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19253 submit_info.commandBufferCount = 1;
19254 submit_info.pCommandBuffers = &command_buffer;
19255 submit_info.signalSemaphoreCount = 0;
19256 submit_info.pSignalSemaphores = nullptr;
19257 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19258 }
19259
19260 vkQueueWaitIdle(queue);
19261
19262 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
19263 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
19264 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
19265 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19266 vkDestroyBuffer(m_device->device(), buffer, NULL);
19267 vkFreeMemory(m_device->device(), mem, NULL);
19268
19269 m_errorMonitor->VerifyNotFound();
19270}
19271
19272// This is a positive test. No errors should be generated.
19273TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
19274 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
19275
19276 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019277 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019278
19279 m_errorMonitor->ExpectSuccess();
19280
19281 VkQueryPool query_pool;
19282 VkQueryPoolCreateInfo query_pool_create_info{};
19283 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
19284 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
19285 query_pool_create_info.queryCount = 1;
19286 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
19287
19288 VkCommandPool command_pool;
19289 VkCommandPoolCreateInfo pool_create_info{};
19290 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19291 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19292 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19293 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19294
19295 VkCommandBuffer command_buffer[2];
19296 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19297 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19298 command_buffer_allocate_info.commandPool = command_pool;
19299 command_buffer_allocate_info.commandBufferCount = 2;
19300 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19301 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19302
19303 VkQueue queue = VK_NULL_HANDLE;
19304 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19305
19306 uint32_t qfi = 0;
19307 VkBufferCreateInfo buff_create_info = {};
19308 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19309 buff_create_info.size = 1024;
19310 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
19311 buff_create_info.queueFamilyIndexCount = 1;
19312 buff_create_info.pQueueFamilyIndices = &qfi;
19313
19314 VkResult err;
19315 VkBuffer buffer;
19316 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
19317 ASSERT_VK_SUCCESS(err);
19318 VkMemoryAllocateInfo mem_alloc = {};
19319 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19320 mem_alloc.pNext = NULL;
19321 mem_alloc.allocationSize = 1024;
19322 mem_alloc.memoryTypeIndex = 0;
19323
19324 VkMemoryRequirements memReqs;
19325 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
19326 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
19327 if (!pass) {
19328 vkDestroyBuffer(m_device->device(), buffer, NULL);
19329 return;
19330 }
19331
19332 VkDeviceMemory mem;
19333 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19334 ASSERT_VK_SUCCESS(err);
19335 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19336 ASSERT_VK_SUCCESS(err);
19337
19338 {
19339 VkCommandBufferBeginInfo begin_info{};
19340 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19341 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19342
19343 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
19344 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
19345
19346 vkEndCommandBuffer(command_buffer[0]);
19347
19348 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19349
19350 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
19351
19352 vkEndCommandBuffer(command_buffer[1]);
19353 }
19354 {
19355 VkSubmitInfo submit_info{};
19356 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19357 submit_info.commandBufferCount = 2;
19358 submit_info.pCommandBuffers = command_buffer;
19359 submit_info.signalSemaphoreCount = 0;
19360 submit_info.pSignalSemaphores = nullptr;
19361 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19362 }
19363
19364 vkQueueWaitIdle(queue);
19365
19366 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
19367 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
19368 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19369 vkDestroyBuffer(m_device->device(), buffer, NULL);
19370 vkFreeMemory(m_device->device(), mem, NULL);
19371
19372 m_errorMonitor->VerifyNotFound();
19373}
19374
Tony Barbourc46924f2016-11-04 11:49:52 -060019375TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019376 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
19377
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019378 ASSERT_NO_FATAL_FAILURE(InitState());
19379 VkEvent event;
19380 VkEventCreateInfo event_create_info{};
19381 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
19382 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
19383
19384 VkCommandPool command_pool;
19385 VkCommandPoolCreateInfo pool_create_info{};
19386 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19387 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19388 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19389 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19390
19391 VkCommandBuffer command_buffer;
19392 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19393 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19394 command_buffer_allocate_info.commandPool = command_pool;
19395 command_buffer_allocate_info.commandBufferCount = 1;
19396 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19397 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
19398
19399 VkQueue queue = VK_NULL_HANDLE;
19400 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
19401
19402 {
19403 VkCommandBufferBeginInfo begin_info{};
19404 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19405 vkBeginCommandBuffer(command_buffer, &begin_info);
19406
19407 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019408 vkEndCommandBuffer(command_buffer);
19409 }
19410 {
19411 VkSubmitInfo submit_info{};
19412 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19413 submit_info.commandBufferCount = 1;
19414 submit_info.pCommandBuffers = &command_buffer;
19415 submit_info.signalSemaphoreCount = 0;
19416 submit_info.pSignalSemaphores = nullptr;
19417 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19418 }
19419 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19421 "that is already in use by a "
19422 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019423 vkSetEvent(m_device->device(), event);
19424 m_errorMonitor->VerifyFound();
19425 }
19426
19427 vkQueueWaitIdle(queue);
19428
19429 vkDestroyEvent(m_device->device(), event, nullptr);
19430 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
19431 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19432}
19433
19434// This is a positive test. No errors should be generated.
19435TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019436 TEST_DESCRIPTION(
19437 "Two command buffers with two separate fences are each "
19438 "run through a Submit & WaitForFences cycle 3 times. This "
19439 "previously revealed a bug so running this positive test "
19440 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019441 m_errorMonitor->ExpectSuccess();
19442
19443 ASSERT_NO_FATAL_FAILURE(InitState());
19444 VkQueue queue = VK_NULL_HANDLE;
19445 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
19446
19447 static const uint32_t NUM_OBJECTS = 2;
19448 static const uint32_t NUM_FRAMES = 3;
19449 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
19450 VkFence fences[NUM_OBJECTS] = {};
19451
19452 VkCommandPool cmd_pool;
19453 VkCommandPoolCreateInfo cmd_pool_ci = {};
19454 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19455 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
19456 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19457 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
19458 ASSERT_VK_SUCCESS(err);
19459
19460 VkCommandBufferAllocateInfo cmd_buf_info = {};
19461 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19462 cmd_buf_info.commandPool = cmd_pool;
19463 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19464 cmd_buf_info.commandBufferCount = 1;
19465
19466 VkFenceCreateInfo fence_ci = {};
19467 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19468 fence_ci.pNext = nullptr;
19469 fence_ci.flags = 0;
19470
19471 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
19472 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
19473 ASSERT_VK_SUCCESS(err);
19474 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
19475 ASSERT_VK_SUCCESS(err);
19476 }
19477
19478 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
19479 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
19480 // Create empty cmd buffer
19481 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
19482 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19483
19484 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
19485 ASSERT_VK_SUCCESS(err);
19486 err = vkEndCommandBuffer(cmd_buffers[obj]);
19487 ASSERT_VK_SUCCESS(err);
19488
19489 VkSubmitInfo submit_info = {};
19490 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19491 submit_info.commandBufferCount = 1;
19492 submit_info.pCommandBuffers = &cmd_buffers[obj];
19493 // Submit cmd buffer and wait for fence
19494 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
19495 ASSERT_VK_SUCCESS(err);
19496 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
19497 ASSERT_VK_SUCCESS(err);
19498 err = vkResetFences(m_device->device(), 1, &fences[obj]);
19499 ASSERT_VK_SUCCESS(err);
19500 }
19501 }
19502 m_errorMonitor->VerifyNotFound();
19503 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
19504 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
19505 vkDestroyFence(m_device->device(), fences[i], nullptr);
19506 }
19507}
19508// This is a positive test. No errors should be generated.
19509TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019510 TEST_DESCRIPTION(
19511 "Two command buffers, each in a separate QueueSubmit call "
19512 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019513
19514 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019515 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019516
19517 m_errorMonitor->ExpectSuccess();
19518
19519 VkSemaphore semaphore;
19520 VkSemaphoreCreateInfo semaphore_create_info{};
19521 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19522 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19523
19524 VkCommandPool command_pool;
19525 VkCommandPoolCreateInfo pool_create_info{};
19526 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19527 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19528 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19529 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19530
19531 VkCommandBuffer command_buffer[2];
19532 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19533 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19534 command_buffer_allocate_info.commandPool = command_pool;
19535 command_buffer_allocate_info.commandBufferCount = 2;
19536 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19537 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19538
19539 VkQueue queue = VK_NULL_HANDLE;
19540 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19541
19542 {
19543 VkCommandBufferBeginInfo begin_info{};
19544 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19545 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19546
19547 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 -070019548 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019549
19550 VkViewport viewport{};
19551 viewport.maxDepth = 1.0f;
19552 viewport.minDepth = 0.0f;
19553 viewport.width = 512;
19554 viewport.height = 512;
19555 viewport.x = 0;
19556 viewport.y = 0;
19557 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19558 vkEndCommandBuffer(command_buffer[0]);
19559 }
19560 {
19561 VkCommandBufferBeginInfo begin_info{};
19562 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19563 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19564
19565 VkViewport viewport{};
19566 viewport.maxDepth = 1.0f;
19567 viewport.minDepth = 0.0f;
19568 viewport.width = 512;
19569 viewport.height = 512;
19570 viewport.x = 0;
19571 viewport.y = 0;
19572 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19573 vkEndCommandBuffer(command_buffer[1]);
19574 }
19575 {
19576 VkSubmitInfo submit_info{};
19577 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19578 submit_info.commandBufferCount = 1;
19579 submit_info.pCommandBuffers = &command_buffer[0];
19580 submit_info.signalSemaphoreCount = 1;
19581 submit_info.pSignalSemaphores = &semaphore;
19582 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19583 }
19584 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019585 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019586 VkSubmitInfo submit_info{};
19587 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19588 submit_info.commandBufferCount = 1;
19589 submit_info.pCommandBuffers = &command_buffer[1];
19590 submit_info.waitSemaphoreCount = 1;
19591 submit_info.pWaitSemaphores = &semaphore;
19592 submit_info.pWaitDstStageMask = flags;
19593 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19594 }
19595
19596 vkQueueWaitIdle(m_device->m_queue);
19597
19598 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19599 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19600 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19601
19602 m_errorMonitor->VerifyNotFound();
19603}
19604
19605// This is a positive test. No errors should be generated.
19606TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019607 TEST_DESCRIPTION(
19608 "Two command buffers, each in a separate QueueSubmit call "
19609 "submitted on separate queues, the second having a fence"
19610 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019611
19612 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019613 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019614
19615 m_errorMonitor->ExpectSuccess();
19616
19617 VkFence fence;
19618 VkFenceCreateInfo fence_create_info{};
19619 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19620 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19621
19622 VkSemaphore semaphore;
19623 VkSemaphoreCreateInfo semaphore_create_info{};
19624 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19625 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19626
19627 VkCommandPool command_pool;
19628 VkCommandPoolCreateInfo pool_create_info{};
19629 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19630 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19631 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19632 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19633
19634 VkCommandBuffer command_buffer[2];
19635 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19636 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19637 command_buffer_allocate_info.commandPool = command_pool;
19638 command_buffer_allocate_info.commandBufferCount = 2;
19639 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19640 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19641
19642 VkQueue queue = VK_NULL_HANDLE;
19643 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19644
19645 {
19646 VkCommandBufferBeginInfo begin_info{};
19647 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19648 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19649
19650 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 -070019651 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019652
19653 VkViewport viewport{};
19654 viewport.maxDepth = 1.0f;
19655 viewport.minDepth = 0.0f;
19656 viewport.width = 512;
19657 viewport.height = 512;
19658 viewport.x = 0;
19659 viewport.y = 0;
19660 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19661 vkEndCommandBuffer(command_buffer[0]);
19662 }
19663 {
19664 VkCommandBufferBeginInfo begin_info{};
19665 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19666 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19667
19668 VkViewport viewport{};
19669 viewport.maxDepth = 1.0f;
19670 viewport.minDepth = 0.0f;
19671 viewport.width = 512;
19672 viewport.height = 512;
19673 viewport.x = 0;
19674 viewport.y = 0;
19675 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19676 vkEndCommandBuffer(command_buffer[1]);
19677 }
19678 {
19679 VkSubmitInfo submit_info{};
19680 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19681 submit_info.commandBufferCount = 1;
19682 submit_info.pCommandBuffers = &command_buffer[0];
19683 submit_info.signalSemaphoreCount = 1;
19684 submit_info.pSignalSemaphores = &semaphore;
19685 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19686 }
19687 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019688 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019689 VkSubmitInfo submit_info{};
19690 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19691 submit_info.commandBufferCount = 1;
19692 submit_info.pCommandBuffers = &command_buffer[1];
19693 submit_info.waitSemaphoreCount = 1;
19694 submit_info.pWaitSemaphores = &semaphore;
19695 submit_info.pWaitDstStageMask = flags;
19696 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19697 }
19698
19699 vkQueueWaitIdle(m_device->m_queue);
19700
19701 vkDestroyFence(m_device->device(), fence, nullptr);
19702 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19703 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19704 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19705
19706 m_errorMonitor->VerifyNotFound();
19707}
19708
19709// This is a positive test. No errors should be generated.
19710TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019711 TEST_DESCRIPTION(
19712 "Two command buffers, each in a separate QueueSubmit call "
19713 "submitted on separate queues, the second having a fence"
19714 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019715
19716 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019717 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019718
19719 m_errorMonitor->ExpectSuccess();
19720
19721 VkFence fence;
19722 VkFenceCreateInfo fence_create_info{};
19723 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19724 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19725
19726 VkSemaphore semaphore;
19727 VkSemaphoreCreateInfo semaphore_create_info{};
19728 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19729 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19730
19731 VkCommandPool command_pool;
19732 VkCommandPoolCreateInfo pool_create_info{};
19733 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19734 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19735 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19736 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19737
19738 VkCommandBuffer command_buffer[2];
19739 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19740 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19741 command_buffer_allocate_info.commandPool = command_pool;
19742 command_buffer_allocate_info.commandBufferCount = 2;
19743 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19744 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19745
19746 VkQueue queue = VK_NULL_HANDLE;
19747 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19748
19749 {
19750 VkCommandBufferBeginInfo begin_info{};
19751 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19752 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19753
19754 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 -070019755 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019756
19757 VkViewport viewport{};
19758 viewport.maxDepth = 1.0f;
19759 viewport.minDepth = 0.0f;
19760 viewport.width = 512;
19761 viewport.height = 512;
19762 viewport.x = 0;
19763 viewport.y = 0;
19764 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19765 vkEndCommandBuffer(command_buffer[0]);
19766 }
19767 {
19768 VkCommandBufferBeginInfo begin_info{};
19769 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19770 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19771
19772 VkViewport viewport{};
19773 viewport.maxDepth = 1.0f;
19774 viewport.minDepth = 0.0f;
19775 viewport.width = 512;
19776 viewport.height = 512;
19777 viewport.x = 0;
19778 viewport.y = 0;
19779 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19780 vkEndCommandBuffer(command_buffer[1]);
19781 }
19782 {
19783 VkSubmitInfo submit_info{};
19784 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19785 submit_info.commandBufferCount = 1;
19786 submit_info.pCommandBuffers = &command_buffer[0];
19787 submit_info.signalSemaphoreCount = 1;
19788 submit_info.pSignalSemaphores = &semaphore;
19789 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19790 }
19791 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019792 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019793 VkSubmitInfo submit_info{};
19794 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19795 submit_info.commandBufferCount = 1;
19796 submit_info.pCommandBuffers = &command_buffer[1];
19797 submit_info.waitSemaphoreCount = 1;
19798 submit_info.pWaitSemaphores = &semaphore;
19799 submit_info.pWaitDstStageMask = flags;
19800 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19801 }
19802
19803 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19804 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19805
19806 vkDestroyFence(m_device->device(), fence, nullptr);
19807 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19808 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19809 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19810
19811 m_errorMonitor->VerifyNotFound();
19812}
19813
19814TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019815 ASSERT_NO_FATAL_FAILURE(InitState());
19816 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
19817 printf("Test requires two queues, skipping\n");
19818 return;
19819 }
19820
19821 VkResult err;
19822
19823 m_errorMonitor->ExpectSuccess();
19824
19825 VkQueue q0 = m_device->m_queue;
19826 VkQueue q1 = nullptr;
19827 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
19828 ASSERT_NE(q1, nullptr);
19829
19830 // An (empty) command buffer. We must have work in the first submission --
19831 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019832 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019833 VkCommandPool pool;
19834 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
19835 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019836 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
19837 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019838 VkCommandBuffer cb;
19839 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
19840 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019841 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019842 err = vkBeginCommandBuffer(cb, &cbbi);
19843 ASSERT_VK_SUCCESS(err);
19844 err = vkEndCommandBuffer(cb);
19845 ASSERT_VK_SUCCESS(err);
19846
19847 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019848 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019849 VkSemaphore s;
19850 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
19851 ASSERT_VK_SUCCESS(err);
19852
19853 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019854 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019855
19856 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
19857 ASSERT_VK_SUCCESS(err);
19858
19859 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019860 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019861 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019862
19863 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
19864 ASSERT_VK_SUCCESS(err);
19865
19866 // Wait for q0 idle
19867 err = vkQueueWaitIdle(q0);
19868 ASSERT_VK_SUCCESS(err);
19869
19870 // Command buffer should have been completed (it was on q0); reset the pool.
19871 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
19872
19873 m_errorMonitor->VerifyNotFound();
19874
19875 // Force device completely idle and clean up resources
19876 vkDeviceWaitIdle(m_device->device());
19877 vkDestroyCommandPool(m_device->device(), pool, nullptr);
19878 vkDestroySemaphore(m_device->device(), s, nullptr);
19879}
19880
19881// This is a positive test. No errors should be generated.
19882TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019883 TEST_DESCRIPTION(
19884 "Two command buffers, each in a separate QueueSubmit call "
19885 "submitted on separate queues, the second having a fence, "
19886 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019887
19888 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019889 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019890
19891 m_errorMonitor->ExpectSuccess();
19892
19893 ASSERT_NO_FATAL_FAILURE(InitState());
19894 VkFence fence;
19895 VkFenceCreateInfo fence_create_info{};
19896 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19897 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19898
19899 VkSemaphore semaphore;
19900 VkSemaphoreCreateInfo semaphore_create_info{};
19901 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19902 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19903
19904 VkCommandPool command_pool;
19905 VkCommandPoolCreateInfo pool_create_info{};
19906 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19907 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19908 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19909 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19910
19911 VkCommandBuffer command_buffer[2];
19912 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19913 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19914 command_buffer_allocate_info.commandPool = command_pool;
19915 command_buffer_allocate_info.commandBufferCount = 2;
19916 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19917 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19918
19919 VkQueue queue = VK_NULL_HANDLE;
19920 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
19921
19922 {
19923 VkCommandBufferBeginInfo begin_info{};
19924 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19925 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19926
19927 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 -070019928 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019929
19930 VkViewport viewport{};
19931 viewport.maxDepth = 1.0f;
19932 viewport.minDepth = 0.0f;
19933 viewport.width = 512;
19934 viewport.height = 512;
19935 viewport.x = 0;
19936 viewport.y = 0;
19937 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19938 vkEndCommandBuffer(command_buffer[0]);
19939 }
19940 {
19941 VkCommandBufferBeginInfo begin_info{};
19942 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19943 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19944
19945 VkViewport viewport{};
19946 viewport.maxDepth = 1.0f;
19947 viewport.minDepth = 0.0f;
19948 viewport.width = 512;
19949 viewport.height = 512;
19950 viewport.x = 0;
19951 viewport.y = 0;
19952 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19953 vkEndCommandBuffer(command_buffer[1]);
19954 }
19955 {
19956 VkSubmitInfo submit_info{};
19957 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19958 submit_info.commandBufferCount = 1;
19959 submit_info.pCommandBuffers = &command_buffer[0];
19960 submit_info.signalSemaphoreCount = 1;
19961 submit_info.pSignalSemaphores = &semaphore;
19962 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
19963 }
19964 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019965 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019966 VkSubmitInfo submit_info{};
19967 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19968 submit_info.commandBufferCount = 1;
19969 submit_info.pCommandBuffers = &command_buffer[1];
19970 submit_info.waitSemaphoreCount = 1;
19971 submit_info.pWaitSemaphores = &semaphore;
19972 submit_info.pWaitDstStageMask = flags;
19973 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19974 }
19975
19976 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19977
19978 vkDestroyFence(m_device->device(), fence, nullptr);
19979 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19980 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19981 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19982
19983 m_errorMonitor->VerifyNotFound();
19984}
19985
19986// This is a positive test. No errors should be generated.
19987TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019988 TEST_DESCRIPTION(
19989 "Two command buffers, each in a separate QueueSubmit call "
19990 "on the same queue, sharing a signal/wait semaphore, the "
19991 "second having a fence, "
19992 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019993
19994 m_errorMonitor->ExpectSuccess();
19995
19996 ASSERT_NO_FATAL_FAILURE(InitState());
19997 VkFence fence;
19998 VkFenceCreateInfo fence_create_info{};
19999 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20000 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20001
20002 VkSemaphore semaphore;
20003 VkSemaphoreCreateInfo semaphore_create_info{};
20004 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20005 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
20006
20007 VkCommandPool command_pool;
20008 VkCommandPoolCreateInfo pool_create_info{};
20009 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20010 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20011 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20012 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20013
20014 VkCommandBuffer command_buffer[2];
20015 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20016 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20017 command_buffer_allocate_info.commandPool = command_pool;
20018 command_buffer_allocate_info.commandBufferCount = 2;
20019 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20020 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20021
20022 {
20023 VkCommandBufferBeginInfo begin_info{};
20024 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20025 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20026
20027 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 -070020028 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020029
20030 VkViewport viewport{};
20031 viewport.maxDepth = 1.0f;
20032 viewport.minDepth = 0.0f;
20033 viewport.width = 512;
20034 viewport.height = 512;
20035 viewport.x = 0;
20036 viewport.y = 0;
20037 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20038 vkEndCommandBuffer(command_buffer[0]);
20039 }
20040 {
20041 VkCommandBufferBeginInfo begin_info{};
20042 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20043 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20044
20045 VkViewport viewport{};
20046 viewport.maxDepth = 1.0f;
20047 viewport.minDepth = 0.0f;
20048 viewport.width = 512;
20049 viewport.height = 512;
20050 viewport.x = 0;
20051 viewport.y = 0;
20052 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20053 vkEndCommandBuffer(command_buffer[1]);
20054 }
20055 {
20056 VkSubmitInfo submit_info{};
20057 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20058 submit_info.commandBufferCount = 1;
20059 submit_info.pCommandBuffers = &command_buffer[0];
20060 submit_info.signalSemaphoreCount = 1;
20061 submit_info.pSignalSemaphores = &semaphore;
20062 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20063 }
20064 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020065 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020066 VkSubmitInfo submit_info{};
20067 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20068 submit_info.commandBufferCount = 1;
20069 submit_info.pCommandBuffers = &command_buffer[1];
20070 submit_info.waitSemaphoreCount = 1;
20071 submit_info.pWaitSemaphores = &semaphore;
20072 submit_info.pWaitDstStageMask = flags;
20073 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
20074 }
20075
20076 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20077
20078 vkDestroyFence(m_device->device(), fence, nullptr);
20079 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
20080 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20081 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20082
20083 m_errorMonitor->VerifyNotFound();
20084}
20085
20086// This is a positive test. No errors should be generated.
20087TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020088 TEST_DESCRIPTION(
20089 "Two command buffers, each in a separate QueueSubmit call "
20090 "on the same queue, no fences, followed by a third QueueSubmit with NO "
20091 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020092
20093 m_errorMonitor->ExpectSuccess();
20094
20095 ASSERT_NO_FATAL_FAILURE(InitState());
20096 VkFence fence;
20097 VkFenceCreateInfo fence_create_info{};
20098 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20099 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20100
20101 VkCommandPool command_pool;
20102 VkCommandPoolCreateInfo pool_create_info{};
20103 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20104 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20105 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20106 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20107
20108 VkCommandBuffer command_buffer[2];
20109 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20110 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20111 command_buffer_allocate_info.commandPool = command_pool;
20112 command_buffer_allocate_info.commandBufferCount = 2;
20113 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20114 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20115
20116 {
20117 VkCommandBufferBeginInfo begin_info{};
20118 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20119 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20120
20121 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 -070020122 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020123
20124 VkViewport viewport{};
20125 viewport.maxDepth = 1.0f;
20126 viewport.minDepth = 0.0f;
20127 viewport.width = 512;
20128 viewport.height = 512;
20129 viewport.x = 0;
20130 viewport.y = 0;
20131 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20132 vkEndCommandBuffer(command_buffer[0]);
20133 }
20134 {
20135 VkCommandBufferBeginInfo begin_info{};
20136 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20137 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20138
20139 VkViewport viewport{};
20140 viewport.maxDepth = 1.0f;
20141 viewport.minDepth = 0.0f;
20142 viewport.width = 512;
20143 viewport.height = 512;
20144 viewport.x = 0;
20145 viewport.y = 0;
20146 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20147 vkEndCommandBuffer(command_buffer[1]);
20148 }
20149 {
20150 VkSubmitInfo submit_info{};
20151 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20152 submit_info.commandBufferCount = 1;
20153 submit_info.pCommandBuffers = &command_buffer[0];
20154 submit_info.signalSemaphoreCount = 0;
20155 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
20156 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20157 }
20158 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020159 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020160 VkSubmitInfo submit_info{};
20161 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20162 submit_info.commandBufferCount = 1;
20163 submit_info.pCommandBuffers = &command_buffer[1];
20164 submit_info.waitSemaphoreCount = 0;
20165 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
20166 submit_info.pWaitDstStageMask = flags;
20167 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20168 }
20169
20170 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
20171
20172 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20173 ASSERT_VK_SUCCESS(err);
20174
20175 vkDestroyFence(m_device->device(), fence, nullptr);
20176 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20177 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20178
20179 m_errorMonitor->VerifyNotFound();
20180}
20181
20182// This is a positive test. No errors should be generated.
20183TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020184 TEST_DESCRIPTION(
20185 "Two command buffers, each in a separate QueueSubmit call "
20186 "on the same queue, the second having a fence, followed "
20187 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020188
20189 m_errorMonitor->ExpectSuccess();
20190
20191 ASSERT_NO_FATAL_FAILURE(InitState());
20192 VkFence fence;
20193 VkFenceCreateInfo fence_create_info{};
20194 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20195 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20196
20197 VkCommandPool command_pool;
20198 VkCommandPoolCreateInfo pool_create_info{};
20199 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20200 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20201 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20202 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20203
20204 VkCommandBuffer command_buffer[2];
20205 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20206 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20207 command_buffer_allocate_info.commandPool = command_pool;
20208 command_buffer_allocate_info.commandBufferCount = 2;
20209 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20210 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20211
20212 {
20213 VkCommandBufferBeginInfo begin_info{};
20214 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20215 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20216
20217 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 -070020218 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020219
20220 VkViewport viewport{};
20221 viewport.maxDepth = 1.0f;
20222 viewport.minDepth = 0.0f;
20223 viewport.width = 512;
20224 viewport.height = 512;
20225 viewport.x = 0;
20226 viewport.y = 0;
20227 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20228 vkEndCommandBuffer(command_buffer[0]);
20229 }
20230 {
20231 VkCommandBufferBeginInfo begin_info{};
20232 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20233 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20234
20235 VkViewport viewport{};
20236 viewport.maxDepth = 1.0f;
20237 viewport.minDepth = 0.0f;
20238 viewport.width = 512;
20239 viewport.height = 512;
20240 viewport.x = 0;
20241 viewport.y = 0;
20242 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20243 vkEndCommandBuffer(command_buffer[1]);
20244 }
20245 {
20246 VkSubmitInfo submit_info{};
20247 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20248 submit_info.commandBufferCount = 1;
20249 submit_info.pCommandBuffers = &command_buffer[0];
20250 submit_info.signalSemaphoreCount = 0;
20251 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
20252 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20253 }
20254 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020255 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020256 VkSubmitInfo submit_info{};
20257 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20258 submit_info.commandBufferCount = 1;
20259 submit_info.pCommandBuffers = &command_buffer[1];
20260 submit_info.waitSemaphoreCount = 0;
20261 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
20262 submit_info.pWaitDstStageMask = flags;
20263 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
20264 }
20265
20266 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20267
20268 vkDestroyFence(m_device->device(), fence, nullptr);
20269 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20270 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20271
20272 m_errorMonitor->VerifyNotFound();
20273}
20274
20275// This is a positive test. No errors should be generated.
20276TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020277 TEST_DESCRIPTION(
20278 "Two command buffers each in a separate SubmitInfo sent in a single "
20279 "QueueSubmit call followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020280 ASSERT_NO_FATAL_FAILURE(InitState());
20281
20282 m_errorMonitor->ExpectSuccess();
20283
20284 VkFence fence;
20285 VkFenceCreateInfo fence_create_info{};
20286 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20287 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20288
20289 VkSemaphore semaphore;
20290 VkSemaphoreCreateInfo semaphore_create_info{};
20291 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20292 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
20293
20294 VkCommandPool command_pool;
20295 VkCommandPoolCreateInfo pool_create_info{};
20296 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20297 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20298 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20299 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20300
20301 VkCommandBuffer command_buffer[2];
20302 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20303 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20304 command_buffer_allocate_info.commandPool = command_pool;
20305 command_buffer_allocate_info.commandBufferCount = 2;
20306 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20307 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20308
20309 {
20310 VkCommandBufferBeginInfo begin_info{};
20311 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20312 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20313
20314 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 -070020315 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020316
20317 VkViewport viewport{};
20318 viewport.maxDepth = 1.0f;
20319 viewport.minDepth = 0.0f;
20320 viewport.width = 512;
20321 viewport.height = 512;
20322 viewport.x = 0;
20323 viewport.y = 0;
20324 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20325 vkEndCommandBuffer(command_buffer[0]);
20326 }
20327 {
20328 VkCommandBufferBeginInfo begin_info{};
20329 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20330 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20331
20332 VkViewport viewport{};
20333 viewport.maxDepth = 1.0f;
20334 viewport.minDepth = 0.0f;
20335 viewport.width = 512;
20336 viewport.height = 512;
20337 viewport.x = 0;
20338 viewport.y = 0;
20339 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20340 vkEndCommandBuffer(command_buffer[1]);
20341 }
20342 {
20343 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020344 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020345
20346 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20347 submit_info[0].pNext = NULL;
20348 submit_info[0].commandBufferCount = 1;
20349 submit_info[0].pCommandBuffers = &command_buffer[0];
20350 submit_info[0].signalSemaphoreCount = 1;
20351 submit_info[0].pSignalSemaphores = &semaphore;
20352 submit_info[0].waitSemaphoreCount = 0;
20353 submit_info[0].pWaitSemaphores = NULL;
20354 submit_info[0].pWaitDstStageMask = 0;
20355
20356 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20357 submit_info[1].pNext = NULL;
20358 submit_info[1].commandBufferCount = 1;
20359 submit_info[1].pCommandBuffers = &command_buffer[1];
20360 submit_info[1].waitSemaphoreCount = 1;
20361 submit_info[1].pWaitSemaphores = &semaphore;
20362 submit_info[1].pWaitDstStageMask = flags;
20363 submit_info[1].signalSemaphoreCount = 0;
20364 submit_info[1].pSignalSemaphores = NULL;
20365 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
20366 }
20367
20368 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20369
20370 vkDestroyFence(m_device->device(), fence, nullptr);
20371 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20372 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20373 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
20374
20375 m_errorMonitor->VerifyNotFound();
20376}
20377
20378TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
20379 m_errorMonitor->ExpectSuccess();
20380
20381 ASSERT_NO_FATAL_FAILURE(InitState());
20382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20383
Tony Barbour552f6c02016-12-21 14:34:07 -070020384 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020385
20386 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
20387 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
20388 m_errorMonitor->VerifyNotFound();
20389 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
20390 m_errorMonitor->VerifyNotFound();
20391 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
20392 m_errorMonitor->VerifyNotFound();
20393
20394 m_commandBuffer->EndCommandBuffer();
20395 m_errorMonitor->VerifyNotFound();
20396}
20397
20398TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020399 TEST_DESCRIPTION(
20400 "Positive test where we create a renderpass with an "
20401 "attachment that uses LOAD_OP_CLEAR, the first subpass "
20402 "has a valid layout, and a second subpass then uses a "
20403 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020404 m_errorMonitor->ExpectSuccess();
20405 ASSERT_NO_FATAL_FAILURE(InitState());
20406
20407 VkAttachmentReference attach[2] = {};
20408 attach[0].attachment = 0;
20409 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20410 attach[1].attachment = 0;
20411 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
20412 VkSubpassDescription subpasses[2] = {};
20413 // First subpass clears DS attach on load
20414 subpasses[0].pDepthStencilAttachment = &attach[0];
20415 // 2nd subpass reads in DS as input attachment
20416 subpasses[1].inputAttachmentCount = 1;
20417 subpasses[1].pInputAttachments = &attach[1];
20418 VkAttachmentDescription attach_desc = {};
20419 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
20420 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
20421 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
20422 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20423 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20424 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20425 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20426 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
20427 VkRenderPassCreateInfo rpci = {};
20428 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20429 rpci.attachmentCount = 1;
20430 rpci.pAttachments = &attach_desc;
20431 rpci.subpassCount = 2;
20432 rpci.pSubpasses = subpasses;
20433
20434 // Now create RenderPass and verify no errors
20435 VkRenderPass rp;
20436 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
20437 m_errorMonitor->VerifyNotFound();
20438
20439 vkDestroyRenderPass(m_device->device(), rp, NULL);
20440}
20441
20442TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020443 TEST_DESCRIPTION(
20444 "Test that pipeline validation accepts matrices passed "
20445 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020446 m_errorMonitor->ExpectSuccess();
20447
20448 ASSERT_NO_FATAL_FAILURE(InitState());
20449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20450
20451 VkVertexInputBindingDescription input_binding;
20452 memset(&input_binding, 0, sizeof(input_binding));
20453
20454 VkVertexInputAttributeDescription input_attribs[2];
20455 memset(input_attribs, 0, sizeof(input_attribs));
20456
20457 for (int i = 0; i < 2; i++) {
20458 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
20459 input_attribs[i].location = i;
20460 }
20461
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020462 char const *vsSource =
20463 "#version 450\n"
20464 "\n"
20465 "layout(location=0) in mat2x4 x;\n"
20466 "out gl_PerVertex {\n"
20467 " vec4 gl_Position;\n"
20468 "};\n"
20469 "void main(){\n"
20470 " gl_Position = x[0] + x[1];\n"
20471 "}\n";
20472 char const *fsSource =
20473 "#version 450\n"
20474 "\n"
20475 "layout(location=0) out vec4 color;\n"
20476 "void main(){\n"
20477 " color = vec4(1);\n"
20478 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020479
20480 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20481 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20482
20483 VkPipelineObj pipe(m_device);
20484 pipe.AddColorAttachment();
20485 pipe.AddShader(&vs);
20486 pipe.AddShader(&fs);
20487
20488 pipe.AddVertexInputBindings(&input_binding, 1);
20489 pipe.AddVertexInputAttribs(input_attribs, 2);
20490
20491 VkDescriptorSetObj descriptorSet(m_device);
20492 descriptorSet.AppendDummy();
20493 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20494
20495 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20496
20497 /* expect success */
20498 m_errorMonitor->VerifyNotFound();
20499}
20500
20501TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
20502 m_errorMonitor->ExpectSuccess();
20503
20504 ASSERT_NO_FATAL_FAILURE(InitState());
20505 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20506
20507 VkVertexInputBindingDescription input_binding;
20508 memset(&input_binding, 0, sizeof(input_binding));
20509
20510 VkVertexInputAttributeDescription input_attribs[2];
20511 memset(input_attribs, 0, sizeof(input_attribs));
20512
20513 for (int i = 0; i < 2; i++) {
20514 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
20515 input_attribs[i].location = i;
20516 }
20517
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020518 char const *vsSource =
20519 "#version 450\n"
20520 "\n"
20521 "layout(location=0) in vec4 x[2];\n"
20522 "out gl_PerVertex {\n"
20523 " vec4 gl_Position;\n"
20524 "};\n"
20525 "void main(){\n"
20526 " gl_Position = x[0] + x[1];\n"
20527 "}\n";
20528 char const *fsSource =
20529 "#version 450\n"
20530 "\n"
20531 "layout(location=0) out vec4 color;\n"
20532 "void main(){\n"
20533 " color = vec4(1);\n"
20534 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020535
20536 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20537 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20538
20539 VkPipelineObj pipe(m_device);
20540 pipe.AddColorAttachment();
20541 pipe.AddShader(&vs);
20542 pipe.AddShader(&fs);
20543
20544 pipe.AddVertexInputBindings(&input_binding, 1);
20545 pipe.AddVertexInputAttribs(input_attribs, 2);
20546
20547 VkDescriptorSetObj descriptorSet(m_device);
20548 descriptorSet.AppendDummy();
20549 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20550
20551 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20552
20553 m_errorMonitor->VerifyNotFound();
20554}
20555
20556TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020557 TEST_DESCRIPTION(
20558 "Test that pipeline validation accepts consuming a vertex attribute "
20559 "through multiple vertex shader inputs, each consuming a different "
20560 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020561 m_errorMonitor->ExpectSuccess();
20562
20563 ASSERT_NO_FATAL_FAILURE(InitState());
20564 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20565
20566 VkVertexInputBindingDescription input_binding;
20567 memset(&input_binding, 0, sizeof(input_binding));
20568
20569 VkVertexInputAttributeDescription input_attribs[3];
20570 memset(input_attribs, 0, sizeof(input_attribs));
20571
20572 for (int i = 0; i < 3; i++) {
20573 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
20574 input_attribs[i].location = i;
20575 }
20576
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020577 char const *vsSource =
20578 "#version 450\n"
20579 "\n"
20580 "layout(location=0) in vec4 x;\n"
20581 "layout(location=1) in vec3 y1;\n"
20582 "layout(location=1, component=3) in float y2;\n"
20583 "layout(location=2) in vec4 z;\n"
20584 "out gl_PerVertex {\n"
20585 " vec4 gl_Position;\n"
20586 "};\n"
20587 "void main(){\n"
20588 " gl_Position = x + vec4(y1, y2) + z;\n"
20589 "}\n";
20590 char const *fsSource =
20591 "#version 450\n"
20592 "\n"
20593 "layout(location=0) out vec4 color;\n"
20594 "void main(){\n"
20595 " color = vec4(1);\n"
20596 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020597
20598 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20599 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20600
20601 VkPipelineObj pipe(m_device);
20602 pipe.AddColorAttachment();
20603 pipe.AddShader(&vs);
20604 pipe.AddShader(&fs);
20605
20606 pipe.AddVertexInputBindings(&input_binding, 1);
20607 pipe.AddVertexInputAttribs(input_attribs, 3);
20608
20609 VkDescriptorSetObj descriptorSet(m_device);
20610 descriptorSet.AppendDummy();
20611 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20612
20613 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20614
20615 m_errorMonitor->VerifyNotFound();
20616}
20617
20618TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
20619 m_errorMonitor->ExpectSuccess();
20620
20621 ASSERT_NO_FATAL_FAILURE(InitState());
20622 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20623
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020624 char const *vsSource =
20625 "#version 450\n"
20626 "out gl_PerVertex {\n"
20627 " vec4 gl_Position;\n"
20628 "};\n"
20629 "void main(){\n"
20630 " gl_Position = vec4(0);\n"
20631 "}\n";
20632 char const *fsSource =
20633 "#version 450\n"
20634 "\n"
20635 "layout(location=0) out vec4 color;\n"
20636 "void main(){\n"
20637 " color = vec4(1);\n"
20638 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020639
20640 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20641 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20642
20643 VkPipelineObj pipe(m_device);
20644 pipe.AddColorAttachment();
20645 pipe.AddShader(&vs);
20646 pipe.AddShader(&fs);
20647
20648 VkDescriptorSetObj descriptorSet(m_device);
20649 descriptorSet.AppendDummy();
20650 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20651
20652 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20653
20654 m_errorMonitor->VerifyNotFound();
20655}
20656
20657TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020658 TEST_DESCRIPTION(
20659 "Test that pipeline validation accepts the relaxed type matching rules "
20660 "set out in 14.1.3: fundamental type must match, and producer side must "
20661 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020662 m_errorMonitor->ExpectSuccess();
20663
20664 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
20665
20666 ASSERT_NO_FATAL_FAILURE(InitState());
20667 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20668
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020669 char const *vsSource =
20670 "#version 450\n"
20671 "out gl_PerVertex {\n"
20672 " vec4 gl_Position;\n"
20673 "};\n"
20674 "layout(location=0) out vec3 x;\n"
20675 "layout(location=1) out ivec3 y;\n"
20676 "layout(location=2) out vec3 z;\n"
20677 "void main(){\n"
20678 " gl_Position = vec4(0);\n"
20679 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
20680 "}\n";
20681 char const *fsSource =
20682 "#version 450\n"
20683 "\n"
20684 "layout(location=0) out vec4 color;\n"
20685 "layout(location=0) in float x;\n"
20686 "layout(location=1) flat in int y;\n"
20687 "layout(location=2) in vec2 z;\n"
20688 "void main(){\n"
20689 " color = vec4(1 + x + y + z.x);\n"
20690 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020691
20692 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20693 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20694
20695 VkPipelineObj pipe(m_device);
20696 pipe.AddColorAttachment();
20697 pipe.AddShader(&vs);
20698 pipe.AddShader(&fs);
20699
20700 VkDescriptorSetObj descriptorSet(m_device);
20701 descriptorSet.AppendDummy();
20702 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20703
20704 VkResult err = VK_SUCCESS;
20705 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20706 ASSERT_VK_SUCCESS(err);
20707
20708 m_errorMonitor->VerifyNotFound();
20709}
20710
20711TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020712 TEST_DESCRIPTION(
20713 "Test that pipeline validation accepts per-vertex variables "
20714 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020715 m_errorMonitor->ExpectSuccess();
20716
20717 ASSERT_NO_FATAL_FAILURE(InitState());
20718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20719
20720 if (!m_device->phy().features().tessellationShader) {
20721 printf("Device does not support tessellation shaders; skipped.\n");
20722 return;
20723 }
20724
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020725 char const *vsSource =
20726 "#version 450\n"
20727 "void main(){}\n";
20728 char const *tcsSource =
20729 "#version 450\n"
20730 "layout(location=0) out int x[];\n"
20731 "layout(vertices=3) out;\n"
20732 "void main(){\n"
20733 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
20734 " gl_TessLevelInner[0] = 1;\n"
20735 " x[gl_InvocationID] = gl_InvocationID;\n"
20736 "}\n";
20737 char const *tesSource =
20738 "#version 450\n"
20739 "layout(triangles, equal_spacing, cw) in;\n"
20740 "layout(location=0) in int x[];\n"
20741 "out gl_PerVertex { vec4 gl_Position; };\n"
20742 "void main(){\n"
20743 " gl_Position.xyz = gl_TessCoord;\n"
20744 " gl_Position.w = x[0] + x[1] + x[2];\n"
20745 "}\n";
20746 char const *fsSource =
20747 "#version 450\n"
20748 "layout(location=0) out vec4 color;\n"
20749 "void main(){\n"
20750 " color = vec4(1);\n"
20751 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020752
20753 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20754 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
20755 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
20756 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20757
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020758 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
20759 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020760
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020761 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020762
20763 VkPipelineObj pipe(m_device);
20764 pipe.SetInputAssembly(&iasci);
20765 pipe.SetTessellation(&tsci);
20766 pipe.AddColorAttachment();
20767 pipe.AddShader(&vs);
20768 pipe.AddShader(&tcs);
20769 pipe.AddShader(&tes);
20770 pipe.AddShader(&fs);
20771
20772 VkDescriptorSetObj descriptorSet(m_device);
20773 descriptorSet.AppendDummy();
20774 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20775
20776 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20777
20778 m_errorMonitor->VerifyNotFound();
20779}
20780
20781TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020782 TEST_DESCRIPTION(
20783 "Test that pipeline validation accepts a user-defined "
20784 "interface block passed into the geometry shader. This "
20785 "is interesting because the 'extra' array level is not "
20786 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020787 m_errorMonitor->ExpectSuccess();
20788
20789 ASSERT_NO_FATAL_FAILURE(InitState());
20790 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20791
20792 if (!m_device->phy().features().geometryShader) {
20793 printf("Device does not support geometry shaders; skipped.\n");
20794 return;
20795 }
20796
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020797 char const *vsSource =
20798 "#version 450\n"
20799 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
20800 "void main(){\n"
20801 " vs_out.x = vec4(1);\n"
20802 "}\n";
20803 char const *gsSource =
20804 "#version 450\n"
20805 "layout(triangles) in;\n"
20806 "layout(triangle_strip, max_vertices=3) out;\n"
20807 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
20808 "out gl_PerVertex { vec4 gl_Position; };\n"
20809 "void main() {\n"
20810 " gl_Position = gs_in[0].x;\n"
20811 " EmitVertex();\n"
20812 "}\n";
20813 char const *fsSource =
20814 "#version 450\n"
20815 "layout(location=0) out vec4 color;\n"
20816 "void main(){\n"
20817 " color = vec4(1);\n"
20818 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020819
20820 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20821 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
20822 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20823
20824 VkPipelineObj pipe(m_device);
20825 pipe.AddColorAttachment();
20826 pipe.AddShader(&vs);
20827 pipe.AddShader(&gs);
20828 pipe.AddShader(&fs);
20829
20830 VkDescriptorSetObj descriptorSet(m_device);
20831 descriptorSet.AppendDummy();
20832 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20833
20834 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20835
20836 m_errorMonitor->VerifyNotFound();
20837}
20838
20839TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020840 TEST_DESCRIPTION(
20841 "Test that pipeline validation accepts basic use of 64bit vertex "
20842 "attributes. This is interesting because they consume multiple "
20843 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020844 m_errorMonitor->ExpectSuccess();
20845
20846 ASSERT_NO_FATAL_FAILURE(InitState());
20847 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20848
20849 if (!m_device->phy().features().shaderFloat64) {
20850 printf("Device does not support 64bit vertex attributes; skipped.\n");
20851 return;
20852 }
20853
20854 VkVertexInputBindingDescription input_bindings[1];
20855 memset(input_bindings, 0, sizeof(input_bindings));
20856
20857 VkVertexInputAttributeDescription input_attribs[4];
20858 memset(input_attribs, 0, sizeof(input_attribs));
20859 input_attribs[0].location = 0;
20860 input_attribs[0].offset = 0;
20861 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20862 input_attribs[1].location = 2;
20863 input_attribs[1].offset = 32;
20864 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20865 input_attribs[2].location = 4;
20866 input_attribs[2].offset = 64;
20867 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20868 input_attribs[3].location = 6;
20869 input_attribs[3].offset = 96;
20870 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
20871
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020872 char const *vsSource =
20873 "#version 450\n"
20874 "\n"
20875 "layout(location=0) in dmat4 x;\n"
20876 "out gl_PerVertex {\n"
20877 " vec4 gl_Position;\n"
20878 "};\n"
20879 "void main(){\n"
20880 " gl_Position = vec4(x[0][0]);\n"
20881 "}\n";
20882 char const *fsSource =
20883 "#version 450\n"
20884 "\n"
20885 "layout(location=0) out vec4 color;\n"
20886 "void main(){\n"
20887 " color = vec4(1);\n"
20888 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020889
20890 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20891 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20892
20893 VkPipelineObj pipe(m_device);
20894 pipe.AddColorAttachment();
20895 pipe.AddShader(&vs);
20896 pipe.AddShader(&fs);
20897
20898 pipe.AddVertexInputBindings(input_bindings, 1);
20899 pipe.AddVertexInputAttribs(input_attribs, 4);
20900
20901 VkDescriptorSetObj descriptorSet(m_device);
20902 descriptorSet.AppendDummy();
20903 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
20904
20905 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
20906
20907 m_errorMonitor->VerifyNotFound();
20908}
20909
20910TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
20911 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
20912 m_errorMonitor->ExpectSuccess();
20913
20914 ASSERT_NO_FATAL_FAILURE(InitState());
20915
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020916 char const *vsSource =
20917 "#version 450\n"
20918 "\n"
20919 "out gl_PerVertex {\n"
20920 " vec4 gl_Position;\n"
20921 "};\n"
20922 "void main(){\n"
20923 " gl_Position = vec4(1);\n"
20924 "}\n";
20925 char const *fsSource =
20926 "#version 450\n"
20927 "\n"
20928 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
20929 "layout(location=0) out vec4 color;\n"
20930 "void main() {\n"
20931 " color = subpassLoad(x);\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.AddShader(&vs);
20939 pipe.AddShader(&fs);
20940 pipe.AddColorAttachment();
20941 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20942
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020943 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
20944 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020945 VkDescriptorSetLayout dsl;
20946 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
20947 ASSERT_VK_SUCCESS(err);
20948
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020949 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020950 VkPipelineLayout pl;
20951 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
20952 ASSERT_VK_SUCCESS(err);
20953
20954 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020955 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
20956 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20957 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
20958 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
20959 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 -060020960 };
20961 VkAttachmentReference color = {
20962 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20963 };
20964 VkAttachmentReference input = {
20965 1, VK_IMAGE_LAYOUT_GENERAL,
20966 };
20967
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020968 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020969
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020970 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020971 VkRenderPass rp;
20972 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20973 ASSERT_VK_SUCCESS(err);
20974
20975 // should be OK. would go wrong here if it's going to...
20976 pipe.CreateVKPipeline(pl, rp);
20977
20978 m_errorMonitor->VerifyNotFound();
20979
20980 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20981 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
20982 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
20983}
20984
20985TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020986 TEST_DESCRIPTION(
20987 "Test that pipeline validation accepts a compute pipeline which declares a "
20988 "descriptor-backed resource which is not provided, but the shader does not "
20989 "statically use it. This is interesting because it requires compute pipelines "
20990 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020991 m_errorMonitor->ExpectSuccess();
20992
20993 ASSERT_NO_FATAL_FAILURE(InitState());
20994
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020995 char const *csSource =
20996 "#version 450\n"
20997 "\n"
20998 "layout(local_size_x=1) in;\n"
20999 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
21000 "void main(){\n"
21001 " // x is not used.\n"
21002 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021003
21004 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
21005
21006 VkDescriptorSetObj descriptorSet(m_device);
21007 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
21008
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021009 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
21010 nullptr,
21011 0,
21012 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
21013 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
21014 descriptorSet.GetPipelineLayout(),
21015 VK_NULL_HANDLE,
21016 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021017
21018 VkPipeline pipe;
21019 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
21020
21021 m_errorMonitor->VerifyNotFound();
21022
21023 if (err == VK_SUCCESS) {
21024 vkDestroyPipeline(m_device->device(), pipe, nullptr);
21025 }
21026}
21027
21028TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021029 TEST_DESCRIPTION(
21030 "Test that pipeline validation accepts a shader consuming only the "
21031 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021032 m_errorMonitor->ExpectSuccess();
21033
21034 ASSERT_NO_FATAL_FAILURE(InitState());
21035
21036 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021037 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
21038 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
21039 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021040 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021041 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021042 VkDescriptorSetLayout dsl;
21043 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
21044 ASSERT_VK_SUCCESS(err);
21045
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021046 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021047 VkPipelineLayout pl;
21048 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
21049 ASSERT_VK_SUCCESS(err);
21050
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021051 char const *csSource =
21052 "#version 450\n"
21053 "\n"
21054 "layout(local_size_x=1) in;\n"
21055 "layout(set=0, binding=0) uniform sampler s;\n"
21056 "layout(set=0, binding=1) uniform texture2D t;\n"
21057 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
21058 "void main() {\n"
21059 " x = texture(sampler2D(t, s), vec2(0));\n"
21060 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021061 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
21062
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021063 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
21064 nullptr,
21065 0,
21066 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
21067 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
21068 pl,
21069 VK_NULL_HANDLE,
21070 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021071
21072 VkPipeline pipe;
21073 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
21074
21075 m_errorMonitor->VerifyNotFound();
21076
21077 if (err == VK_SUCCESS) {
21078 vkDestroyPipeline(m_device->device(), pipe, nullptr);
21079 }
21080
21081 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
21082 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
21083}
21084
21085TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021086 TEST_DESCRIPTION(
21087 "Test that pipeline validation accepts a shader consuming only the "
21088 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021089 m_errorMonitor->ExpectSuccess();
21090
21091 ASSERT_NO_FATAL_FAILURE(InitState());
21092
21093 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021094 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
21095 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
21096 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021097 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021098 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021099 VkDescriptorSetLayout dsl;
21100 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
21101 ASSERT_VK_SUCCESS(err);
21102
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021103 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021104 VkPipelineLayout pl;
21105 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
21106 ASSERT_VK_SUCCESS(err);
21107
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021108 char const *csSource =
21109 "#version 450\n"
21110 "\n"
21111 "layout(local_size_x=1) in;\n"
21112 "layout(set=0, binding=0) uniform texture2D t;\n"
21113 "layout(set=0, binding=1) uniform sampler s;\n"
21114 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
21115 "void main() {\n"
21116 " x = texture(sampler2D(t, s), vec2(0));\n"
21117 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021118 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
21119
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021120 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
21121 nullptr,
21122 0,
21123 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
21124 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
21125 pl,
21126 VK_NULL_HANDLE,
21127 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021128
21129 VkPipeline pipe;
21130 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
21131
21132 m_errorMonitor->VerifyNotFound();
21133
21134 if (err == VK_SUCCESS) {
21135 vkDestroyPipeline(m_device->device(), pipe, nullptr);
21136 }
21137
21138 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
21139 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
21140}
21141
21142TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021143 TEST_DESCRIPTION(
21144 "Test that pipeline validation accepts a shader consuming "
21145 "both the sampler and the image of a combined image+sampler "
21146 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021147 m_errorMonitor->ExpectSuccess();
21148
21149 ASSERT_NO_FATAL_FAILURE(InitState());
21150
21151 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021152 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
21153 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021154 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021155 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021156 VkDescriptorSetLayout dsl;
21157 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
21158 ASSERT_VK_SUCCESS(err);
21159
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021160 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021161 VkPipelineLayout pl;
21162 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
21163 ASSERT_VK_SUCCESS(err);
21164
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021165 char const *csSource =
21166 "#version 450\n"
21167 "\n"
21168 "layout(local_size_x=1) in;\n"
21169 "layout(set=0, binding=0) uniform texture2D t;\n"
21170 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
21171 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
21172 "void main() {\n"
21173 " x = texture(sampler2D(t, s), vec2(0));\n"
21174 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021175 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
21176
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021177 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
21178 nullptr,
21179 0,
21180 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
21181 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
21182 pl,
21183 VK_NULL_HANDLE,
21184 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021185
21186 VkPipeline pipe;
21187 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
21188
21189 m_errorMonitor->VerifyNotFound();
21190
21191 if (err == VK_SUCCESS) {
21192 vkDestroyPipeline(m_device->device(), pipe, nullptr);
21193 }
21194
21195 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
21196 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
21197}
21198
21199TEST_F(VkPositiveLayerTest, ValidStructPNext) {
21200 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
21201
21202 ASSERT_NO_FATAL_FAILURE(InitState());
21203
21204 // Positive test to check parameter_validation and unique_objects support
21205 // for NV_dedicated_allocation
21206 uint32_t extension_count = 0;
21207 bool supports_nv_dedicated_allocation = false;
21208 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
21209 ASSERT_VK_SUCCESS(err);
21210
21211 if (extension_count > 0) {
21212 std::vector<VkExtensionProperties> available_extensions(extension_count);
21213
21214 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
21215 ASSERT_VK_SUCCESS(err);
21216
21217 for (const auto &extension_props : available_extensions) {
21218 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
21219 supports_nv_dedicated_allocation = true;
21220 }
21221 }
21222 }
21223
21224 if (supports_nv_dedicated_allocation) {
21225 m_errorMonitor->ExpectSuccess();
21226
21227 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
21228 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
21229 dedicated_buffer_create_info.pNext = nullptr;
21230 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
21231
21232 uint32_t queue_family_index = 0;
21233 VkBufferCreateInfo buffer_create_info = {};
21234 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21235 buffer_create_info.pNext = &dedicated_buffer_create_info;
21236 buffer_create_info.size = 1024;
21237 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
21238 buffer_create_info.queueFamilyIndexCount = 1;
21239 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
21240
21241 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070021242 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021243 ASSERT_VK_SUCCESS(err);
21244
21245 VkMemoryRequirements memory_reqs;
21246 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
21247
21248 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
21249 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
21250 dedicated_memory_info.pNext = nullptr;
21251 dedicated_memory_info.buffer = buffer;
21252 dedicated_memory_info.image = VK_NULL_HANDLE;
21253
21254 VkMemoryAllocateInfo memory_info = {};
21255 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21256 memory_info.pNext = &dedicated_memory_info;
21257 memory_info.allocationSize = memory_reqs.size;
21258
21259 bool pass;
21260 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
21261 ASSERT_TRUE(pass);
21262
21263 VkDeviceMemory buffer_memory;
21264 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
21265 ASSERT_VK_SUCCESS(err);
21266
21267 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
21268 ASSERT_VK_SUCCESS(err);
21269
21270 vkDestroyBuffer(m_device->device(), buffer, NULL);
21271 vkFreeMemory(m_device->device(), buffer_memory, NULL);
21272
21273 m_errorMonitor->VerifyNotFound();
21274 }
21275}
21276
21277TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
21278 VkResult err;
21279
21280 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
21281
21282 ASSERT_NO_FATAL_FAILURE(InitState());
21283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21284
21285 std::vector<const char *> device_extension_names;
21286 auto features = m_device->phy().features();
21287 // Artificially disable support for non-solid fill modes
21288 features.fillModeNonSolid = false;
21289 // The sacrificial device object
21290 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
21291
21292 VkRenderpassObj render_pass(&test_device);
21293
21294 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
21295 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
21296 pipeline_layout_ci.setLayoutCount = 0;
21297 pipeline_layout_ci.pSetLayouts = NULL;
21298
21299 VkPipelineLayout pipeline_layout;
21300 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
21301 ASSERT_VK_SUCCESS(err);
21302
21303 VkPipelineRasterizationStateCreateInfo rs_ci = {};
21304 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
21305 rs_ci.pNext = nullptr;
21306 rs_ci.lineWidth = 1.0f;
21307 rs_ci.rasterizerDiscardEnable = true;
21308
21309 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
21310 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
21311
21312 // Set polygonMode=FILL. No error is expected
21313 m_errorMonitor->ExpectSuccess();
21314 {
21315 VkPipelineObj pipe(&test_device);
21316 pipe.AddShader(&vs);
21317 pipe.AddShader(&fs);
21318 pipe.AddColorAttachment();
21319 // Set polygonMode to a good value
21320 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
21321 pipe.SetRasterization(&rs_ci);
21322 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
21323 }
21324 m_errorMonitor->VerifyNotFound();
21325
21326 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
21327}
21328
21329TEST_F(VkPositiveLayerTest, ValidPushConstants) {
21330 VkResult err;
21331 ASSERT_NO_FATAL_FAILURE(InitState());
21332 ASSERT_NO_FATAL_FAILURE(InitViewport());
21333 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21334
21335 VkPipelineLayout pipeline_layout;
21336 VkPushConstantRange pc_range = {};
21337 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
21338 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
21339 pipeline_layout_ci.pushConstantRangeCount = 1;
21340 pipeline_layout_ci.pPushConstantRanges = &pc_range;
21341
21342 //
21343 // Check for invalid push constant ranges in pipeline layouts.
21344 //
21345 struct PipelineLayoutTestCase {
21346 VkPushConstantRange const range;
21347 char const *msg;
21348 };
21349
21350 // Check for overlapping ranges
21351 const uint32_t ranges_per_test = 5;
21352 struct OverlappingRangeTestCase {
21353 VkPushConstantRange const ranges[ranges_per_test];
21354 char const *msg;
21355 };
21356
21357 // Run some positive tests to make sure overlap checking in the layer is OK
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021358 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos = {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
21359 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
21360 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
21361 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
21362 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
21363 ""},
21364 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
21365 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
21366 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
21367 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
21368 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
21369 ""}}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021370 for (const auto &iter : overlapping_range_tests_pos) {
21371 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
21372 m_errorMonitor->ExpectSuccess();
21373 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
21374 m_errorMonitor->VerifyNotFound();
21375 if (VK_SUCCESS == err) {
21376 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
21377 }
21378 }
21379
21380 //
21381 // CmdPushConstants tests
21382 //
21383 const uint8_t dummy_values[100] = {};
21384
Tony Barbour552f6c02016-12-21 14:34:07 -070021385 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021386
21387 // positive overlapping range tests with cmd
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021388 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
21389 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
21390 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
21391 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
21392 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
21393 }};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021394
21395 // Setup ranges: [0,16) [20,36) [36,44) [44,52) [56,80) [80,92)
21396 const VkPushConstantRange pc_range4[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021397 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
21398 {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 -060021399 };
21400
21401 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range4) / sizeof(VkPushConstantRange);
21402 pipeline_layout_ci.pPushConstantRanges = pc_range4;
21403 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
21404 ASSERT_VK_SUCCESS(err);
21405 for (const auto &iter : cmd_overlap_tests_pos) {
21406 m_errorMonitor->ExpectSuccess();
21407 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021408 iter.range.size, dummy_values);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021409 m_errorMonitor->VerifyNotFound();
21410 }
21411 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
21412
Tony Barbour552f6c02016-12-21 14:34:07 -070021413 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021414}
21415
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021416#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021417TEST_F(VkPositiveLayerTest, LongFenceChain)
21418{
21419 m_errorMonitor->ExpectSuccess();
21420
21421 ASSERT_NO_FATAL_FAILURE(InitState());
21422 VkResult err;
21423
21424 std::vector<VkFence> fences;
21425
21426 const int chainLength = 32768;
21427
21428 for (int i = 0; i < chainLength; i++) {
21429 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
21430 VkFence fence;
21431 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
21432 ASSERT_VK_SUCCESS(err);
21433
21434 fences.push_back(fence);
21435
21436 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
21437 0, nullptr, 0, nullptr };
21438 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
21439 ASSERT_VK_SUCCESS(err);
21440
21441 }
21442
21443 // BOOM, stack overflow.
21444 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
21445
21446 for (auto fence : fences)
21447 vkDestroyFence(m_device->device(), fence, nullptr);
21448
21449 m_errorMonitor->VerifyNotFound();
21450}
21451#endif
21452
Cody Northrop1242dfd2016-07-13 17:24:59 -060021453#if defined(ANDROID) && defined(VALIDATION_APK)
21454static bool initialized = false;
21455static bool active = false;
21456
21457// Convert Intents to argv
21458// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021459std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021460 std::vector<std::string> args;
21461 JavaVM &vm = *app.activity->vm;
21462 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021463 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060021464
21465 JNIEnv &env = *p_env;
21466 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021467 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060021468 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021469 jmethodID get_string_extra_method =
21470 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060021471 jvalue get_string_extra_args;
21472 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021473 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060021474
21475 std::string args_str;
21476 if (extra_str) {
21477 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
21478 args_str = extra_utf;
21479 env.ReleaseStringUTFChars(extra_str, extra_utf);
21480 env.DeleteLocalRef(extra_str);
21481 }
21482
21483 env.DeleteLocalRef(get_string_extra_args.l);
21484 env.DeleteLocalRef(intent);
21485 vm.DetachCurrentThread();
21486
21487 // split args_str
21488 std::stringstream ss(args_str);
21489 std::string arg;
21490 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021491 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021492 }
21493
21494 return args;
21495}
21496
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021497static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021498
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021499static void processCommand(struct android_app *app, int32_t cmd) {
21500 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021501 case APP_CMD_INIT_WINDOW: {
21502 if (app->window) {
21503 initialized = true;
21504 }
21505 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060021506 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021507 case APP_CMD_GAINED_FOCUS: {
21508 active = true;
21509 break;
21510 }
21511 case APP_CMD_LOST_FOCUS: {
21512 active = false;
21513 break;
21514 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021515 }
21516}
21517
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021518void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021519 app_dummy();
21520
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021521 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060021522
21523 int vulkanSupport = InitVulkan();
21524 if (vulkanSupport == 0) {
21525 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
21526 return;
21527 }
21528
21529 app->onAppCmd = processCommand;
21530 app->onInputEvent = processInput;
21531
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021532 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021533 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021534 struct android_poll_source *source;
21535 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060021536 if (source) {
21537 source->process(app, source);
21538 }
21539
21540 if (app->destroyRequested != 0) {
21541 VkTestFramework::Finish();
21542 return;
21543 }
21544 }
21545
21546 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021547 // Use the following key to send arguments to gtest, i.e.
21548 // --es args "--gtest_filter=-VkLayerTest.foo"
21549 const char key[] = "args";
21550 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021551
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021552 std::string filter = "";
21553 if (args.size() > 0) {
21554 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
21555 filter += args[0];
21556 } else {
21557 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
21558 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021559
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021560 int argc = 2;
21561 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
21562 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021563
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021564 // Route output to files until we can override the gtest output
21565 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
21566 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021567
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021568 ::testing::InitGoogleTest(&argc, argv);
21569 VkTestFramework::InitArgs(&argc, argv);
21570 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021571
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021572 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060021573
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021574 if (result != 0) {
21575 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
21576 } else {
21577 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
21578 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060021579
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021580 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060021581
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021582 fclose(stdout);
21583 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021584
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021585 ANativeActivity_finish(app->activity);
Cody Northrop1242dfd2016-07-13 17:24:59 -060021586
Mark Lobodzinskice751c62016-09-08 10:45:35 -060021587 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060021588 }
21589 }
21590}
21591#endif
21592
Tony Barbour300a6082015-04-07 13:44:53 -060021593int main(int argc, char **argv) {
21594 int result;
21595
Cody Northrop8e54a402016-03-08 22:25:52 -070021596#ifdef ANDROID
21597 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021598 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070021599#endif
21600
Tony Barbour300a6082015-04-07 13:44:53 -060021601 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060021602 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060021603
21604 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
21605
21606 result = RUN_ALL_TESTS();
21607
Tony Barbour6918cd52015-04-09 12:58:51 -060021608 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060021609 return result;
21610}